F.2.4. /sbin/init 程式

/sbin/init 程式(亦稱為 init)可管理剩下的開機過程和使用者環境的設定。
init 指令啟動後,它將自動成為所有系統啟始過程的親項。首先它會執行 /etc/rc.d/rc.sysinit script,這個 script 會設定環境路徑、啟動 swap、檢測檔案系統,和執行其它所有系統啟動所需的步驟。例如大部分的系統都採用時鐘,所以 rc.sysinit 會讀取 /etc/sysconfig/clock 配置檔案來啟用硬體時鐘。另一個範例就是,如果有必須要初始化的特殊序列通訊埠程序,rc.sysinit 將會執行 /etc/rc.serial 檔案。
init 指令接著會處理 /etc/event.d 目錄中的工作,這列出了系統中每個 SysV init runlevel 的設定方式。執行層級(runlevel)屬於一個狀態或模式,由列於 SysV /etc/rc.d/rc<x>.d/ 目錄中的服務所定義,<x> 代表 runlevel 的編號。欲取得更多有關於 SysV init runlevel 的相關資訊,請參閱 節 F.4, “SysV Init Runlevel”
接下來,init 指令會替系統設定資源功能函式庫 /etc/rc.d/init.d/functions,這可用來設定如何啟動、刪除以及決定一項程式的 PID。
init 程式會從適當的 rc 目錄中,尋找在 /etc/inittab 中被指定為預設的 runlevel,以啟動所有的背景程序。rc 目錄會被編號來對應於它們所表示的 runlevel。比方說,/etc/rc.d/rc5.d/ 代表 runlevel 5 的目錄。
在啟動 runlevel 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/ 目錄中,沒有任何一個 script 可用來啟始或停止服務。而所有位於 /etc/rc.d/rc5.d/ 中的檔案皆為符號連結檔(symbolic links),指向了位於 /etc/rc.d/init.d/ 目錄中的 script。在每個 rc 目錄中皆可使用符號連結,如此一來可以在不影響實際的 script 的情況下藉由建立、修改和刪除符號連結來重新設定 runlevel。
符號連結的名稱會以一個 KS 來作為起始。K 連結代表 runlevel 中被刪除(killed)的程序,而以 S 作為起始的名稱則代表已被啟用。
init 指令會先透過發出 /etc/rc.d/init.d/<command> stop 指令來停止目錄中所有的 K 符號連結,而 <command> 則是即將被刪除的程序。接著它便會藉由發出 /etc/rc.d/init.d/<command> start 來啟動所有的 S 符號連結。

注意

在系統完成開機程序後,您可以 root 身份登入並執行一樣的 script 來啟用或停止服務。例如,/etc/rc.d/init.d/httpd stop 指令可被用來停止 Apache HTTP 伺服器。
每個符號連結都被以指定啟始順序進行編號。啟始或停止服務的順序可以透過更改編號來修改。編號越小,將會越先啟始。編號相同的符號連結則是以英文字母順序來決定啟始順序。

注意

init 程式執行的最後一個檔案為 /etc/rc.d/rc.local。這個檔案適用於系統自訂化。欲取得更多有關於使用 rc.local 檔案上的相關資訊,請參閱 節 F.3, “在開機時執行其它程式”
init 指令在適當 runlevel 的 rc 目錄中執行之後,Upstart 便會為各個虛擬主控台(登錄提示符號)fork 一項 /sbin/mingetty 程序,這些虛擬主控台會根據 /etc/event.d 中的工作定義被分配至 runlevel。Runlevel 2 到 5 擁有全部的六個虛擬主控台,而 runlevel 1(單機使用者模式)只有一個,runlevel 0 和 6 則是完全沒有。/sbin/mingetty 程序會開啟 tty 裝置[18]的通訊路徑,以設定它們的模式、列印登入提示、接受使用者的名稱與密碼,以及初始化登錄程序。
在 runlevel 5 中,Upstart 會執行一項稱為 /etc/X11/prefdm 的 script。prefdm script 會執行偏好的 X 顯示管理員[19]gdmkdm 或是 xdm,取決於 /etc/sysconfig/desktop 檔案的內容。
在結束之後,系統會在 runlevel 5 模式下進行作業,並顯示登入畫面。


[18] 欲取得更多有關於 tty 裝置上的相關資訊,請參閱 Red Hat Enterprise Linux《建置指南》。
[19] 欲取得更多有關於顯示管理員上的相關資訊,請參閱 Red Hat Enterprise Linux 《建置指南》。