/sbin/init 程序(也称作 init)协调余下的引导过程并为用户配置环境。
当 init 命令启动时,它成为系统里所有自动启动的进程的父进程或者祖父(grandparent)进程。首先,它运行 /etc/rc.d/rc.sysinit 脚本,这会设置环境路径、启动交换空间、检查文件系统并执行所有系统初始化所需的其他步骤。例如,多数系统会使用时钟,rc.sysinit 读入 /etc/sysconfig/clock 配置文件来初始化硬件时钟。另外一个例子是,如果有必须初始化的特殊串口进程,rc.sysinit 会执行 /etc/rc.serial 脚本。
然后,init 命令运行 /etc/inittab 脚本,这描述了系统在每个 SysV init 运行级别 应该怎样设置。运行级别(runlevel)是一个状态,或者 模式,它由 SysV /etc/rc.d/rc<x>.d/ 目录里列出的服务来定义(在这里,<x> 是运行级别)。关于 SysV init 运行级别的详情,请参考 第 30.4 节 “SysV Init 运行级别”。
接着,init 命令为系统设置 source function library,/etc/rc.d/init.d/functions,配置怎样启动、杀死和决定程序的进程号(PID)。
init 程序根据 /etc/inittab 里指定的缺省运行级别遍历合适的 rc 目录,启动所有的后台进程。不同的运行级别对应不同的rc 目录。例如,/etc/rc.d/rc5.d/ 是对应运行级别 5 的目录。
当引导至运行级别 5 时,init 程序会遍历 /etc/rc.d/rc5.d/ 来决定启动和停止哪些进程。
下面是 /etc/rc.d/rc5.d/ 目录内容的示例:
K05innd -> ../init.d/innd K05saslauthd -> ../init.d/saslauthd K10dc_server -> ../init.d/dc_server K10psacct -> ../init.d/psacct K10radiusd -> ../init.d/radiusd K12dc_client -> ../init.d/dc_client K12FreeWnn -> ../init.d/FreeWnn K12mailman -> ../init.d/mailman K12mysqld -> ../init.d/mysqld K15httpd -> ../init.d/httpd K20netdump-server -> ../init.d/netdump-server K20rstatd -> ../init.d/rstatd K20rusersd -> ../init.d/rusersd K20rwhod -> ../init.d/rwhod K24irda -> ../init.d/irda K25squid -> ../init.d/squid K28amd -> ../init.d/amd K30spamassassin -> ../init.d/spamassassin K34dhcrelay -> ../init.d/dhcrelay K34yppasswdd -> ../init.d/yppasswdd K35dhcpd -> ../init.d/dhcpd K35smb -> ../init.d/smb K35vncserver -> ../init.d/vncserver K36lisa -> ../init.d/lisa K45arpwatch -> ../init.d/arpwatch K45named -> ../init.d/named K46radvd -> ../init.d/radvd K50netdump -> ../init.d/netdump K50snmpd -> ../init.d/snmpd K50snmptrapd -> ../init.d/snmptrapd K50tux -> ../init.d/tux K50vsftpd -> ../init.d/vsftpd K54dovecot -> ../init.d/dovecot K61ldap -> ../init.d/ldap K65kadmin -> ../init.d/kadmin K65kprop -> ../init.d/kprop K65krb524 -> ../init.d/krb524 K65krb5kdc -> ../init.d/krb5kdc K70aep1000 -> ../init.d/aep1000 K70bcm5820 -> ../init.d/bcm5820 K74ypserv -> ../init.d/ypserv K74ypxfrd -> ../init.d/ypxfrd K85mdmpd -> ../init.d/mdmpd K89netplugd -> ../init.d/netplugd K99microcode_ctl -> ../init.d/microcode_ctl S04readahead_early -> ../init.d/readahead_early S05kudzu -> ../init.d/kudzu S06cpuspeed -> ../init.d/cpuspeed S08ip6tables -> ../init.d/ip6tables S08iptables -> ../init.d/iptables S09isdn -> ../init.d/isdn S10network -> ../init.d/network S12syslog -> ../init.d/syslog S13irqbalance -> ../init.d/irqbalance S13portmap -> ../init.d/portmap S15mdmonitor -> ../init.d/mdmonitor S15zebra -> ../init.d/zebra S16bgpd -> ../init.d/bgpd S16ospf6d -> ../init.d/ospf6d S16ospfd -> ../init.d/ospfd S16ripd -> ../init.d/ripd S16ripngd -> ../init.d/ripngd S20random -> ../init.d/random S24pcmcia -> ../init.d/pcmcia S25netfs -> ../init.d/netfs S26apmd -> ../init.d/apmd S27ypbind -> ../init.d/ypbind S28autofs -> ../init.d/autofs S40smartd -> ../init.d/smartd S44acpid -> ../init.d/acpid S54hpoj -> ../init.d/hpoj S55cups -> ../init.d/cups S55sshd -> ../init.d/sshd S56rawdevices -> ../init.d/rawdevices S56xinetd -> ../init.d/xinetd S58ntpd -> ../init.d/ntpd S75postgresql -> ../init.d/postgresql S80sendmail -> ../init.d/sendmail S85gpm -> ../init.d/gpm S87iiim -> ../init.d/iiim S90canna -> ../init.d/canna S90crond -> ../init.d/crond S90xfs -> ../init.d/xfs S95atd -> ../init.d/atd S96readahead -> ../init.d/readahead S97messagebus -> ../init.d/messagebus S97rhnsd -> ../init.d/rhnsd S99local -> ../rc.local
如这个列表所示,所有真正启动和停止服务的脚本都不在 /etc/rc.d/rc5.d/ 目录里。相反,/etc/rc.d/rc5.d/ 里所有文件都是指向 /etc/rc.d/init.d/ 里的脚本的符号链接。在 rc 里使用符号链接,通过创建、修改和删除这些链接,就可以对不同的运行级别进行重新配置,而不需要影响它们所引用的真正的脚本。
每个符号链接的名字都以 K 或者 S 开头。以 K 开头的链接是在这个运行级别需要杀死的进程,而以 S 开头的链接是需要启动的进程。
首先,init 命令通过 /etc/rc.d/init.d/<command> stop 命令来停止目录里的所有 K 符号链接,在这里,<command> 是需要杀死的进程名。然后,它他通过 /etc/rc.d/init.d/<command> start 来启动所有的 S 符号链接。
在系统完成引导后,你也可以 root 登录并执行这些脚本来启动和停止服务。例如,/etc/rc.d/init.d/httpd stop 可用来停止 Apache HTTP 服务器。
每个符号链接都用数字结尾来指明开始的顺序。可以修改这个数字来决定服务启动或停止的顺序。数字越小,就越早开始运行。有着相同数字的符号链接则按字母顺序来运行。
init 程序最后执行的是 /etc/rc.d/rc.local 脚本。这个文件对于定制系统很有用。请参考 第 30.3 节 “在引导时运行其他的程序” 里关于使用 rc.local 文件的更多信息。
在 init 命令已经根据不同的运行级别遍历合适的 rc 目录之后,/etc/inittab 脚本为这个运行级别的每个虚拟控制台(登录提示)复制一个 /sbin/mingetty 进程。运行级别 2 到 5 有所有六个虚拟控制台,而运行级别 1(单用户模式)只有一个,运行级别 0 和 6 则没有虚拟控制台。/sbin/mingetty 进程打开与 tty 设备的通信通道 [14]、设置模式、输出登录提示、接受用户的名字和密码,并初始化登录过程。
在运行级别 5 下,/etc/inittab 会运行一个叫 /etc/X11/prefdm 的脚本。这个 prefdm 脚本执行首选的 X 显示管理器[15] — gdm、kdm 或 xdm,依 /etc/sysconfig/desktop 里的设置而定。
运行完毕后,系统将在运行级别 5 下操作并显示一个登录屏幕。