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处理了。[版权声明]BSD爱好者乐园站内文章,如来源不是互联网,则均系原创或翻译之作,可随意转载,或以此为基础进行演译,但务必以链接形式注明原始出处和作者信息,否则属于侵权行为。另对本站转载他处文章,俱有说明,如有侵权请联系本人,本人将会在第一时间删除侵权文章。 |
|