NetBSD rc.d System
到netbsd1.5,系统启动变成使用rc-scripts来控制启动服务了,类似于sysv的init-system和linux使用的启动脚本,但是没有运行级.这个章节介绍rc-system和netbsd中怎样定制它们.
1,在/etc中有这么一些启动文件:
/etc/rc
/etc/rc.conf
/etc/rc.d/*
/etc/rc.lkm
/etc/rc.local
/etc/rc.shutdown
/etc/rc.subr
/etc/defaults/*
/etc/rc.conf.d/*
首先,让我们来看看rc:
当kernel初始化所有设备后,将运行init,init将运行/etc/rc
/etc/rc使用rcorder为/etc/rc.d中的脚本排序,并按照这个顺序执行它们.参考rcorder的manpage
/etc/rc.subr包含了很多常用的函数,这些函数为/rc.d/中的脚本使用.
当使用shutdown关闭系统时,/etc/rc.shutdown将以逆序(rcorder的排序)执行/etc/rc.d/中的脚本.
另外:
/etc/rc.lkm装入和卸载kernel模块,参看modload和/etc/rc.d/lkm[123]
/etc/rc.local是系统启动时最后运行的一个脚本.可以被系统管理添加本地启动的服务,通常,这些服务并没有包含在/rc.d中.
比如:安装的软件包通常将他们的启动脚本放在/usr/pkg/etc/rc.d中,系统管理员可以决定是否使用它.通过拷贝或者连接它到 /etc/rc.d中,或者将它加入到/etc/rc.local来激活.下面有个例子是关于把apache加入/etc/rc.local的:
if [ -f /usr/pkg/etc/rc.d/apache ]; then
/usr/pkg/etc/rc.d/apache start
fi
rc.conf是整个启动脚本的核心控制文件.放在/etc/rc.conf.它从/etc/defaults/rc.conf(这个文件一般不要改变它)中获取默认值.为了改变默认的值, 将它们放在/etc/rc.conf中:比如:
你想激活ssh:
# cd /etc; grep ssh defaults/rc.conf
sshd=NO sshd_flags=""
# echo "sshd=YES" >> rc.conf
或者你可以用你自己喜欢的编辑器编辑rc.conf;对于其他的改变,方法是一样的.一般的做法是:当新安装netbsd后:
# cat /etc/defaults/rc.conf >>/etc/rc.conf
# vi /etc/rc.conf
注意>>和>的区别,要不然可能破坏系统默认的/etc/rc.conf中保留的东西.然后,你可以根据需要改变/etc/rc.conf.一定要参考rc.conf的manpage,看看具体的设置.
最后,/etc/rc.conf.d目录可以用来放置第三方的脚本......
2 rc.d脚本
实际的脚本放在/etc/rc.d中,在rc.conf中控制运行它还是不运行它,也可以通过命令行运行.比如,如果一个管理员需要运行sshd:
/etc/rc.d/sshd start
这些rc脚本必须接受一个或者多个下面的参数:
start
stop
restart
kill
比如当一条新的记录被加入到域名数据库时:
/etc/rc.d/named restart
稍微复杂一点的例子是当一些设置改变时,比如ipfilter的规则,ipnat的配置,ssh切换到加密模式:
sh /etc/rc.d/ipfilter restart
sh /etc/rc.d/ipnat restart
sh /etc/rc.d/sshd restart
3,rcorder和rc脚本所扮演的角色
每个unix-like的启动脚本系统都得决定服务的启动顺序.一些系统是这样做的:以文件名(的顺序),或者放在不同的运行级别中(solaris依靠 /etc/rc[23].d/S*来以数字分类),或者简单把所以命令放在一个脚本里(早期的netbsd以及还没使用rc.d系统时的netbsd就是这样的).这些看起来很杂乱无章.
netbsd现在使用rc-scripts.注意netbsd没有象sysv比如solaris或者linux中使用多运行级别的概念.
(译者,那么netbsdrc.d系统怎么解决这个问题的呢?)
在/etc/rc.d/的每个脚本头部,有一些注释里有下面关键字.
REQUIRE
PROVIDE
BEFORE
KEYWORD
它们提供了一些rc脚本的依赖关系,这样,rcorder可以根据需要来决定先,后关系.
...
PROVIDE:nfsd
REQUIRE:mountd
./etc/rc.subr
...
我们通过上面的片段可以看到,这个脚本提供nfsd服务,显然,它需要mountd先运行起来.
在系统启动时,rcorder遍历所有rc脚本,决定他们运行的正确顺序.(这就是它叫rc-order的原因)
4,延伸阅读
有一些关于rc.d 系统的资料:
One of the principal designers of rc.d, Luke Mewburn, gave a presentation on the system at USENIX 2001. It is available in PDF format.
Will Andrews wrote a Daemonnews article called The NetBSD rc.d System.