F.2.4. /sbin/init 程序
/sbin/init
程序(也称作 init
)协调余下的引导过程并为用户配置环境。
当
init
命令启动时,它成为系统里所有自动启动程序的父程序或者祖父(grandparent)程序。首先,它运行 /etc/rc.d/rc.sysinit
脚本设置环境路径、启动 swap、检查文件系统并执行所有系统初始化所需的其他步骤。例如,多数系统会使用时钟,因此 rc.sysinit
读取 /etc/sysconfig/clock
配置文件来初始化硬件时钟。另外一个示例是,如果有必须初始化的特殊串口程序,rc.sysinit
会执行 /etc/rc.serial
脚本。
然后
init
命令处理 /etc/event.d
目录中的任务,这些任务描述了在每个SysV 初始化运行级别中应该如何设置系统。运行级别(runlevel)是一个状态或者模式,它由 SysV /etc/rc.d/rc<x>.d/
目录中列出的服务定义,其中 <x> 是运行级别号。有关 SysV init 运行级别的详情,请参考 第 F.4 节 “SysV Init 运行级别”。
接下来
init
命令为系统设置源功能库,/etc/rc.d/init.d/functions
,它可配置如何启动、杀死程序以及确定程序的程序号(PID)。
init
通过在正确 rc
目录中查找 /etc/inittab
中指定的运行级别启动所有后台进程。对 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 服务器。
为每个符号链接编号来指定启动顺序。可以更改这个数字可改变服务启动或停止的顺序。数字越小,就越早启动。有着相同数字的符号链接则按字母顺序启动。
注意
After the
init
command has progressed through the appropriate rc
directory for the runlevel, Upstart forks an /sbin/mingetty
process for each virtual console (login prompt) allocated to the runlevel by the job definition in the /etc/event.d
directory. Runlevels 2 through 5 have all six virtual consoles, while runlevel 1 (single user mode) has one, and runlevels 0 and 6 have none. The /sbin/mingetty
process opens communication pathways to tty devices[18], sets their modes, prints the login prompt, accepts the user's username and password, and initiates the login process.
In runlevel 5, Upstart runs a script called
/etc/X11/prefdm
. The prefdm
script executes the preferred X display manager[19] — gdm
, kdm
, or xdm
, depending on the contents of the /etc/sysconfig/desktop
file.
完成后,系统将在运行级别 5 中运行并显示登录屏幕。
[19]
Refer to the Red Hat Enterprise Linux Deployment Guide for more information about display managers.