Show Table of Contents
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。
符號連結的名稱會以一個
K 或 S 來作為起始。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] — gdm、kdm 或是 xdm,取決於 /etc/sysconfig/desktop 檔案的內容。
在結束之後,系統會在 runlevel 5 模式下進行作業,並顯示登入畫面。

Where did the comment section go?
Red Hat's documentation publication system recently went through an upgrade to enable speedier, more mobile-friendly content. We decided to re-evaluate our commenting platform to ensure that it meets your expectations and serves as an optimal feedback mechanism. During this redesign, we invite your input on providing feedback on Red Hat documentation via the discussion platform.