服务器 频道

FreeBSD系统启动进程:init

    【IT168 服务器学院】在前面的文章里,我们学习了怎么显示和管理运行中的进程。今天,我想描述一下那些进程实际上如何启动的。

    当你启动计算机进入FreeBSD时会有很多巧妙的事情发生。在此我无法论及所有的细节,但FreeBSD handbook极好地解释了引导过程。当你启动你的计算机时,可能会注意到内核对硬件作了检测并在终端上显示了相应的结果。当检测崾保诤嘶崞舳礁鼋蹋航獭? (swapper)和进程 1 (init)。

    负责进程控制初始化的程序是init;没有它,其它的进程无法启动。在引导时,init要做两项重要的工作:首先,它在rc的控制之下装入启动脚本,然后它初始化终端以便使用户可以登录。让我们分别描述这些功能,从rc开始:

    whatis rc
    rc(8)     - command scripts for auto-reboot and daemon startup
    这些脚本实际位于/etc/rc;通常,位于/etc下的这个配置文件对应于手册的第五部分,所以你可以根据手册对配置文件作正确地修改。但是,如果你打:

    man 5 rc 
    你却会得到以下信息:

    No entry for rc in section 5 of the manual
    这对于上面提到的它位于手册第八部分来说看起来有点古怪,因为这部分手册包含的是系统维护和操作命令,通常它们都是后台进程。让我们进一步来看一下这个文件:

    more /etc/rc
    # System startup script run by init on autoboot
    # or after single-user.
    # Output and error are redirected to console by init,
    # and the console is the controlling terminal.
    # Note that almost all of the user-configurable behavior 
    # is no longer in # this file, but rather in /etc/defaults/rc.conf.
    # Please check that file first before contemplating any changes 
    # here.  If you do need to change this file for some reason, we 
    # would like to know about it.
    好,相当清晰;看来对于该文件我们自己是不能乱来的。这里有些相当重要的东西对于正确引导我们的系统所必须的。让我们往后跳,看一些重要的部分来找出启动时实际上都发生了些什么。注意当在引导过程中处理rc脚本时,init会把所有的输出和错误信息记录到终端上。

    rc首先做的事之一就是设置路径变量,以使它可以找到你FreeBSD系统上的可执行程序:

    PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin
    然后它会查找/etc/defaults/rc.conf and和/etc/rc.conf这两个文件:

    # If there is a global system configuration file, suck it in.
    if [ -f /etc/defaults/rc.conf ]; then
             . /etc/defaults/rc.conf
    elif [ -f /etc/rc.conf ]; then
             . /etc/rc.conf
    fi
    接着它会作一个文件系统连贯性检查。如果你曾经非正常关闭FreeBSD系统,你会在引导过程中看到它在这一步上发出抱怨的。

    echo Automatic boot in progress...
    fsck -p
    假定fsck没有遇到任何问题,它就马上装载你的文件系统:

    # Mount everything except nfs filesystems.
    mount -a -t nonfs
    在其它任何进程启动之前,你的CMOS时钟必须调整为内核时钟可以理解的形式:

    adjkerntz -i
    然后整理var目录,将引导信息写入dmesg.boot:

    clean_var() {
    if [ ! -f /var/run/clean_var ]; then
    rm -rf /var/run/*
    find /var/spool/lock ! -type d -delete
    rm -rf /var/spool/uucp/.Temp/*
    # Keep a copy of the boot messages around
    dmesg >/var/run/dmesg.boot
    接着rc会读取以下文件:

    /etc/rc.sysctl
    /etc/rc.serial
    /etc/rc.pccard
    /etc/rc.network
    /etc/rc.network6
    然后复位终端权限:

    # Whack the pty perms back into shape.
    chflags 0 /dev/tty[pqrsPQRS]*
    chmod 666 /dev/tty[pqrsPQRS]*
    chown root:wheel /dev/tty[pqrsPQRS]*
    并清理自己产生的“垃圾”以及/tmp目录:

    # Clean up left-over files
    # Clearing /tmp at boot-time seems to have a long tradition. It  doesn''t
    # help in any way for long-living systems, and it might accidentally
    # clobber files you would rather like to have preserved after a crash
    # (if not using mfs /tmp anyway).
    # See also the example of another cleanup policy in /etc/periodic/daily.
    # Remove X lock files, since they will prevent you from restarting X11
    # after a system crash.
    现在rc准备启动一些后台进程,首先是syslogd和named:

    # Start system logging and name service.  Named needs to start before syslogd
    # if you don''t have a /etc/resolv.conf.
    然后是inetd、cron、lpd、sendmail、sshd和usbd:

    # Now start up miscellaneous daemons that don''t belong anywhere else
    接着rc将更新motd(每日信息)并执行“uname -m”,这条命令会在屏幕上显示构架类型。

    (/etc/rc文件结尾)
    当到达/etc/rc的结尾时,rc的工作就完成了。在此我们重新回顾一下:init调用rc脚本,它会读取一些全局的和本地的配置文件以正确装载文件系统并建立系统后台进程可以启动的环境。你的操作系统现在已经启动并运行着,但到此为止,还没有一个用户可以与操作系统实际交互的环境。这就是init第二个重要的功能。

    配置文件/etc/ttys将会被读取以决定初始化的终端。不象/etc/rc,该文件可以由超级用户经常编辑以确保让init来初始化所需的终端。

    为了理解此文件,我们必须了解在你的FreeBSD系统上有三种类型的终端。以“ttyv”开头后跟一个数字的是虚拟终端;它们都是用户可以获得的物理存在于FreeBSD系统上的终端。缺省情况下,这些虚拟终端中的第一个,或叫“ttyv0”,表示控制台。以“ttyd”开头后跟一个数字的是串行线路或拨号终端;它们是用户用调制解调器远程访问你的FreeBSD系统时可获得的终端。最后一种终端类型就是伪终端或网络终端;它们以“ttyp”开头后跟一个数字或字母,用于通过网络连接访问你的FreeBSD系统。

    如果我们用以下命令看此文件:

    more /etc/ttys

0
相关文章