當執行到一個執行級別時,它會執行以前的執行級別嗎?
如果我告訴我的系統進入執行級別 3,這是否意味著它首先執行執行級別 0、1、2,然後最終執行執行級別 3?
我認為這個問題的答案是肯定的。但是當我查看我的 RHEL 6 系統時,我發現許多 rcX.d 目錄都包含相同的符號連結。
在我的**/etc/rc.d/rc0.d/**
[root@centos6 rc.d]# ls -lah /etc/rc.d/rc0.d/ total 8.0K drwxr-xr-x. 2 root root 4.0K Jun 27 11:59 . drwxr-xr-x. 10 root root 4.0K Jul 9 15:06 .. lrwxrwxrwx. 1 root root 13 Jun 12 13:02 K05atd -> ../init.d/atd lrwxrwxrwx. 1 root root 14 Jun 12 13:01 K10cups -> ../init.d/cups lrwxrwxrwx. 1 root root 19 Jun 12 10:57 K10saslauthd -> ../init.d/saslauthd lrwxrwxrwx. 1 root root 18 Jun 12 12:51 K15svnserve -> ../init.d/svnserve lrwxrwxrwx. 1 root root 14 Jun 12 10:58 K25sshd -> ../init.d/sshd lrwxrwxrwx. 1 root root 17 Jun 12 10:57 K30postfix -> ../init.d/postfix lrwxrwxrwx. 1 root root 17 Jun 12 12:26 K50dnsmasq -> ../init.d/dnsmasq lrwxrwxrwx. 1 root root 20 Jun 12 10:57 K50netconsole -> ../init.d/netconsole lrwxrwxrwx. 1 root root 15 Jun 12 10:57 K60crond -> ../init.d/crond lrwxrwxrwx. 1 root root 25 Jun 27 11:59 K65vboxadd-service -> ../init.d/vboxadd-service lrwxrwxrwx. 1 root root 17 Jun 27 11:58 K70vboxadd -> ../init.d/vboxadd lrwxrwxrwx. 1 root root 21 Jun 27 11:59 K70vboxadd-x11 -> ../init.d/vboxadd-x11 lrwxrwxrwx. 1 root root 17 Jun 12 12:26 K73winbind -> ../init.d/winbind lrwxrwxrwx. 1 root root 19 Jun 12 12:26 K74haldaemon -> ../init.d/haldaemon lrwxrwxrwx. 1 root root 26 Jun 12 10:58 K75blk-availability -> ../init.d/blk-availability lrwxrwxrwx. 1 root root 15 Jun 12 11:15 K75netfs -> ../init.d/netfs lrwxrwxrwx. 1 root root 19 Jun 12 10:57 K75udev-post -> ../init.d/udev-post lrwxrwxrwx. 1 root root 24 Jun 12 12:26 K84NetworkManager -> ../init.d/NetworkManager lrwxrwxrwx. 1 root root 24 Jun 27 11:59 K84wpa_supplicant -> ../init.d/wpa_supplicant lrwxrwxrwx. 1 root root 19 Jun 12 10:58 K85mdmonitor -> ../init.d/mdmonitor lrwxrwxrwx. 1 root root 20 Jun 12 12:25 K85messagebus -> ../init.d/messagebus lrwxrwxrwx. 1 root root 20 Jun 12 10:58 K87multipathd -> ../init.d/multipathd lrwxrwxrwx. 1 root root 21 Jun 12 10:57 K87restorecond -> ../init.d/restorecond lrwxrwxrwx. 1 root root 16 Jun 12 10:58 K88auditd -> ../init.d/auditd lrwxrwxrwx. 1 root root 15 Jun 27 11:59 K88iscsi -> ../init.d/iscsi lrwxrwxrwx. 1 root root 17 Jun 12 10:57 K88rsyslog -> ../init.d/rsyslog lrwxrwxrwx. 1 root root 16 Jun 12 10:58 K89iscsid -> ../init.d/iscsid lrwxrwxrwx. 1 root root 21 Jun 12 13:01 K89portreserve -> ../init.d/portreserve lrwxrwxrwx. 1 root root 15 Jun 12 11:15 K89rdisc -> ../init.d/rdisc lrwxrwxrwx. 1 root root 17 Jun 12 11:15 K90network -> ../init.d/network lrwxrwxrwx. 1 root root 19 Jun 12 10:57 K92ip6tables -> ../init.d/ip6tables lrwxrwxrwx. 1 root root 18 Jun 12 10:57 K92iptables -> ../init.d/iptables lrwxrwxrwx. 1 root root 22 Jun 12 10:58 K99lvm2-monitor -> ../init.d/lvm2-monitor lrwxrwxrwx. 1 root root 17 Jun 12 11:15 S00killall -> ../init.d/killall lrwxrwxrwx. 1 root root 14 Jun 12 11:15 S01halt -> ../init.d/halt lrwxrwxrwx. 1 root root 15 Jun 26 12:32 S95jexec -> ../init.d/jexec
在**/etc/rc.d/rc1.d/**中,我看到了與 rc0.d 中相同的一組符號連結以及額外的連結。這似乎表明目錄 rc0.d, rc1.d 是獨立的,並且要進入執行級別 1,它不會執行執行級別 0 中的內容。這意味著如果 rc0 中的符號連結如何,可能會發生不好的事情.d 沒有在 rc1.d 中完全複製,… 等等。
那麼它是如何真正起作用的呢?它只是掃描特定 rc.X 目錄中的文件還是遍歷所有級別低於傳遞給 init 的 rc 級別的 rc.X 目錄?
[root@centos6 rc.d]# ls -lah /etc/rc.d/rc1.d/ total 8.0K drwxr-xr-x. 2 root root 4.0K Jun 27 11:59 . drwxr-xr-x. 10 root root 4.0K Jul 9 15:06 .. lrwxrwxrwx. 1 root root 13 Jun 12 13:02 K05atd -> ../init.d/atd lrwxrwxrwx. 1 root root 14 Jun 12 13:01 K10cups -> ../init.d/cups lrwxrwxrwx. 1 root root 19 Jun 12 10:57 K10saslauthd -> ../init.d/saslauthd lrwxrwxrwx. 1 root root 18 Jun 12 12:51 K15svnserve -> ../init.d/svnserve lrwxrwxrwx. 1 root root 14 Jun 12 10:58 K25sshd -> ../init.d/sshd lrwxrwxrwx. 1 root root 17 Jun 12 10:57 K30postfix -> ../init.d/postfix lrwxrwxrwx. 1 root root 17 Jun 12 12:26 K50dnsmasq -> ../init.d/dnsmasq lrwxrwxrwx. 1 root root 20 Jun 12 10:57 K50netconsole -> ../init.d/netconsole lrwxrwxrwx. 1 root root 15 Jun 12 10:57 K60crond -> ../init.d/crond lrwxrwxrwx. 1 root root 25 Jun 27 11:59 K65vboxadd-service -> ../init.d/vboxadd-service lrwxrwxrwx. 1 root root 17 Jun 27 11:58 K70vboxadd -> ../init.d/vboxadd lrwxrwxrwx. 1 root root 21 Jun 27 11:59 K70vboxadd-x11 -> ../init.d/vboxadd-x11 lrwxrwxrwx. 1 root root 17 Jun 12 12:26 K73winbind -> ../init.d/winbind lrwxrwxrwx. 1 root root 19 Jun 12 12:26 K74haldaemon -> ../init.d/haldaemon lrwxrwxrwx. 1 root root 15 Jun 12 11:15 K75netfs -> ../init.d/netfs lrwxrwxrwx. 1 root root 24 Jun 12 12:26 K84NetworkManager -> ../init.d/NetworkManager lrwxrwxrwx. 1 root root 24 Jun 27 11:59 K84wpa_supplicant -> ../init.d/wpa_supplicant lrwxrwxrwx. 1 root root 19 Jun 12 10:58 K85mdmonitor -> ../init.d/mdmonitor lrwxrwxrwx. 1 root root 20 Jun 12 12:25 K85messagebus -> ../init.d/messagebus lrwxrwxrwx. 1 root root 20 Jun 12 10:58 K87multipathd -> ../init.d/multipathd lrwxrwxrwx. 1 root root 21 Jun 12 10:57 K87restorecond -> ../init.d/restorecond lrwxrwxrwx. 1 root root 16 Jun 12 10:58 K88auditd -> ../init.d/auditd lrwxrwxrwx. 1 root root 15 Jun 27 11:59 K88iscsi -> ../init.d/iscsi lrwxrwxrwx. 1 root root 17 Jun 12 10:57 K88rsyslog -> ../init.d/rsyslog lrwxrwxrwx. 1 root root 16 Jun 12 10:58 K89iscsid -> ../init.d/iscsid lrwxrwxrwx. 1 root root 21 Jun 12 13:01 K89portreserve -> ../init.d/portreserve lrwxrwxrwx. 1 root root 15 Jun 12 11:15 K89rdisc -> ../init.d/rdisc lrwxrwxrwx. 1 root root 17 Jun 12 11:15 K90network -> ../init.d/network lrwxrwxrwx. 1 root root 19 Jun 12 10:57 K92ip6tables -> ../init.d/ip6tables lrwxrwxrwx. 1 root root 18 Jun 12 10:57 K92iptables -> ../init.d/iptables lrwxrwxrwx. 1 root root 22 Jun 12 10:58 S02lvm2-monitor -> ../init.d/lvm2-monitor lrwxrwxrwx. 1 root root 26 Jun 12 10:58 S25blk-availability -> ../init.d/blk-availability lrwxrwxrwx. 1 root root 19 Jun 12 10:57 S26udev-post -> ../init.d/udev-post lrwxrwxrwx. 1 root root 15 Jun 26 12:32 S95jexec -> ../init.d/jexec lrwxrwxrwx. 1 root root 16 Jun 12 11:15 S99single -> ../init.d/single
當您切換執行級別時,唯一執行的就是
/etc/rc.d/rc${NEW_LEVEL}.d/
.這意味著您是對的:從另一個執行級別切換時,每個
rc*.d
目錄都需要能夠處理**所有程序/服務更改。**因此,每個 rc 目錄都包含一整套用於達到該執行級別的腳本。假設您正在切換到執行級別 3。
/etc/rc.d/rc3.d/K*
腳本將嘗試終止在您之前的執行級別中執行的任何程序(可以是任何數字),並且/etc/rc.d/rc3.d/S*
腳本將啟動任何需要啟動的程序(並且尚未啟動)從上一個執行級別開始)。顯然,管理所有這些符號連結將是一件非常痛苦的事情,因此有一些實用程序可以幫助管理它。在 Debian 和 Ubuntu(至少,也許是其他)上,您可以使用
update-rc.d
選擇性地啟用/禁用在 中找到的腳本/etc/init.d
,或者將它們設置為每個腳本的“預設”或推薦設置。這將為您創建和更新所有符號連結,以反映您想要進行的任何配置更改。在 CentOS 上,我知道你可以使用ntsysv
或chkconfig
做同樣的事情。實際上,您永遠不會自己觸摸
/etc/rc*.d/
(或/etc/rc.d/rc*.d/
)中的文件;您總是使用工具(例如update-rc.d
、ntsysv
、chkconfig
)進行任何更改。
如果我告訴我的系統進入執行級別 3,這是否意味著它首先執行執行級別 0、1、2,然後最終執行執行級別 3?
不,不是的。以這種方式執行級別不是連續的。
恰當的例子:執行級別 0通常是“關閉”執行級別,它停止所有服務並最終停止(並可能關閉)系統。如果為了獲得一個完全執行的系統,init 首先進入執行級別 0,那將不是很好。
也就是說,在引導過程中**通常會有一個進展。核心在執行級別 1 中初始化,然後將控制權傳遞給 init,通常配置為進入執行級別 2(無網路的多使用者),然後是執行級別 3(完全可操作的文本模式),可能還有執行級別 5(完全可操作)圖形模式)。但這實際上是完全可配置的,並且執行級別的細節主要是按照慣例。我認為至少在過去,Debian 已經將執行級別 4 用於完全可操作的圖形模式,例如,在我的 Debian Wheezy 上,執行級別 2 和 3 似乎是相同的(不輸出任何內容)。每個執行級別對應的確切內容取決於管理員。
diff <(ls /etc/rc2.d) <(ls /etc/rc3.d)
同樣按照慣例,執行級別 6 通常設置為重新啟動系統;您可以直接從執行級別 1 跳轉到執行級別 6,尤其是在系統維護期間,如果某些東西阻止了作業系統正常啟動。
還值得注意的是,非 Linux 系統可能對不同執行級別的用途有不同的想法,或者有不同數量的可用執行級別。這個概念在 *nix 世界中可能非常普遍,但實現和實際使用可能會有很大差異。
總而言之,“執行級別”只是一種將相關程序和系統狀態分組到管理員可以選擇的可管理捆綁包中的便捷方式。(順便說一句,Windows 有一個非常相似的概念,它的故障安全模式、網路故障安全、命令提示符的故障安全、正常啟動等等。)