/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 运行级别的详情,请参考
第 F.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
符号链接。
Note
在系统完成引导后,你也可以 root 登录并执行这些脚本来启动和停止服务。例如,/etc/rc.d/init.d/httpd stop
可用来停止 Apache HTTP 服务器。
每个符号链接都用数字结尾来指明开始的顺序。可以修改这个数字来决定服务启动或停止的顺序。数字越小,就越早开始运行。有着相同数字的符号链接则按字母顺序来运行。
After the init
command has progressed through the appropriate rc
directory for the runlevel, the /etc/inittab
script forks an /sbin/mingetty
process for each virtual console (login prompt) allocated to the runlevel. 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[], sets their modes, prints the login prompt, accepts the user's username and password, and initiates the login process.
In runlevel 5, the /etc/inittab
runs a script called /etc/X11/prefdm
. The prefdm
script executes the preferred X display manager[] — gdm
, kdm
, or xdm
, depending on the contents of the /etc/sysconfig/desktop
file.
运行完毕后,系统将在运行级别 5 下操作并显示一个登录屏幕。