发新话题
打印

NetBSD rc.d System

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.

TOP

发新话题