荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: 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软件 网络书店