荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: georgehill (New Century New Dream), 信区: Linux
标  题: 第四章 系统配置(上)(转寄)
发信站: BBS 荔园晨风站 (Sat Jan  6 14:44:58 2001), 站内信件

【 以下文字转载自 georgehill 的信箱 】
【 原文由 georgehill.bbs@smth.org 所发表 】
发信人: 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
5

  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 荔园晨风站 bbs.szu.edu.cn·[FROM: 192.168.1.115]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店