初探FreeBSD与Linux的预处理机制
/*FreeBSD下的预处理机制*/
FreeBSD和system V还是一些不大一样的,在rc(Resource Configuration)的使用机制上可以略见一斑了..
..rc系列的系统文件在FreeBSD中是非常常见的,这里我们可以find一下...
alex# find /etc -name "rc*" -print;find /usr/local/etc -name "rc*" -print
/etc/defaults/rc.conf
/etc/rc.d
/etc/rc.d/rcconf.sh
/etc/rc
/etc/rc.firewall
/etc/rc.firewall6
/etc/rc.sendmail
/etc/rc.shutdown
/etc/rc.subr
/etc/rc.suspend
/etc/rc.resume
/etc/rc.conf
/usr/local/etc/rc.d
可以说掌握了它们的原理你就可以很快地熟悉FreeBSD系统的一些基本配置了。在初学者的角度来说我们需要
掌握的是:
/etc/rc.conf----------------系统主配置文件
/etc/defaults/rc.conf----默认系统配置文件
/etc/rc.d-------------------预处理目录
/usr/local/etc/rc.d-------用户级别预处理目录
/etc/rc.local---------------系统预处理SHELL脚本
剩下的都是rc.conf的辅助文件了。
/etc/rc.conf大家可能不会陌生了(PS:如果以前有看过我的笔记的话),以前我把网关的rc.conf改成:
sendmail_enable="NONE"
sshd_enable="NO"
gateway_enable="YES"
hostname="alex.demon"
ifconfig_rl0="inet 192.168.1.1 netmask 255.255.255.0"
natd_enable="YES"
natd_interface="tun0"
ppp_enable="YES"
ppp_nat="YES"
ppp_mode="ddial"
ppp_profile="gzDSL"
上面的意思看上去好象谁都懂,但如何是一个空白的文件,现在要你"touch"一个rc.conf,要你"cat>>"一个出
来又如何呢?...对,这里就涉及到一个'语法'与'关键字'的问题了...你知道哪个关键字是代表哪个服务
的吗(看了上面的部分你可能会猜到一些,如何不看呢?又或者是没看过的部分呢?)?另外,这些关键字所
对应的值究竟是BOOL值(这里指的是"YES"或者"NO")又或者是字符串值呢?....问了上面的问题后可能你会
想答案可能会非常的复杂,其实只要你会E文就可以知道答案了...
alex# cat /etc/defaults/rc.conf|less
因为有N页纸,所以我就挑出其中的一部分吧
pccard_enable="NO" # Set to YES if you want to configure PCCARD devices.
pccard_mem="DEFAULT" # If pccard_enable=YES, this is card memory address.
pccard_beep="2" # pccard beep type.
pccard_ifconfig="NO" # Specialized pccard ethernet configuration (or NO).
pccardd_flags="-z" # Additional flags for pccardd.
pccard_conf="/etc/defaults/pccard.conf" # pccardd(8) config file
pccard_ether_delay="5" # Delay before trying to start dhclient in pccard_ether
#
ipfilter_enable="NO" # Set to YES to enable ipfilter functionality
ipfilter_program="/sbin/ipf" # where the ipfilter program lives
ipfilter_rules="/etc/ipf.rules" # rules definition file for ipfilter, see
# /usr/src/contrib/ipfilter/rules for examples
ipfilter_flags="" # additional flags for ipfilter
ipnat_enable="NO" # Set to YES to enable ipnat functionality
ipnat_program="/sbin/ipnat" # where the ipnat program lives
ipnat_rules="/etc/ipnat.rules" # rules definition file for ipnat
ipnat_flags="" # additional flags for ipnat
ipmon_enable="NO" # Set to YES for ipmon; needs ipfilter or ipnat
ipmon_program="/sbin/ipmon" # where the ipfilter monitor program lives
ipmon_flags="-Ds" # typically "-Ds" or "-D /var/log/ipflog"
看到右边有注释了吧?如果你想要更详细的说明可以man rc.conf(PS:现在知道为什么IT人都要学E文了...
)...上面我从/etc/defaults/rc.conf中节选了两个部分,第一个部分是PC卡的控制段,第二部分是ipfilte
r系列的控制段,看出它们有什么共通点了吗?是的,它们各自的段都有相同的关键字:*_enable和*_flags。
它们是什么关系呢?*_enable关键字是击活这个段的开关(或者说是击活这种功能的开关),它的值是BOOL
值(字符串YES或者NO);*_flags则是执行这个功能所附带的参数,它的值是一串等同于在SHELL下执行该Da
emon时所使用的参数字符串。另外还有一个是非常常用的关键字(但它不是一定有的,具体哪个控制段有哪
个控制段没有可以参看/etc/defaults/rc.conf),名为*_program,它是用来定位这个要执行的Daemon的程
序的执行文件位置的。举个例子,如何你在/etc/rc.conf里添加内容为:
ipmon_enable="YES"
ipmon_program="/sbin/ipmon"
ipmon_flags="-Ds"
其实就等同于系统在启动时在SHELL下自动帮你执行:
alex# /sbin/ipmon -Ds
上面的例子为什么是在/etc/rc.conf里添加,而不是在/etc/defaults/rc.conf里添加呢?这里又引入这两个
文件之间的关系这个概念了。/etc/defaults/rc.conf是系统的默认rc.conf,当/etc/rc.conf不存在时系统
也会正常地读取rc.conf,读取的部分就是/etc/defaults/rc.conf了;若/etc/rc.conf存在,则系统读取该
文件的内容,当该文件中没有提及的其他部分的设置系统将按/etc/defaults/rc.conf来制定,也就是说/etc
/rc.conf的优先级别比/etc/defaults/rc.conf高(这就是为什么/etc/defaults/rc.conf中每个段的开关关
键字的值都为"NO"的缘故了)。上面提及的是rc.conf文件的优先问题,下面说说rc.conf中段设置的优先问
题。上面我曾说过rc.conf中每个段结构都有一个开关关键字*_enable的,当/etc/rc.conf设置启用了该段所
代表的Daemon,则系统就会向/etc/rc.conf读取下面的参数关键字,若某些关键字不存在,系统也会向/etc/
defaults/rc.conf读取参数关键字;若/etc/rc.conf设置某Daemon段的开关关键字值为"NO",则就算/etc/de
faults/rc.conf设置该开关关键字的值为"YES",系统既不会启动该Daemon也不会再向任何一个文件读取关于
该Daemon下的参数关键字的值的。还有一点是需要注意的:就是/etc/rc.conf里是可以写进SHELL脚本的(但
不推崇那么做)。
关于/etc/rc.d与/usr/local/etc/rc.d这两个目录文件的使用方法大致是相同的。在它们里面的预处理文件
必须满足三个条件:
1)都是以.sh结尾的SHELL脚本文件
2)文件的mask都有x(执行权限)
3)必须有'start'这个启动程序的参数存在
满足上面三点的话,系统在启动时会自动将这两个目录下的SHELL脚本执行以start参数形式运行。至于这个
两目录文件的不同点就是:/etc/rc.d主要用于存放操作系统级别的Daemon控制脚本,而/usr/local/etc/rc.
d则用于存放用户级别的Daemon控制脚本。所以如果是我们自己写的*.sh最好还是放在/usr/local/etc/rc.d
里。
至于最后一个介绍的文件/etc/rc.local通常是系统的预处理中最后被调用出来的,它的内容完全没什么限制
,只要是能执行SHELL脚本就可以了。
////////////////////////////////////////////////////////////////////////////////////////////////
/*Linux下的预处理机制*/
linux下与FREEBSD并不完全一样,它的主要特点是它对runlevel有非常明确的定义的。下面我就自己的LINUX
(FEDORA 2)对此发表一下自己的看法(PS:当然,不同的发行版之间是有一定的差别的)。一台PC引导LIN
UX系统的步骤应该是(下面纯粹是我个人的见解):
PC从BIOS ROM中找到硬引导设备-》从引导设备中找到MBR-》载入并初始化内核-》检测硬件设备-》建立必要
的系统进程-》(必要的手工干预)-》预处理[DAEMON等]-》多用户操作
前5步都是与预处理机制无关的,在第6部是可选的(所以用括号括起来),一但第6步正常退出,“运作的主
线”还是会回到第7步的,第7步就是本文的重点。LINUX是如何完成预处理的呢?它通常是根据一种init的机
制(PS:前面也说了,它非常的注重runlevel),首先系统在这个步骤是进行一系列有“预谋”的固定SHELL
脚本集执行,然后再根据发行版的不同而进行一些其他的预处理。
就我目前用的FEDORA 2而言,它本身也是有一套顺序的:首先执行/etc/sysconfig目录的脚本集,然后进行i
nit机制工作,最后读取一下为兼容BSD系统而设立的/etc/rc.local脚本文件(这个是可选的)。
关于/etc/sysconfig的脚本集这个是REDHAT特有的,而且它使用起来比较凌乱,所以大多是不需要大家掌握,
大家可以用相关的工具去完成这部分的操作,打个比方,在/etc/sysconfig/network-scripts下的ifcfg-*文
件是在系统启动时给网络接口定义值的脚本,我们并不需要去编辑它,而可以选择Linuxconf又或者netconfi
g等程序去完成它的编辑(PS:这样可读性就提高了)。
这里我们必须明确上面所说的init机制。首先系统会读取/etc/inittab文件,这里我截选一段主要的部分来
说明一下:
id:3:initdefault: <-------这里定义了系统默认使用哪一个runlevel
# System initialization.
si::sysinit:/etc/rc.d/rc.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
# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now <--------当接收到“热启”信号时
# Run gettys in standard runlevels <-------关于getty的定义
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
# Run xdm in runlevel 5 <-------当目前状态时运行级别5(X窗口)时
x:5:respawn:/etc/X11/prefdm -nodaemon
从上面的例子大概可以看出每一条作用行(非注释行)都是由下面的部分构成的:
ID号:运行级别:运行状态:需要运行的命令行
“ID号”由最多两个英文字符组成,它的组成字符是有特别意思的,如系统初始化(System initialization
)的ID号固定一定是si的,不过这一项大家是不用故意去记住它的,只要跟着它上一行的注释就可以知道了。
“运行级别”这一项可以定义多个运行级别的值在该值中,如上面的“1:2345:respawn:/sbin/mingetty tty
1”定义中“运行级别”这个值就有允许“2345”这四个级别都囊括在其中了。“运行状态”属于是inittab
语法上的一种关键字,大家可以man inittab来看一下。“需要运行的命令行”这个就不用我多说了吧?
这里又引出了新的工作模式了。首先inittab寻找“运行状态”这个参数为“initdefault”的作用行,找到
它的默认运行级别的值(上例为3),然后跳到“ID号”为“l3”的作用行,作用行根据它的运行命令行部分
(上例是/etc/rc.d/rc3.d这个目录)。现在我们打开/etc/rc.d/rc3.d这个目录来看看其中的‘奥妙’(下
面只是其中节选的一小部分)。
lrwxrwxrwx 1 root root 18 Jul 11 1997 K89netplugd -> ../init.d/netplugd
lrwxrwxrwx 1 root root 18 Feb 17 14:02 K92iptables -> ../init.d/iptables
lrwxrwxrwx 1 root root 16 Jan 19 14:16 K96pcmcia -> ../init.d/pcmcia
lrwxrwxrwx 1 root root 19 Jul 11 1997 K99readahead -> ../init.d/readahead
lrwxrwxrwx 1 root root 25 Jul 11 1997 K99readahead_early -> ../init.d/readahead_early
lrwxrwxrwx 1 root root 23 Jul 11 1997 S00microcode_ctl -> ../init.d/microcode_ctl
lrwxrwxrwx 1 root root 15 Jul 11 1997 S05kudzu -> ../init.d/kudzu
lrwxrwxrwx 1 root root 18 Jul 11 1997 S06cpuspeed -> ../init.d/cpuspeed
lrwxrwxrwx 1 root root 14 Jul 11 1997 S09isdn -> ../init.d/isdn
lrwxrwxrwx 1 root root 17 Jul 11 1997 S10network -> ../init.d/network
lrwxrwxrwx 1 root root 16 Jul 11 1997 S12syslog -> ../init.d/syslog
lrwxrwxrwx 1 root root 20 Jul 11 1997 S13irqbalance -> ../init.d/irqbalance
可以看出所有文件都是链接到/etc/rc.d/init.d/下的SHELL脚本文件的。
[root@demonalex2 root]# cd /etc/rc.d/init.d
[root@demonalex2 init.d]# file syslog
sshd: Bourne-Again shell script text executable
至于这些SHELL脚本有什么要求嘛,有执行权限(x)、有参数start。在系统执行到这个rcX.d目录时它会通
过文件的特征字符去辨别应该如何执行的。目录里每个文件的开头都只有两种可能S/K,当进入该运行级别时
系统会执行文件名为S开头的SHELL脚本(调用start参数),当系统离开该运行级别时将执行该目录下所有文
件名以K开头的脚本(调用stop参数);S/K字符后紧跟着一个自然数值,它是系统用来辨别程序执行顺序的,
顺序是从小到大开始执行的;最后剩下的字符串代表程序的名称。
现在让我们再回到/etc/inittab文件里头看看,默认在“initdefault”下面还有一个“运行状态”为“sysi
nit”的功能行,在它的命令执行部分定义了/etc/rc.d/rc.sysinit这个脚本,它是一个定义全局环境的SHEL
L脚本来的(它只会在系统引导时工作一次),有能力的朋友可以适当地编辑一下它来“改善一下生活”喏。
最后REDHAT的开发者可能是良心发现,留了系统中最后一个执行预处理的机会给一个兼容于BSD的执行脚本--
---/etc/rc.d/rc.local(存放的位置与BSD有些不同,BSD是在/etc/rc.local的),大家也可以用它来编辑
自己的SHELL处理了。
FreeBSD和system V还是一些不大一样的,在rc(Resource Configuration)的使用机制上可以略见一斑了..
..rc系列的系统文件在FreeBSD中是非常常见的,这里我们可以find一下...
alex# find /etc -name "rc*" -print;find /usr/local/etc -name "rc*" -print
/etc/defaults/rc.conf
/etc/rc.d
/etc/rc.d/rcconf.sh
/etc/rc
/etc/rc.firewall
/etc/rc.firewall6
/etc/rc.sendmail
/etc/rc.shutdown
/etc/rc.subr
/etc/rc.suspend
/etc/rc.resume
/etc/rc.conf
/usr/local/etc/rc.d
可以说掌握了它们的原理你就可以很快地熟悉FreeBSD系统的一些基本配置了。在初学者的角度来说我们需要
掌握的是:
/etc/rc.conf----------------系统主配置文件
/etc/defaults/rc.conf----默认系统配置文件
/etc/rc.d-------------------预处理目录
/usr/local/etc/rc.d-------用户级别预处理目录
/etc/rc.local---------------系统预处理SHELL脚本
剩下的都是rc.conf的辅助文件了。
/etc/rc.conf大家可能不会陌生了(PS:如果以前有看过我的笔记的话),以前我把网关的rc.conf改成:
sendmail_enable="NONE"
sshd_enable="NO"
gateway_enable="YES"
hostname="alex.demon"
ifconfig_rl0="inet 192.168.1.1 netmask 255.255.255.0"
natd_enable="YES"
natd_interface="tun0"
ppp_enable="YES"
ppp_nat="YES"
ppp_mode="ddial"
ppp_profile="gzDSL"
上面的意思看上去好象谁都懂,但如何是一个空白的文件,现在要你"touch"一个rc.conf,要你"cat>>"一个出
来又如何呢?...对,这里就涉及到一个'语法'与'关键字'的问题了...你知道哪个关键字是代表哪个服务
的吗(看了上面的部分你可能会猜到一些,如何不看呢?又或者是没看过的部分呢?)?另外,这些关键字所
对应的值究竟是BOOL值(这里指的是"YES"或者"NO")又或者是字符串值呢?....问了上面的问题后可能你会
想答案可能会非常的复杂,其实只要你会E文就可以知道答案了...
alex# cat /etc/defaults/rc.conf|less
因为有N页纸,所以我就挑出其中的一部分吧
pccard_enable="NO" # Set to YES if you want to configure PCCARD devices.
pccard_mem="DEFAULT" # If pccard_enable=YES, this is card memory address.
pccard_beep="2" # pccard beep type.
pccard_ifconfig="NO" # Specialized pccard ethernet configuration (or NO).
pccardd_flags="-z" # Additional flags for pccardd.
pccard_conf="/etc/defaults/pccard.conf" # pccardd(8) config file
pccard_ether_delay="5" # Delay before trying to start dhclient in pccard_ether
#
ipfilter_enable="NO" # Set to YES to enable ipfilter functionality
ipfilter_program="/sbin/ipf" # where the ipfilter program lives
ipfilter_rules="/etc/ipf.rules" # rules definition file for ipfilter, see
# /usr/src/contrib/ipfilter/rules for examples
ipfilter_flags="" # additional flags for ipfilter
ipnat_enable="NO" # Set to YES to enable ipnat functionality
ipnat_program="/sbin/ipnat" # where the ipnat program lives
ipnat_rules="/etc/ipnat.rules" # rules definition file for ipnat
ipnat_flags="" # additional flags for ipnat
ipmon_enable="NO" # Set to YES for ipmon; needs ipfilter or ipnat
ipmon_program="/sbin/ipmon" # where the ipfilter monitor program lives
ipmon_flags="-Ds" # typically "-Ds" or "-D /var/log/ipflog"
看到右边有注释了吧?如果你想要更详细的说明可以man rc.conf(PS:现在知道为什么IT人都要学E文了...
)...上面我从/etc/defaults/rc.conf中节选了两个部分,第一个部分是PC卡的控制段,第二部分是ipfilte
r系列的控制段,看出它们有什么共通点了吗?是的,它们各自的段都有相同的关键字:*_enable和*_flags。
它们是什么关系呢?*_enable关键字是击活这个段的开关(或者说是击活这种功能的开关),它的值是BOOL
值(字符串YES或者NO);*_flags则是执行这个功能所附带的参数,它的值是一串等同于在SHELL下执行该Da
emon时所使用的参数字符串。另外还有一个是非常常用的关键字(但它不是一定有的,具体哪个控制段有哪
个控制段没有可以参看/etc/defaults/rc.conf),名为*_program,它是用来定位这个要执行的Daemon的程
序的执行文件位置的。举个例子,如何你在/etc/rc.conf里添加内容为:
ipmon_enable="YES"
ipmon_program="/sbin/ipmon"
ipmon_flags="-Ds"
其实就等同于系统在启动时在SHELL下自动帮你执行:
alex# /sbin/ipmon -Ds
上面的例子为什么是在/etc/rc.conf里添加,而不是在/etc/defaults/rc.conf里添加呢?这里又引入这两个
文件之间的关系这个概念了。/etc/defaults/rc.conf是系统的默认rc.conf,当/etc/rc.conf不存在时系统
也会正常地读取rc.conf,读取的部分就是/etc/defaults/rc.conf了;若/etc/rc.conf存在,则系统读取该
文件的内容,当该文件中没有提及的其他部分的设置系统将按/etc/defaults/rc.conf来制定,也就是说/etc
/rc.conf的优先级别比/etc/defaults/rc.conf高(这就是为什么/etc/defaults/rc.conf中每个段的开关关
键字的值都为"NO"的缘故了)。上面提及的是rc.conf文件的优先问题,下面说说rc.conf中段设置的优先问
题。上面我曾说过rc.conf中每个段结构都有一个开关关键字*_enable的,当/etc/rc.conf设置启用了该段所
代表的Daemon,则系统就会向/etc/rc.conf读取下面的参数关键字,若某些关键字不存在,系统也会向/etc/
defaults/rc.conf读取参数关键字;若/etc/rc.conf设置某Daemon段的开关关键字值为"NO",则就算/etc/de
faults/rc.conf设置该开关关键字的值为"YES",系统既不会启动该Daemon也不会再向任何一个文件读取关于
该Daemon下的参数关键字的值的。还有一点是需要注意的:就是/etc/rc.conf里是可以写进SHELL脚本的(但
不推崇那么做)。
关于/etc/rc.d与/usr/local/etc/rc.d这两个目录文件的使用方法大致是相同的。在它们里面的预处理文件
必须满足三个条件:
1)都是以.sh结尾的SHELL脚本文件
2)文件的mask都有x(执行权限)
3)必须有'start'这个启动程序的参数存在
满足上面三点的话,系统在启动时会自动将这两个目录下的SHELL脚本执行以start参数形式运行。至于这个
两目录文件的不同点就是:/etc/rc.d主要用于存放操作系统级别的Daemon控制脚本,而/usr/local/etc/rc.
d则用于存放用户级别的Daemon控制脚本。所以如果是我们自己写的*.sh最好还是放在/usr/local/etc/rc.d
里。
至于最后一个介绍的文件/etc/rc.local通常是系统的预处理中最后被调用出来的,它的内容完全没什么限制
,只要是能执行SHELL脚本就可以了。
////////////////////////////////////////////////////////////////////////////////////////////////
/*Linux下的预处理机制*/
linux下与FREEBSD并不完全一样,它的主要特点是它对runlevel有非常明确的定义的。下面我就自己的LINUX
(FEDORA 2)对此发表一下自己的看法(PS:当然,不同的发行版之间是有一定的差别的)。一台PC引导LIN
UX系统的步骤应该是(下面纯粹是我个人的见解):
PC从BIOS ROM中找到硬引导设备-》从引导设备中找到MBR-》载入并初始化内核-》检测硬件设备-》建立必要
的系统进程-》(必要的手工干预)-》预处理[DAEMON等]-》多用户操作
前5步都是与预处理机制无关的,在第6部是可选的(所以用括号括起来),一但第6步正常退出,“运作的主
线”还是会回到第7步的,第7步就是本文的重点。LINUX是如何完成预处理的呢?它通常是根据一种init的机
制(PS:前面也说了,它非常的注重runlevel),首先系统在这个步骤是进行一系列有“预谋”的固定SHELL
脚本集执行,然后再根据发行版的不同而进行一些其他的预处理。
就我目前用的FEDORA 2而言,它本身也是有一套顺序的:首先执行/etc/sysconfig目录的脚本集,然后进行i
nit机制工作,最后读取一下为兼容BSD系统而设立的/etc/rc.local脚本文件(这个是可选的)。
关于/etc/sysconfig的脚本集这个是REDHAT特有的,而且它使用起来比较凌乱,所以大多是不需要大家掌握,
大家可以用相关的工具去完成这部分的操作,打个比方,在/etc/sysconfig/network-scripts下的ifcfg-*文
件是在系统启动时给网络接口定义值的脚本,我们并不需要去编辑它,而可以选择Linuxconf又或者netconfi
g等程序去完成它的编辑(PS:这样可读性就提高了)。
这里我们必须明确上面所说的init机制。首先系统会读取/etc/inittab文件,这里我截选一段主要的部分来
说明一下:
id:3:initdefault: <-------这里定义了系统默认使用哪一个runlevel
# System initialization.
si::sysinit:/etc/rc.d/rc.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
# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now <--------当接收到“热启”信号时
# Run gettys in standard runlevels <-------关于getty的定义
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
# Run xdm in runlevel 5 <-------当目前状态时运行级别5(X窗口)时
x:5:respawn:/etc/X11/prefdm -nodaemon
从上面的例子大概可以看出每一条作用行(非注释行)都是由下面的部分构成的:
ID号:运行级别:运行状态:需要运行的命令行
“ID号”由最多两个英文字符组成,它的组成字符是有特别意思的,如系统初始化(System initialization
)的ID号固定一定是si的,不过这一项大家是不用故意去记住它的,只要跟着它上一行的注释就可以知道了。
“运行级别”这一项可以定义多个运行级别的值在该值中,如上面的“1:2345:respawn:/sbin/mingetty tty
1”定义中“运行级别”这个值就有允许“2345”这四个级别都囊括在其中了。“运行状态”属于是inittab
语法上的一种关键字,大家可以man inittab来看一下。“需要运行的命令行”这个就不用我多说了吧?
这里又引出了新的工作模式了。首先inittab寻找“运行状态”这个参数为“initdefault”的作用行,找到
它的默认运行级别的值(上例为3),然后跳到“ID号”为“l3”的作用行,作用行根据它的运行命令行部分
(上例是/etc/rc.d/rc3.d这个目录)。现在我们打开/etc/rc.d/rc3.d这个目录来看看其中的‘奥妙’(下
面只是其中节选的一小部分)。
lrwxrwxrwx 1 root root 18 Jul 11 1997 K89netplugd -> ../init.d/netplugd
lrwxrwxrwx 1 root root 18 Feb 17 14:02 K92iptables -> ../init.d/iptables
lrwxrwxrwx 1 root root 16 Jan 19 14:16 K96pcmcia -> ../init.d/pcmcia
lrwxrwxrwx 1 root root 19 Jul 11 1997 K99readahead -> ../init.d/readahead
lrwxrwxrwx 1 root root 25 Jul 11 1997 K99readahead_early -> ../init.d/readahead_early
lrwxrwxrwx 1 root root 23 Jul 11 1997 S00microcode_ctl -> ../init.d/microcode_ctl
lrwxrwxrwx 1 root root 15 Jul 11 1997 S05kudzu -> ../init.d/kudzu
lrwxrwxrwx 1 root root 18 Jul 11 1997 S06cpuspeed -> ../init.d/cpuspeed
lrwxrwxrwx 1 root root 14 Jul 11 1997 S09isdn -> ../init.d/isdn
lrwxrwxrwx 1 root root 17 Jul 11 1997 S10network -> ../init.d/network
lrwxrwxrwx 1 root root 16 Jul 11 1997 S12syslog -> ../init.d/syslog
lrwxrwxrwx 1 root root 20 Jul 11 1997 S13irqbalance -> ../init.d/irqbalance
可以看出所有文件都是链接到/etc/rc.d/init.d/下的SHELL脚本文件的。
[root@demonalex2 root]# cd /etc/rc.d/init.d
[root@demonalex2 init.d]# file syslog
sshd: Bourne-Again shell script text executable
至于这些SHELL脚本有什么要求嘛,有执行权限(x)、有参数start。在系统执行到这个rcX.d目录时它会通
过文件的特征字符去辨别应该如何执行的。目录里每个文件的开头都只有两种可能S/K,当进入该运行级别时
系统会执行文件名为S开头的SHELL脚本(调用start参数),当系统离开该运行级别时将执行该目录下所有文
件名以K开头的脚本(调用stop参数);S/K字符后紧跟着一个自然数值,它是系统用来辨别程序执行顺序的,
顺序是从小到大开始执行的;最后剩下的字符串代表程序的名称。
现在让我们再回到/etc/inittab文件里头看看,默认在“initdefault”下面还有一个“运行状态”为“sysi
nit”的功能行,在它的命令执行部分定义了/etc/rc.d/rc.sysinit这个脚本,它是一个定义全局环境的SHEL
L脚本来的(它只会在系统引导时工作一次),有能力的朋友可以适当地编辑一下它来“改善一下生活”喏。
最后REDHAT的开发者可能是良心发现,留了系统中最后一个执行预处理的机会给一个兼容于BSD的执行脚本--
---/etc/rc.d/rc.local(存放的位置与BSD有些不同,BSD是在/etc/rc.local的),大家也可以用它来编辑
自己的SHELL处理了。