BBS水木清华站∶精华区

发信人: ruster (尘埃*星辰*领悟), 信区: Linux        
标  题: 第四章 系统配置(上) 
发信站: BBS 水木清华站 (Thu Dec 21 13:35:05 2000) 
 
 
 
第4章  系统配置 
   
  本章要点: 
   
  本章介绍如何对服务器的各种基本硬件(网络,打印机,硬盘)进行设置,以便构成 
一台能够工作的服务器系统,系统启动流程和硬盘分区等管理员必须精通的内容也在此 
章叙述。 
   
      本章具体包括以下内容。 
   
    系统启动的过程 
   
    TCP/IP网络协议的设置 
   
    编译自己定制的内核 
   
    硬盘分区 
   
    配置打印机 
   
    安装附加应用程序 
 
   
  这一章我们要详细的介绍基本系统的配置,特别是网络配置,在安装中我们已经看到 
了一些配置工具,但是这一章我们将主要地基于命令行和shell脚本,因为当你陷于灾难 
之中时,只有直接修改配置文件才是可靠的。为此,我们必须去研究系统启动脚本以及 
系统内核的配置,如果它让你感兴趣,那么很好,你会很快成为一个有经验的系统管理 
者;如果它让你感到痛苦,对不起,这就是生活—一个UNIX系统管理员必须懂得这些。 
   
  4.1 系统启动流程 
   
  成为一个职业的系统管理员的第一步是了解系统的启动脚本。许多人喜欢图形喝彩单 
的管理工具,例如SCO的scoadmin程序,或者Sun的admintool。另外的人习惯性地去查找 
/etc/network,/etc/defaultroute这样的文件。对此你必须理解,UNIX的风格并不是这 
样的。对于UNIX系统,一切东西都是可以被拆卸的,甚至系统内核也可以调整,每个厂 
商都在对它进行修改,对于Linux就尤其如此。如果你所知道的就是ScoAdmin或者netco 
nf程序,那么你永远也不会成为合格的系统管理员。UNIX不是NT,你必须了解它隐藏在 
系统内部的东西。 
   
  4.1.1 lilo和引导内核 
   
  当你给系统上电以后,经过一段冗长的自检过程,最后系统去读Linux的引导程序,并 
且显示出引导提示符: 
   
  lilo: 
   
  这个提示表示引导盘已经就绪。 
   
  lilo是linux 的引导管理程序,它和OS/2、NT的BootManager,以及许多人用的syste 
m commander的作用类似,当你在这个提示符下按下Tab键的时候,它会显示出当前可以 
引导的系统: 
   
  lilo: 
   
  dos smp  linux 
   
  实际上,lilo就是一小段引导程序,可以位于任何有可能用来引导系统的位置,但是 
通常我们把它放在硬盘的主引导区,这个概念对任何与病毒打过交道的用户都应该是非 
常熟悉的。系统自检完毕之后,就会从硬盘上读入主引导区的内容,于是,lilo接管了 
系统的控制权,可以引导Linux了。理论上,许多书籍建议你用软盘引导服务器以便避免 
可能的破坏,这倒是那种“教科书的解决方案”的一个典型。 
   
  你可以看到在上面显示出了多个系统名字,输入某一个名字引导相应的系统,lilo会 
自动选择对应的分区以及启动文件来启动系统。 
   
  与lilo决斗是系统管理员生活的一部分,硬盘可能会损坏,病毒可能更改了引导记录 
,错误地编译内核使系统报销,甚至一些愚蠢的反病毒程序也可能会使得lilo被破坏, 
这时你也许必须从DOS上引导,然后重新配置lilo。如何从DOS下启动Linux等一会再说, 
现在让我们把主要精力拿来对付lilo。 
   
  lilo的配置是靠编辑/etc/lilo.conf实现的,这个文件的规则很简单,举例来说,这 
是我的lilo文件: 
   
  [wanghy@openlab /etc]$ cat lilo.conf 
   
  boot=/dev/hda 
   
  install=/boot/boot.b 
   
  prompt 
   
  timeout=50 
   
  default=smp 
 
   
  image=/boot/bzImage 
   
          label=smp 
   
          read-only 
   
          append="mem=256M" 
   
          root=/dev/hda1 
 
   
  image=/boot/vmlinuz-2.2.12-20 
   
          label=linux 
   
          read-only 
   
          root=/dev/hda1                    
   
  other = /dev/hda3 
   
          label = dos 
   
          table = /dev/hda   
   
  首先是boot=/dev/hda,这表示你用的启动磁盘是第一个IDE硬盘(由于这个原因,通 
常你不能从从盘上启动Linux)。 
   
  接下来,install=/boot/boot.b将/boot.b表示要将/boot/boot.b文件的内容写到引导 
记录中。这个文件在安装Linux的时候就已经创建了。 
   
  prompt 
   
  timeout=50 
   
  default=smp 
   
  这两行表示系统启动时将会显示一个lilo:提示信息并等待5秒钟,注意timeout的单位 
是0.1秒。如果5秒钟之内没有输入系统的名字,那么缺省将引导标号为"smp"的系统。 
   
  接下来定义的是各个引导项目,首先定义了两个Linux引导项目,image=/root/bzIma 
ge这样的行定义了启动时使用的内核映像,接下来,label=smp定义了这个启动选择项的 
名字是smp。在下面的几行则是用bzImage启动系统时的一些附加参数: 
   
  read-only 
   
  使用只读方式连接文件系统,由于系统启动的时候要检测文件系统完整性,因此要使 
用这个选项,当系统启动后,启动脚本会自动将它切换为read-write模式。 
   
  append="mem=256M" 
   
  缺省下,Linux内核只使用64MB以下的内存空间,由于这个系统有256MB内存,必须用 
命令行直接通知内核,append后的内容就是启动时加给内核的命令行参数。必须注意, 
有时你需要把它写成mem=255M,原因是在许多系统上bios会占用部分存储空间,如果你 
没有把握,就从内存量中减去一。 
   
  root=/dev/hda1 
   
  当这个内核启动以后,用/dev/hda1文件系统作为本机文件系统的根。 
   
  接下来的段落的效果与刚才我们解释的一样,刚才定义了一个名叫"smp"的启动项,它 
启动Linux并且连结/dev/hda1文件系统,而从image=/boot/vmlinuz-2.2.12-20开始的段 
落则定义一个名叫“Linux"的选项,它使用/boot/vmlinuz-2.2.12-20作为内核映像,挂 
接/dev/hda1文件系统,但是只使用缺省的64MB内存。 
   
  再往下的段落 
   
  other=/dev/hda3 
   
    label=dos 
   
    table=/dev/hda 
   
  定义了一个名叫dos的启动项,这个启动项用来启动位于/dev/hda3上的MS-DOS分区。 
由于DOS不使用内核映像而是利用引导记录,系统必须能够找到分区表信息以便定位引导 
记录,table=/dev/hda表示系统的DOS类型的分区表在/dev/hda上。 
   
  当完成了lilo.conf的设置工作后,执行 
   
  /sbin/lilo 
   
  会出现这样的信息: 
   
  [openlab]# /sbin/lilo 
   
  Added smp * 
   
  Added linux      
   
  Added dos 
 
   
  *表示这个加入的项是缺省启动项。三行信息表示我们定义的三个启动项都已经被加入 
,以后再启动就可以使用新的启动定义了。 
   
  lilo还支持很多其他的定义,但是对于系统管理员来说,上面解释的已经足够了,想 
要了解进一步的内容,执行man lilo.conf。 
   
  前面提到了内核映像这个概念,Linux在编译内核时将内核做成压缩的二进制内存映像 
,启动中自动拷贝到内存中并解压,然后让核心代码接管系统。 
   
  核心代码得到系统的控制权之后,下一步需要检测系统设备并激活必须的设备,在这 
个过程中,一串初始化信息在屏幕上滚过: 
   
  Linux version 2.2.14 (root@openlab.asnc.edu.cn) (gcc version egcs-2.91.66  
199903 
   
  14/Linux (egcs-1.1.2 release)) #9 SMP Sat Jan 29 10:07:06 EST 2000 
   
  Intel MultiProcessor Specification v1.1 
   
      Virtual Wire compatibility mode. 
   
  OEM ID: MSI      Product ID: 440BX        APIC at: 0xFEE00000 
   
  Processor #0 Pentium(tm) Pro APIC version 17 
   
  Processor #1 Pentium(tm) Pro APIC version 17 
   
  I/O APIC #2 Version 17 at 0xFEC00000. 
   
  Processors: 2 
   
  mapped APIC to ffffe000 (fee00000) 
   
  mapped IOAPIC to ffffd000 (fec00000) 
   
  Detected 451033204 Hz processor. 
   
  Console: colour VGA+ 80x25 
   
  Calibrating delay loop... 448.92 BogoMIPS 
   
  Memory: 257700k/262144k available (1044k kernel code, 424k reserved, 2920k 
 data, 
   
   56k init) 
   
  Dentry hash table entries: 32768 (order 6, 256k) 
   
  Buffer cache hash table entries: 262144 (order 8, 1024k) 
   
  Page cache hash table entries: 65536 (order 6, 256k) 
   
  VFS: Diskquotas version dquot_6.4.0 initialized 
   
  Checking 386/387 coupling... OK, FPU using exception 16 error reporting. 
   
  Checking 'hlt' instruction... OK.       
   
  ............. 
   
  这个信息很长,几乎每个被初始化的设备都会显示一段讯息,从这里可以看出系统中 
那些设备已经开始工作,那些设备失败了。如果信息滚动过快,可以在启动完成之后用 
dmesg命令显示全部信息。 
   
  当需要直接在内核映像中启动的设备(这些设备是在编译内核时确定的)初始化完毕 
后,Linux连结在lilo.conf的root=行中定义的根文件系统,启动init进程(应该记得它 
是一切程序的最初启动者),寻找/etc/inittab文件并且进入运行级的设置。 
   
  4.1.2 运行级别和inittab 
   
  运行级的概念来自System V,运行级别将启动过程分成不同的集合,每个集合包含一 
组脚本,当init程序“切换运行级”到对应的级别时,相应的脚本就被触发,切换运行 
级可以通过执行init [级别号]完成。(比如,在Linux中,run level 6代表reboot,所 
以执行init 6就会引起系统重新启动) 
   
  运行级别的定义每种System V都不完全一样,只能通过直接读/etc/inittab来确定, 
下面是一个标准的Linux的/etc/inittab,注意这里解释的内容来自redhat,但是其他的 
版本也大同小异。我们将它分成若干段来解释,如同一般情况那样,用#开始的行是注释 
,而非注释行的语法是: 
   
  标号:运行级别:操作方式:命令 
   
   标号是这一行的标签,运行级别用于定义这一行应该用于那些级别,如果为空就定义 
为所有级别,操作方式可以是一些确定的字符串,代表如何执行后面的命令,而命令则 
给处在进入这一级别时执行的程序。 
   
  下面是它的内容: 
   
  # Default runlevel. The runlevels used by RHS are: 
   
  #   0 - halt (Do NOT set initdefault to this) 
   
  #   1 - Single user mode 
   
  #   2 - Multiuser, without NFS (The same as 3, if you do not have networki 
ng) 
   
  #   3 - Full multiuser mode 
   
  #   4 - unused 
   
  #   5 - X11 
   
  #   6 - reboot (Do NOT set initdefault to this) 
   
  #  
   
  上面的几行解释了缺省的运行级别定义: 
   
  停机,系统进入这一级别后关机; 
   
  单用户模式,在这个模式中只能从控制台操作计算机,网络和终端不启动,许多文件 
系统也没有连结; 
   
  多用户模式,但关闭了网络服务支持 
   
  完全的多用户模式,就是我们一般使用的模式 
   
  无定义 
   
  图形界面模式,系统切入这一运行级后自动启动X Window系统 
   
  重新启动 
 
   
  这些级别的定义是任意的,然而你最好不要修改它,尤其是level 0,1和6,因为许多 
程序都使用init 0之类的方式实现对系统的控制,其他的Linux发行版本可能会更改2-5 
的定义,你需要参考/etc/inittab才能判断到底那个级别是什么意思,不过一般来说0, 
1和6总是上面的定义。 
   
  下面开始才是真正的内容,首先系统必须定义缺省的运行级别: 
 
   
  id:3:initdefault: 
 
   
  initdefault关键字决定了缺省的运行级别,在这里是3,也就是在执行了公共的系统 
启动脚本之后,系统将会执行与级别3对应的那些行 
   
  # System initialization. 
   
  si::sysinit:/etc/rc.d/rc.sysinit 
   
  这里的sysinit关键字定义了公共的“系统初始化”脚本,在相应于运行级的地方是空 
,表示适用于所有运行级别。注意它将在系统进入任何运行级别以前完成,一会我们再 
研究这个脚本的内容。 
 
   
  l0:0:wait:/etc/rc.d/rc 0 
   
  l1:1:wait:/etc/rc.d/rc 1 
   
  l2:2:wait:/etc/rc.d/rc 2 
   
  l3:3:wait:/etc/rc.d/rc 3 
   
  l4:4:wait:/etc/rc.d/rc 4 
   
  l5:5:wait:/etc/rc.d/rc 5 
   
  l6:6:wait:/etc/rc.d/rc 6 
   
  这里开出了六个运行级别的定义,运行级0就去执行命令/etc/rc.d/rc 0,运行级1是 
/etc/rc.d/rc 1,.....诸如此类。wait关键字表示系统必须等待此命令执行完才能开始 
下一步工作。 
   
  # Things to run in every runlevel. 
   
  ud::once:/sbin/update 
   
  这又是一个适用于所有级别的命令。update命令实际是去启动updated守护进程,以便 
定期刷新内存中的超级块表。Once关键字说明这个项只被执行一次。 
   
  # Trap CTRL-ALT-DELETE 
   
  ca::ctrlaltdel:/sbin/shutdown -t3 -r now 
   
  ctrlaltdel定义当热启动组合键被触发时系统的行为,这里定义所有的运行级别对它 
的响应都是重新启动(shutdown –r) 
 
   
  pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down 

 
   
  pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled 

   
  这两行定义如何响应ups信息,如果系统掉电(powerfail),执行两分钟后关机的指令 
;如果关机之前电源恢复,取消关机操作。 
 
   
  # Run gettys in standard runlevels 
   
  1:2345:respawn:/sbin/mingetty tty1 
   
  2:2345:respawn:/sbin/mingetty tty2 
   
  3:2345:respawn:/sbin/mingetty tty3 
   
  4:2345:respawn:/sbin/mingetty tty4 
   
  5:2345:respawn:/sbin/mingetty tty5 
   
  6:2345:respawn:/sbin/mingetty tty6 
   
   2,3,4,5都是多用户级别,为系统开出6个虚拟屏幕(就是用Alt+Fn即获得虚拟屏幕) 
,respawn关键字表示这个动作在每次进入相应运行级别时都会执行。 
   
  # Run xdm in runlevel 5 
   
  # xdm is now a separate service 
   
  x:5:respawn:/etc/X11/prefdm -nodaemon 
   
  对于级别5,启动图形界面。 
   
  归纳一下,系统在读入inittab以后要做什么?设置Ctrl+Alt+Del响应,设置好对UPS 
的支持,然后应该执行/etc/rc.d/rc.sysinit,然后是/etc/rc.d/rc 3,最后是update 
和启动虚拟屏幕。显然,系统的主要初始化命令应该在/etc/rc.d/rc.sysinit和/etc/r 
c.d/rc 3中完成。 
   
  4.1.3 rc.d下的基本脚本 
 
   
  下面我们来研究启动脚本,这里的脚本来自redhat 6.1,因为这是个最为广泛使用的 
版本,其他的版本的特有问题将在下一节讨论。 
   
  首先,系统将执行/etc/rc.d/rc.sysinit,这是个shell脚本,你可以用普通的文本编 
辑工具对它进行处理,为了简便,我们只研究其中较为重要的部分或者较为典型的段落 
: 
   
  #!/bin/sh 
   

   
  # /etc/rc.d/rc.sysinit - run once at boot time 
   

   
  # Taken in part from Miquel van Smoorenburg's bcheckrc. 
   

 
   
  # Rerun ourselves through initlog 
   
  if [ -z "$IN_INITLOG" ]; then 
   
   [ -f /sbin/initlog ] && exec /sbin/initlog $INITLOG_ARGS -r /etc/rc.d/rc. 
sysinit 
   
  fi 
   
  首先,确定系统中是否存在/sbin/initlog文件,如果存在,那么需要记录初始化信息 
。 
   
  # Set the path 
   
  PATH=/bin:/sbin:/usr/bin:/usr/sbin 
   
  export PATH 
   
  设置缺省路径。 
   
  # Read in config data. 
   
  if [ -f /etc/sysconfig/network ]; then 
   
      . /etc/sysconfig/network 
   
  else 
   
      NETWORKING=no 
   
      HOSTNAME=localhost 
   
  fi 
   
  这一段是网络的参数设置,/etc/sysconfig/network的内容是这样: 
   
  NETWORKING=yes 
   
  FORWARD_IPV4="yes" 
   
  HOSTNAME="openlab.asnc.edu.cn" 
   
  GATEWAY="" 
   
  GATEWAYDEV=""     
   
  显然,如果这个文件存在,那么设置网络的运行参数,如域名,网关等等,这个文件 
中可以包含很多的东西。详细的内容我们在设置网络的部分介绍 
   
  # Source functions 
   
  . /etc/rc.d/init.d/functions 
 
   
  /etc/rc.d/init.d是所有的服务脚本存放的地方,而functions是各种服务脚本需要的 
一些参数的设置。有兴趣的话你可以看一看,不看也不影响什么。 
   
  以下有一段是设置一些显示信息,接下来是这样的内容: 
 
 
   
  # Mount /proc (done here so volume labels can work with fsck) 
 
   
  action "Mounting proc filesystem" mount -n -t proc /proc /proc 
 
   
  连结/proc文件系统,应该记得/proc是用来显示系统状态的虚拟文件系统,注意acti 
on命令的语法,它显示一段提示信息,然后去执行相应的命令。 
   
  然后的段落有一点意思: 
 
   
  # Turn off sysrq 
   
  #if [ "$MAGIC_SYSRQ" = "no" ]; then 
   
  # echo "0" > /proc/sys/kernel/sysrq 
   
  #fi 
 
   
  $MAGIC_SYSRQ=no意味着你决定不使用内核调试,脚本必须把系统的内核调试功能关闭 
,注意接下来的处理方法,在/proc/sys/kernel下建立一个名叫sysrq的文件,并且设置 
其内容为"0",就关闭了这项功能,这也是在运行中打开或者关闭内核的某个功能的标准 
方法,以后我们会经常看到这样的例子。 
   
  接下来要设置时钟和键盘映射表,装入系统字体,又是一段冗长的代码,这里将它省 
略,反正你总可以在自己的系统上看到他们。 
 
   
  # Start up swapping. 
   
  action "Activating swap partitions" swapon -a 
 
   
  swapon –a 将读/etc/fstab文件,这个文件中包含有系统中存在的应该自动挂接的各 
种文件系统的列表,同时也包含了关于交换分区的知识,swapon –a将启动其中标注的 
所有交换分区。 
   
  # Set the hostname. 
   
  action "Setting hostname ${HOSTNAME}" hostname ${HOSTNAME} 
 
   
  # Set the NIS domain name 
   
  if [ -n "$NISDOMAIN" ]; then 
   
      action "Setting NIS domain name $NISDOMAIN" domainname $NISDOMAIN 
   
  else 
   
      domainname "" 
   
  fi 
   
  这两段设置系统名字,我们应该记得$HOSTNAME已经在/etc/sysconfig/network文件中 
设置过,所以这里的action被执行,而$NISDOMAIN现在是空字符串,所以执行后hostna 
me被设置而NIS域名不存在。 
   
  if [ -f /fsckoptions ]; then 
   
   fsckoptions=`cat /fsckoptions` 
   
      else 
   
   fsckoptions= 
   
  fi 
 
   
  if [ -f /forcefsck ]; then 
   
   fsckoptions="-f $fsckoptions" 
   
  fi 
   
  这里是与管理员相关的行了。如果系统的/下将存在/forcefsck文件,于是系统自动启 
动fsck程序去检查文件系统是否有错误。接下来是一段关于是否存在/fastboot文件的判 
断,与其大同小异,然后系统将会决定是否启用PNP,方法和处理MAGIC_SYSRQ是类似的 
,这两段我们不讨论了,你可以自己看一下。 
 
   
  # Remount the root filesystem read-write. 
   
  action "Remounting root filesystem in read-write mode" mount -n -o remount 
,rw / 
 
   
  # Add /proc to /etc/mtab 
   
  mount -f -t proc /proc /proc 
   
  检测根文件系统完毕后,系统重新将/连结成读写方式,并且将/proc加入到/etc/mta 
b中。下面是非常重要的一步,如果系统内核支持可装载模块,需要把$USEMODULES变量 
设置成"y"并且设置模块的缺省路径,参数等等,然后,系统开始装入模块: 
 
   
  # load sound modules 
   
  if [ -n "$USEMODULES" ]; then 
   
     if grep -s -q "^alias sound " /etc/conf.modules ; then 
   
        action "Loading sound module" modprobe sound 
   
     fi 
   
   ......... 
   
  fi 
   
  ........... 
   
  当这些直接装入的模块结束后,为了和以前的方式兼容,也为了管理员的方便,这个 
脚本试图去寻找/etc/rc.d/rc.modules,如果存在就执行它: 
   
  # Load modules (for backward compatibility with VARs) 
   
  if [ -f /etc/rc.d/rc.modules ]; then 
   
   /etc/rc.d/rc.modules 
   
  fi 
   
  显然,你可以将自己的模块初始化命令加入/etc/rc.d/rc.modules使它在启动时得到 
运行。 
   
  完成主要模块的装入后,系统将开始一系列日常工作,如检测有问题的文件系统,连 
结所有本地文件系统,启动磁盘限额等等,如果系统还没有被配置,那么将启动配置脚 
本,设置网络,超级用户口令等等,否则,对于已经配置好的系统,清理记账文件,准 
备进行系统工作。 
   
  当一切都完成之后,系统按照inittab的设定,进入运行级3,执行/etc/rc.d/rc 3。 
   
  /etc/rc.d/rc是一个很有意思的程序,它是一个shell脚本,其行为是这样:根据提供 
给它的参数,它去寻找相应的目录rc${arg1}.d,例如,在/etc/rc.d/rc 3执行时,它去 
查询/etc/rc.d/rc3.d下的所有文件,试图执行那些所有用S或K打头的脚本,凡是用S开 
头的脚本,它给加上一个start参数,凡是用K打头的脚本,加上一个stop参数。执行次 
序是按照S或K后跟的数值顺序。 
   
  例如,在现在的例子中,/etc/rc.d/rc 3下存在一个S50inet的脚本,于是 rc 脚本去 
执行S50inet start。而S50inet其实是到/etc/rc.d/init.d/inet的一个符号连结,其内 
容是(这里只给出了部分内容): 
   
  . /etc/rc.d/init.d/functions 
   
  . /etc/sysconfig/network 
   
  if [ ${NETWORKING} = "no" ] 
   
  then 
   
   exit 0 
   
  fi 
 
   
  [ -f /usr/sbin/inetd ] || exit 0 
   
  RETVAL=0 
 
   
  # See how we were called. 
   
  case "$1" in 
   
    start) 
   
   echo -n "Starting INET services: " 
   
   daemon inetd 
   
   RETVAL=$? 
 
   
   echo 
   
   [ $RETVAL -eq 0 ] && touch /var/lock/subsys/inet 
   
   ;; 
   
    stop) 
   
   echo -n "Stopping INET services: " 
   
   killproc inetd 
   
   RETVAL=$? 
 
   
   echo 
   
   [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/inet 
   
   ;; 
   
    *) 
   
   echo "Usage: inet {start|stop|status|restart|reload}" 
   
   exit 1 
   
  esac 
 
   
  exit $REVAL 
 
 
   
  daemon和killproc是在/etc/rc.d/init.d/functions里面定义的函数,daemon将命令 
当成守护进程执行,killproc则杀掉对应进程。显然,S50inet start的结果是inetd程 
序被启动为一个守护进程。 
   
  这里的方法是启动服务进程的标准模式,例如你要设置某个服务在runlevel 3被启动 
,那么你可以自己写一个脚本,比如说mydaemon,让mydaemon start启动服务,mydaem 
on stop停止服务,然后将这个脚本复制到/etc/rc.d/init.d中,接着在/etc/rc.d/rc? 
.d中建立连接,在rc3.d中连结为S65mydaemon,而在其他目录中为K65mydaemon,这样你 
的脚本就会在进入和退出运行级3时自动处理了。 
   
  除此与run level相关的启动指令之外,Linux还从BSD中引入了另外一些配置文件,其 
中最重要的是/etc/rc.d/rc.local,通常它在执行了全部运行级脚本以后运行,你可以 
在这里定制自己的设置,如欢迎信息等等。  
 
   
  4.1.4 版本之间的区别 
   
  如同我们看到的那样,Redhat的启动脚本看上去井井有条,要寻找某个功能很容易, 
但是要寻找某个命令在何处启动就显得比较困难,经常需要从/etc/inittab开始。 
   
  Turbo Linux和Red-Flag的脚本和Redhat颇为相似,尤其是红旗几乎就是RedHat的中文 
版,它们的配置也相当近似。 
   
  Slackware的启动脚本使用另外一种风格,实际上,看上去很象BSD系列。启动脚本也 
在/etc/rc.d下面,但是它把一些在大部分运行级别必须使用的脚本做在了一起,冠以r 
c.modules,rc.inet1,rc.inet2等等的名字,这样对于手工配置系统确实简单的多,不 
过这些文件都相当大,看起来需要耐心。对于这个系统,你只要看一遍/etc/inittab就 
能掌握它的配置文件位置了。 
   
  Debian/Corel使用一种有趣的方式,看上去颇像Sun的Solaris。实际上,它和RedHat 
的方式几乎是一样的,但是启动脚本不是在/etc/rc.d,而是直接位于/etc下,例如/et 
c/rc1.d,/etc/rc2.d等等,知道了这一点之后,配置debian就不会感到困难了。 
   
  关于Corel Linux我们应该特别地说一句,它的配置文件组织看起来要比RedHat简单一 
些,但是它没有类似于rc.modules的设定,等价于rc.sysinit的文件是/etc/init.d/rc 
S。它的运行级别定义也比较怪异,好像Run Level 2是正常的图形模式,要配置Corel, 
最好是从/etc/inittab直接开始。无论如何,我们不会建议一个新手使用corel Linux。 
   
  4.2 网络配置 
   
  下面我们要开始研究网络的配置脚本了,这个部分有许多很简单的地方,也有很讨厌 
的问题,原因经常来自内核的一些设定。无论如何,在研究这里描述的东西时,最好使 
用发行盘上带的内核,并且确认你的内核版本是2.2或者更高版本。通常发行盘上的版本 
总是带有网络支持的。 
   
  我们假定你已经在上一节中知道了启动脚本在哪里,下面就可以开始了。 
   
  4.2.1 配置网卡 
   
  Linux对网卡的支持需要通过内核,早期,许多人使用编译时直接加入网卡支持的办法 
,不过随着网卡种类的增加,已经很少有人使用这种吃力不讨好的办法了。现在,大部 
分人都采用加入网卡模块的方法来驱动网卡。 
   
  为了加入网卡,首先必须知道网卡的类型,Linux对那些破破烂烂的“NE 2000兼容” 
的网卡的支持倒确实是不错的,但是对于百兆的网卡就不太好说了,反正你总可以通过 
实验选出合适的产品。 
   
  首先得一条是了解网卡的芯片型号,由于硬件厂商通常不会提供网卡的Linux驱动程序 
,你必须自己为网卡选择正确的驱动程序。许多人喜欢说“啊,就是D-Link的”,这种 
说法大概是在Linux中你能听到的最令人愤怒的说法了,跟那个著名的“在空中”的回答 
差不多,绝对正确而绝对毫无意义。 
   
  你可以首先看看你的网卡属于哪一个类型,如果是3COM 3C系列的“骨灰级”产品,你 
根本不需要进一步了解型号,Linux中肯定会有对应的驱动程序。到/lib/modules/x.x. 
xx/net 下(x.x.xx是里Linux内核的版本号)看一看,确定一下到底应该使用那一个驱动 
程序。例如,3C509的驱动程序就是3c509.o 
   
  如果是ne2000 兼容型,那么一般来说只要使用ne2000的驱动程序就可以了,这个驱动 
程序的名字是ne.o,另外还有许多10兆的PCI网卡属于"NE2000-PCI"兼容类型,对应的驱 
动程序名字是ne2k-pci.o。 
   
  如果都不是,那么你就需要猜测一种合适的网卡型号了,网卡的主控芯片(通常是最 
大的一块)上面会标出芯片的型号,然后到/lib/modules/2.2.14/net(我使用2.2.14的 
内核,你的内核版本可能会不一样)下看一看,找到合适的驱动程序名字。 
   
  下一步是对网卡进行测试,例如,我的网卡驱动程序是rtl8139.o,是一块PCI的100M 
网卡,因此执行 
   
  /sbin/modprobe rtl8139 
   
  路径名/lib/modules/2.2.14/net和扩展名.o可以省略。 
   
  在我们这个情况下,这个命令直接返回,不产生任何输出,表示这个模块已经正确地 
装入内核存储区。如果你想确定一下,你可以用dmesg命令看一下内核输出,会有这样的 
内容: 
   
  rtl8139.c:v1.07 5/6/99 Donald Becker http://cesdis.gsfc.nasa.gov/linux/dri 
vers/r 
   
  tl8139.html 
   
  eth0: RealTek RTL8139 Fast Ethernet at 0xd800, IRQ 19, 00:50:ba:d0:8d:ec. 
   
  这表示网卡已经被激活了。 
   
  有些ISA网卡(特别是ne2000兼容网卡)需要显式给出一些配置参数,例如,要激活n 
e2000兼容网卡,需要给出I/O地址,可以使用这样的形式: 
   
  /sbin/modprobe ne io=0x300 
   
  这里假定ne2000兼容网卡位于I/O地址0x300处。IRQ不需要指定,Linux会给出正确的 
值。 
   
  对于特定的网卡,具体的参数格式可以参考驱动程序的源代码。 
   
  假如网卡驱动程序不对或者参数有问题,就会显示出错信息: 
   
  [openlab]# /sbin/modprobe 3c509 
   
  /lib/modules/2.2.14/net/3c509.o: init_module: Device or resource busy 
   
  在某些系统中,使用/etc/conf.modules文件来设置网卡的缺省参数,例如: 
   
  $cat conf.modules 
   
  alias eth0 ne 
   
  options ne io=0x300 
   
  options 命令为模块提供缺省参数。以后只要执行/sbin/modprobe ne或者/sbin/mod 
probe eth0就可以自动使用参数了。 
   
  假设你通过上面的过程已经确定了网卡驱动程序,测试也正确,那么你就应该把它放 
到系统启动脚本中去。前面我们已经提到过,对于RedHat或者Slackware,用户自选的模 
块文件通常可以放在/etc/rc.d/rc.modules中,内容就是简单的写上上面用来加载模块 
的命令,例如,我的系统中有两片网卡,分别使用rtl8139和ne2000驱动程序,ne2000兼 
容网卡的I/O地址是0x300,那么,rc.modules的内容就是 
   
  [openlab]# cat /etc/rc.d/rc.modules 
   
  /sbin/modprobe rtl8139 
   
  /sbin/modprobe ne io=0x300 
   
  不要忘了设置这个脚本的可执行属性。当系统重新启动时,它会自动执行这个脚本, 
你可以在系统启动之后用dmesg看看执行是否正确。如果你的Linux启动脚本并不使用rc 
.modules,你总可以把它放到rc.sysinit或者rcS里面去。 
 
   
  4.2.2 TCP/IP的启动 
   
  每当装入一个网卡驱动模块,系统会为它分配一个设备名字,命名规则是:第一个以 
太网卡是eth0,第二个是eth1,....以此类推。分配可以用dmesg命令显示,例如: 
   
  rtl8139.c:v1.07 5/6/99 Donald Becker http://cesdis.gsfc.nasa.gov/linux/dri 
vers/r 
   
  tl8139.html 
   
  eth0: RealTek RTL8139 Fast Ethernet at 0xd800, IRQ 19, 00:50:ba:d0:8d:ec. 
   
  表明rtl8139的设备名字是eth0,MAC地址是十六进制0050bad08dec。 
   
  下面需要为设备分配IP地址和网络广播地址以便启动TCP/IP。这要使用ifconfig命令 
,其语法是 
   
  ifconfig [设备名]  [IP地址]  netmask  [网络掩码] broadcast [广播地址] .... 
   
  例如,要为eth0分配ip地址202.199.248.145,掩码为255.255.255.0,广播地址是20 
2.199.248.255,那么命令是 
   
  /sbin/ifconfig eth0 202.199.248.145 netmask 255.255.255.0 broadcast 202.19 
9.248.255 
   
  同样的方式可以用来配置eth1,eth2,等等,通常netmask和broadcast只要设置一个 
就可以了。 
   
  不带参数的ifconfig命令可以显示当前启动的网络接口: 
   
  [openlab]# ifconfig 
   
  eth0      Link encap:Ethernet  HWaddr 00:50:BA:D0:8D:EC 
   
            inet addr:202.199.248.6  Bcast:202.199.248.255  Mask:255.255.255 
.0 
   
            UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1 
   
            RX packets:1930 errors:0 dropped:0 overruns:0 frame:0 
   
            TX packets:841 errors:0 dropped:0 overruns:0 carrier:0 
   
            collisions:1 txqueuelen:100 
   
            Interrupt:19 Base address:0xd800 
 
   
  lo        Link encap:Local Loopback 
   
            inet addr:127.0.0.1  Mask:255.0.0.0 
   
            UP LOOPBACK RUNNING  MTU:3924  Metric:1 
   
            RX packets:0 errors:0 dropped:0 overruns:0 frame:0 
   
            TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 
   
            collisions:0 txqueuelen:0 
   
  lo是look-back网络接口,从IP地址127.0.0.1就可以看出,它代表“本机”。无论系 
统是否接入网络,这个设备总是存在的,除非你在内核编译的时候禁止了网络支持。 
   
  如果你只是关心某个设备是否正常,可以在ifconfig后面加上接口名字: 
   
  [openlab]# ifconfig eth0 
   
  eth0      Link encap:Ethernet  HWaddr 00:50:BA:D0:8D:EC 
   
            inet addr:202.199.248.6  Bcast:202.199.248.255  Mask:255.255.255 
.0 
   
            UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1 
   
            RX packets:2284 errors:0 dropped:0 overruns:0 frame:0 
   
            TX packets:889 errors:0 dropped:0 overruns:0 carrier:0 
   
            collisions:1 txqueuelen:100 
   
            Interrupt:19 Base address:0xd800 
   
  表示eth0设备已经正常工作。 
   
  有时需要为某个设备接口配置多个IP地址,办法是使用设备别名,例如,eth0设备可 
以有eth0,eth0:0,eth0:1....多个别名,每个都可以有一个独立的IP地址: 
   
  ifconfig eth0 202.199.248.2 netmask 255.255.255.0 broadcast 202.199.248.25 

   
  ifconfig eth0:0 202.199.248.3 netmask 255.255.255.0 broadcast 202.199.248. 
255 
   
  这样,202.199.248.2和202.199.248.3都会被绑定在eth0设备上,使用同样的网络设 
备,不同的IP地址。 
   
  如果你要暂停某个网络接口的工作,使用down参数: 
   
  ifconfig eth0 down 
   
  将取消eth0网络接口。与之对应的是有一个参数up,不过由于是缺省值,所以从来不 
用。 
   
  4.2.3 协议和路由配置 
   
  配置了网络接口之后,通常本地网络就可以通信了,通过ping命令可以显示子网内能 
否相互访问: 
   
  [openlab]# ping 202.199.248.1 
   
  PING 202.199.248.1 (202.199.248.1) from 202.199.248.6 : 56(84) bytes of da 
ta. 
   
  64 bytes from 202.199.248.1: icmp_seq=0 ttl=255 time=0.9 ms 
   
  64 bytes from 202.199.248.1: icmp_seq=1 ttl=255 time=0.9 ms 
   
  64 bytes from 202.199.248.1: icmp_seq=2 ttl=255 time=0.8 ms 
   
  64 bytes from 202.199.248.1: icmp_seq=3 ttl=255 time=0.8 ms 
   
  64 bytes from 202.199.248.1: icmp_seq=4 ttl=255 time=0.8 ms 
   
  64 bytes from 202.199.248.1: icmp_seq=5 ttl=255 time=0.8 ms 
   
  ?--- 202.199.248.1 ping statistics --- 
   
  6 packets transmitted, 6 packets received, 0% packet loss 
   
  round-trip min/avg/max = 0.8/0.8/0.9 ms 
   
  注意ping命令会反复试验直到你按下^C为止,上面的信息说明本地网的相互通信已经 
正常了。但是如果你现在ping子网外面的机器,就会得到一个“网络不可达”的信息, 
因为还没有设置路由: 
   
  [openlab]# ping 202.112.58.200 
   
  connect: Network is unreachable 
   
  路由路径的设置是由route命令完成的,通常,你用ifconfig命令启动一个网络接口的 
时候会启动一个子网内的路由,这可以用route命令显示出来: 
   
  [openlab]# route 
   
  Kernel IP routing table 
   
  Destination     Gateway         Genmask         Flags Metric Ref    Use If 
ace 
   
  202.199.248.0   *               255.255.255.0   U     0      0        0 et 
h0 
   
  127.0.0.0       *               255.0.0.0       U     0      0        0 lo 
   
  这两行表示目标地址在C类网202.199.248.0(也就是,202.199.248.0到202.199.248. 
255)中的数据包要送到eth0设备去广播,而目标为A类地址127.0.0.0的数据包直接送到 
lo接口。 
   
  那么,下一步需要给出目标地址不在这个子网内的数据包的递送地址,route命令可以 
用来加入这种静态递送路径: 
   
  route [add/del] [-net/-host] [目标地址] [gw] 网关地址或者 
   
  route [add/del] default gw [网关地址] 
   
  route [add/del] –net [子网地址] dev [网络接口] 
   
  add/del表示在路由表中增加还是删除一条路径,而-net或者-host则表示投递的目标 
地址是一个地址还是一个网络,如果是网络的话,可以使用netmask参数。gw后边跟路由 
器地址。例如,要把目标地址是202.118.x.x的数据包通过202.199.248.1路由出去,使 
用 
   
  route add –net 202.118.0.0 netmask 255.255.0.0 gw 202.199.248.1 
   
  如果要撤销这个路由路径,照样重敲一遍并且使用del替换add: 
   
  route del -net 202.118.0.0 netmask 255.255.0.0 gw 202.199.248.1 
   
  当然,实际上,大部分比较小的网络使用缺省路由,即“除了本地地址,全都投递到 
路由器”,这可以使用default参数来完成,例如,我们的缺省路由器是202.199.248.1 
,那么,使用命令 
   
  route add default gw 202.199.248.1 
   
  有时也需要设定对某个主机的确定路由路径,这可以把-net选项换成-host,另外主机 
地址不能使用掩码,其他和上面说的一样。route命令还有一个特殊的参数metric,用来 
设置路由器的缺省跳数,不过事实上没有人用。 
   
  route的最后一个常用参数是dev,用于设定设备接口,这个功能一般用在你有多片网 
卡的时候。例如,要强制让所有目标地址是202.199.248.0的包通过eth0送出,使用 
   
  route add –net 202.199.248.0 netmask 255.255.255.0 dev eth0 
   
  最后可以用route和ping命令检测一下是否正确: 
   
  [openlab]# route 
   
  Kernel IP routing table 
   
  Destination     Gateway         Genmask         Flags Metric Ref    Use If 
ace 
   
  202.199.248.0   *               255.255.255.0   U     0      0        0 et 
h0 
   
  127.0.0.0       *               255.0.0.0       U     0      0        0 lo 
   
  default         router.asnc.edu 0.0.0.0         UG    0      0        0 et 
h0 
   
  [openlab]# ping 202.112.58.200 
   
  PING 202.112.58.200 (202.112.58.200) from 202.199.248.6 : 56(84) bytes of  
data. 
   
  64 bytes from 202.112.58.200: icmp_seq=0 ttl=247 time=586.0 ms 
   
  64 bytes from 202.112.58.200: icmp_seq=1 ttl=246 time=562.2 ms 
   
  64 bytes from 202.112.58.200: icmp_seq=2 ttl=246 time=617.6 ms 
   
  ?--- 202.112.58.200 ping statistics --- 
   
  4 packets transmitted, 3 packets received, 25% packet loss 
   
  round-trip min/avg/max = 562.2/588.6/617.6 ms 
   
  一般来说,经过这样的配置之后,Linux系统已经可以使用网络了。但是,域名系统需 
要额外配置,我们这里不涉及DNS Server,相反,假定你已经有了一个可以使用的域名 
服务器,并且知道它的IP地址,那么,你需要修改一个文件,即/etc/resolv.conf,这 
个文件用于寻找正确的DNS服务器地址: 
   
  [openlab]# cat /etc/resolv.conf 
   
  search asnc.edu.cn 
   
  nameserver 202.199.248.2 
   
  search子句定义了缺省的域名后缀,例如,现在这个配置中,当你输入ping myhost时 
,系统自动将myhost解释成myhost.asnc.edu.cn。nameserver子句给出名字服务器的IP 
地址,可以有多个nameserver子句。 
   
  接下来是/etc/host.conf和/etc/nsswitch.conf两个文件,这两个文件定义名字解析 
的顺序。需要指出的是不同的Linux内核可能使用不同的定义,有的使用/etc/host.con 
f,有的使用/etc/nsswitch.conf,没有确定的标准,目前的版本主要是使用/etc/nssw 
itch.conf。一般系统安装后这两个文件的内容已经是正确的,不过为了完整,这里解释 
一下:/etc/host.conf的内容是 
   
  order hosts,bind 
   
  multi on 
   
  第一个order子句用于说明域名的搜索顺序,hosts其实就是/etc/hosts文件的内容, 
这个文件用来定义某些需要在启动时使用的地址,例如,一个典型的/etc/hosts文件的 
内容是 
   
  [openlab]# cat /etc/hosts 
   
  202.199.248.6   localhost.localdomain   localhost 
   
  202.199.249.2   openlab.asnc.edu.cn     openlab 
   
  202.199.248.5   solaris7.asnc.edu.cn    solaris7 
   
  202.199.248.149 tvt.asnc.edu.cn tvt 
   
  每一行定义了一个ip地址、主机名和别名。 
   
  bind指代一个dns服务。连起来的意思就是先查找本地/etc/hosts文件,然后再查询D 
NS服务器。 
   
  multi on的含义是允许一个名字有多个ip。 
   
  /etc/nsswitch.conf文件比较长,你在其中应该能看到类似这样的行: 
   
  hosts:files dns 
   
  这一行的效果和/etc/host.conf里的order hosts,bind是类似的。 
   
  现在你有了一个可以使用网络的系统了,但是除了resolv.conf和host.conf/nsswitc 
h.conf之外,这些内容并没有被记忆下来,而是一旦重起就会丢失,因此,很自然的想 
法是把相关的命令放到启动脚本中,一开机就自动执行。往系统的缺省运行级目录里写 
一个脚本是不错的主意,或者写在rc.inet1,rc.sysinit等等地方,但是,如果喜欢有 
序,你可以看看基于菜单的配置工具。 
   
  4.2.4 配置工具 
   
  实际上,前面的两节已经包含了配置网络所需要的主要知识。对于slackware,这可能 
就是你需要的全部知识,只要把合适的命令加入/etc/rc.d/rc.inet1里面就可以了。不 
过,现在的Linux发行版本往往提供了配置工具,特别是网络配置工具,另外,象redha 
t使用许多个脚本分散在各个目录下面的办法,编辑起来可能是相当累人的,因此,了解 
一些配置工具可能也是必要的。不过要记住,配置工具所做的,无非就是把你用手工完 
成的编辑工作自动化而已,而且它们往往依赖于“某个文件在什么地方”的假设,所以 
它们可能会工作不正确。而且,许多Linux发行版本并不包含这些工具,比如slackware 
和corel Linux。不管怎么说,如果你不喜欢配置工具,你可以把网络的启动命令加到/ 
etc/rc.d/rc.sysinit或者/etc/rc.d/rc.local里面,或是干脆修改inittab。 
   
  配置工具有好几种,最常见的就是类似于控制中心的东西,例如linuxconf程序和YaS 
T程序,两者都很常用,你可以看看你的系统上有没有这两个命令。另外就是专门用于网 
络的配置工具。实际上,linuxconf也是去调用这种配置工具。 
   
  最常用的网络配置工具是netconf程序,这是个很有用有时也很讨厌的程序。它包含在 
RedHat(及一切派生系统,如RedFlag,Xteam等等)和Turbo Linux中,可以直接以超级 
用户输入/bin/netconf来执行,根据是终端还是图形方式,它会有不同的界面,不过其 
内容和用法都是一样的,这里使用终端界面为例子: 
 
   
  
   
  图4.1 netconf配置工具 
   
  在Basic host information中的选项是基本的信息,按下回车键得到:  
   
  图4-2 网络接口设置 
   
  每一个网卡用一个Adapter表示,检查框内容为"X"是允许的状态,其他各项的意思对 
于理解了我们上面说的内容的读者应该是十分简单的。按下Accept或者Cancel可以返回 
到上一屏。 
   
  在Name Server Specification中按下回车进入DNS设置屏幕: 
   
  
   
  图4.3 DNS配置 
   
  注意第一栏DNS is required.....前面的选择,这个检查框当前被设置为X,表示肯定 
的状态,这个选择表示当其他机器通过网络存取这台计算机时,本机将首先询问存取者 
的DNS名字,如果没有,就要等待到DNS超时为止,这个选项有时很讨厌,你会看到当te 
lnet到这台机器上时可能会等待相当长的一段时间,然后才能连接成功,如果它使你困 
扰,你可以禁止它。 
   
  在主选单的 Routing & gateways选项中按下回车,出现路由选择屏幕,在我们的这个 
阶段,主要是设置缺省路由,在路由选择屏幕的Set   Defaults选项中按下回车键,出 
现设置缺省路由的屏幕: 
   
  
   
  图4.4 路由配置 
   
  输入你的缺省路由,接受并返回。 
   
  主界面的另一个选择项是Host name search path,它实际是设定/etc/host.conf文件 
,不过如同我们说的,现在的系统常常使用/etc/nsswitch.conf,所以建议你不要使用 
它,而是自己去修改对应文件。 
   
  当基本的设置完毕后,回到主界面,选择Quit,然后将出现三个选项,如: 
   
  
   
  图4.5 退出并且激活 
   
  选择Active the changes,退出,就可以使用网络了,偶尔你必须重新启动计算机。 
   
  需要指出的是RedHat的脚本组织有点奇特,基本上是按照/etc/rc.d/rc程序的逻辑来 
进行的,这里很难用语言来形容它,只能给出一些提示,这些提示可以帮助你解决可能 
碰到到一些问题: 
   
  首先,netconf程序并不会处理内核模块的装入,所以,如果你使用了netconf程序但 
是没有得到正确的结果,你首先应该看看网络驱动模块有没有正确地装入。一般如果内 
核模块失败或者没有被装入,那么会出现一个"Delaying eth0 initialization"或类似 
的错误信息 
   
  第二,也是比较重要的,就是系统的网络脚本并不直接使用我们描述的那些命令的具 
体形式。相反,它试图从几个配置文件中读出信息并且相应地生成配置命令,例如,主 
要的脚本/etc/sysconfig/network-scripts/ifup试图去/etc/sysconfig/network-scri 
pts下面去寻找一切名为ifcfg-eth0,ifcfg-eth1的文件,并且根据他们来启动网络,而 
/etc/rc.d/rc.sysinit以及启动网络的脚本/etc/rc.d/S10network则试图通过判断是否 
存在/etc/sysconfig/network文件来决定是否启动网络,所以如果要调整网络配置通常 
就从/etc/sysconfig/network下手,这个文件具有这样的典型形式: 
   
  [openlab]# cat network 
   
  NETWORKING=yes 
   
  HOSTNAME="openlab.asnc.edu.cn" 
   
  GATEWAY="202.199.248.1" 
   
  GATEWAYDEV="eth0" 
   
  其含义很容易看出来,这里就不多讲了,如果你对到底配置文件是如何工作的感兴趣 
,可以参考/etc/rc.d/init.d/network脚本。 
   
  第三,即使用RedHat,你也一样可以通过修改/etc/rc.d/rc.sysinit或者/etc/rc.d/ 
rc.local来执行网络启动脚本,而且netconf程序通常工作的很好,所以问题总是可以解 
决的。 
   
  我们还是要额外提一下Corel Linux。尽管几乎不会有人用它作为服务器,但是它的工 
作方式是典型的“教科书方式”,也许将来另一个愚蠢的厂商会采用这个办法。它缺省 
的时候是使用dhcp(见第五章)来取得系统的IP地址和网关,所以如果你真的要配置网 
络就的先把对应运行级别里的有关dhcp的脚本连接删除掉,然后更改/etc/init.d/netw 
ork并且把它连接到正确的位置上去: 
   
  ln –s /etc/init.d/network /etc/rc2.d/S05network 
   
  还要在/etc/init.d/rcS中加入启动网卡的命令,就可以使用网络了。 
 
   
   4.2.6  inetd服务器 
   
  下面我们来处理一个最重要的网络服务进程,即inetd服务器程序。实际上,大部分请 
求不太频繁的服务都是由它启动的。 
   
  inetd程序在系统中是作为一个服务进程出现,它监听许多端口并且在得到客户请求时 
启动这个端口的服务程序。由于它的通用性,我们把它放到这一章来介绍。 
   
  inetd程序可以由命令行来启动: 
   
  inetd [-d] 
   
  -d选项用于打开调试信息。 
   
  inetd的工作方式是由/etc/inetd.conf和/etc/services文件设定的,下面我们来解释 
一下这两个文件。 
   
  services文件的格式基本上是这样: 
   
   netstat       15/tcp 
   
                qotd         17/tcp          quote 
   
                msp         18/tcp        # message send protocol 
   
                msp         18/udp          # message send protocol 
   
                chargen      19/tcp          ttytst source 
   
                chargen      19/udp          ttytst source 
   
                ftp          21/tcp 
   
                # 22 - unassigned 
   
                telnet          23/tcp 
   
  每一行都是两栏或者三栏,第一栏是服务的名字,第二行是使用的端口和协议,例如 
,这里的telnet     23/tcp是表示telnet服务应该使用端口23,协议类型为tcp。第三 
栏是服务的别名,通常可以省略。 
   
  inetd.conf是依赖于services文件的,它也是个文本文件,每行代表一种服务的工作 
方式,由"#"引导的行表示注释行,非注释行的格式大体是这样: 
   
  服务名 数据类型  协议  监听方式  用户身份  服务程序  参数 
   
  例如,要启动telnet的服务,应该加入这样一行: 
   
  telnet  stream  tcp     nowait  root    /usr/sbin/tcpd  in.telnetd 
   
  服务的名字就是telnet,这个名字按照/etc/services的定义将在23端口提供服务;s 
tream表示数据的发送和接收将使用简单的流式文件读写来完成(fscanf和fprintf); 
tcp表示使用tcp协议,监听方式这一栏可以由两个选项,即wait和nowait。简单地说, 
如果相应的服务程序是多进程的,那么要设置为nowait,这时inetd会每接受到一个请求 
之后启动一个服务程序进程,例如telnet就是这样工作的,每个独立的telnet对话都会 
启动一个telnet服务进程。相反,如果是单进程的,就可以设置为wait。 
   
  用户身份表示对应服务进程启动时所使用的uid/euid,因为telnet可以是任何用户发 
出,而且用户可以通过telnet执行任何命令,所以使用root用户身份。 
   
  /usr/sbin/tcpd 是实际启动的程序,这个程序实际是一个通用的TCP连接处理程序, 
参数使用in.telnetd,连起来就是当有23端口的连接请求时,inetd去执行/usr/sbin/t 
cpd in.telnetd。 
   
  通常情况下,各种服务都已经写在inetd.conf中,不启用的服务使用注释#使之失效。 
如果需要打开这服务,只要把引导的#注释符号删除就可以了。 
   
  值得一提的是/usr/sbin/tcpd程序,它是一个TCP连接过滤程序,通常大部分需要做连 
接验证的服务都应该通过tcpd程序启动,这个程序能够自动对客户机器的IP地址进行验 
证并且进行某些安全性过滤,其中最主要的功能是禁止某些地址来的连接。例如,按照 
上面的形式,in.telnetd程序就是通过/usr/sbin/tcpd程序启动的,因此可以对telnet 
请求进行地址检验。 
   
  tcpd的地址检验是通过/etc/hosts.deny和/etc/hosts.allow文件完成的,如果不存在 
这样的文件,你可以自己建立一个,两者的语法几乎是一样的,只是hosts.allow是允许 
某个地址来的连接,而hosts.deny是禁止某个地方来的连接。 
   
  基本的语法是: 
   
  服务程序:客户地址 
   
  服务程序是通过tcpd程序被启动的程序名字,客户地址是相关地址的一个列表,例如 
,在/etc/hosts.allow文件中加入这样一行: 
   
  in.telnetd:10.0.0.2 
   
  将允许10.0.0.2处的机器使用本地的telnet服务,如果这一行加入到/etc/hosts.den 
y重将禁止10.0.0.2处的机器登录上来。 
   
  地址可以使用集合形式,常用的集合形式主要有下列几种: 
   
  以逗点开头的字符串定义一个域,例如.edu.cn表示所有域名后缀是.edu.cn的机器。 
   
  以逗点结束的字符串定义一串IP地址,如202.199.248.代表202.199.248.0到202.199 
.248.255。 
   
  以/分开的字符串解释为网络地址/子网掩码的形式,例如172.13.0.0/255.255.0.0代 
表172.13.0.0到172.13.255.255。 
   
  另外,地址和服务程序都可以使用通配符,通配符有下列几种: 
   
  ALL 代表所有,所有的服务程序或者所有的地址。经常和EXCEPT子句连用,EXCEPT代 
表“除了”。例如,在hosts.deny中写上ALL:ALL EXCEPT 202.199.248.将禁止除了202 
.199.248.*的机器之外的所有客户机器使用任何基于tcpd的服务。写上ALL EXPECT in. 
telnetd:ALL将使得除了telnet以外的所有基于tcpd的服务都被禁止。 
   
  LOCAL 指代所有没有名字后缀的机器。 
   
  KNOWN 所有IP地址和域名都知道的机器 
   
  UNKNOWN IP地址或者域名无法确定的机器 
   
  PARANOID IP地址和从域名服务返回的名字不匹配的机器。 
 
   
   
 
 
-- 
当我越过无尽虚空的时候,我看见星辰的欲望,光荣和毁灭,这是光辉世界的宿命, 
一切的一切,最终必将落入黑暗和虚无。 
所以,我随着星光飞翔,去逃脱必然的终结,也许有一天,我将回到世界的原初, 
等待新的星辰的诞生。 
尘埃是星的起源,星的终结。 
 
 
※ 来源:·BBS 水木清华站 smth.org·[FROM: 202.112.90.20] 

BBS水木清华站∶精华区