正確理解Linux運行級別那點事兒
- 2019 年 12 月 17 日
- 筆記

您可以將Linux運行級別視為作業系統運行的不同「模式」。每一種模式或運行級別都有自己的進程和服務列表,這些進程和服務要麼被打開,要麼被關閉。
您在使用電腦的過程中,此運行級別可能會更改,具體取決於作業系統需要訪問的服務類型。
例如,與只在系統上運行命令行的情況相比,使用圖形用戶介面運行Linux機器將需要不同的運行級別。
這是因為圖形用戶介面需要訪問命令行無法訪問的各種服務。為了使系統確定需要打開(或關閉)哪些服務,它會根據需要更改運行級別。
目錄
- Linux運行級別的重要性
- Linux中有幾個運行級別?
- 我當前的運行級別是多少?
- 如何更改當前運行級別?
- Linux systemd targets vs runlevels
- 如何在啟動時更改默認運行級別?
- 運行級別3與運行級別5
- 列出在特定運行級別啟用的服務
- 流程將在哪個運行級別下運行?
- 如何更改應用程式的運行級別?
- Linux中11個運行級別的安全性問題
- 哪個運行級別最適合我?
- 我們可以在Linux中創建新的運行級別嗎?
Linux運行級別的重要性
您可能已經使用Linux多年了,而沒有意識到有不同的運行級別。這是因為大多數伺服器管理員不需要經常配置它。
但是,Linux運行級別確實使管理員能夠更好地控制其管理的系統。
系統所在的運行級別可以更改(我們將在本文後面看到如何更改)以及在運行級別內部運行的服務也可以更改。這使我們可以完全控制系統在任何給定時間都可以訪問哪些服務。
Linux中有幾個運行級別?
Linux中有七個不同的運行級別,從零到六個。不同的發行版可能會以不同的方式使用這七個運行級別,因此要匯總一份運行級別的功能列表並不容易。
相反,您需要檢查運行級別如何在您使用的特定發行版上工作。在大多數情況下,以下列表表示Linux發行版通常如何配置運行級別:
運行級別0將關閉系統。
運行級別1是單用戶模式,用於維護或管理任務。您可能還會看到這種模式,稱為運行級別S(S代表單用戶)。
運行級別2是多用戶模式。該運行級別不使用任何網路服務。
運行級別3是具有聯網功能的多用戶模式。如果您使用的系統無法引導進入GUI(圖形用戶介面),則這是您慣常使用的運行級別。
不使用運行級別4。用戶可以根據自己的目的自定義此運行級別(我們將在本文後面介紹如何執行此操作)。
運行級別5與運行級別3相同,但它還會啟動一個顯示管理器。如果您使用引導進入GUI的系統,則這是您慣常使用的運行級別。
運行級別6重新啟動系統。
我當前的運行級別是多少?
您只需在終端中鍵入「 runlevel」,即可在大多數發行版中看到當前的運行級別。

當前運行級別輸入「運行級別」命令後,它將為您提供兩個不同的數字。第一個數字是系統正在運行的先前運行級別,第二個數字是系統的當前運行級別。
在上面的螢幕截圖中,「 N」是「 none」的縮寫,這意味著該系統以前沒有處於任何不同的運行級別。 「 5」表示我們的系統當前處於運行級別5。
在本示例中,我們正在運行CentOS,該CentOS直接引導到圖形介面,因此系統直接進入運行級5。
如何更改當前運行級別?
您可以使用「 telinit」命令更改系統的當前運行級別。例如,要在CentOS上更改為運行級別3,您可以輸入:
$ telinit 3

請記住,您必須是root用戶才能執行此命令。請注意,運行級別在Debian和Ubuntu上的工作方式有所不同。例如,即使不啟動GUI,Ubuntu也會啟動進入運行級別5。

如果您按照上面的示例,您的螢幕可能會變黑。只要按Alt+F1(或其他功能鍵),你的鍵盤就會被帶到一個工作終端。
如果再次使用「runlevel」命令,我們將看到現在處於運行級別3,並且由於我們剛剛對其進行了更改,因此上一個運行級別被列為5。
Linux systemd targets vs runlevels
近年來,systemd已經取代了長期存在的「 System V init」(運行級別)系統。它仍然以基本相同的方式工作,但是使用了一些新命令,並且通常將「runlevels」稱為「targets」。
- Runlevel 0 = poweroff.target (runlevel0.target)
- Runlevel 1 = rescue.target (runlevel1.target)
- Runlevel 2 = multi-user.target (runlevel2.target)
- Runlevel 3 = multi-user.target (runlevel3.target)
- Runlevel 4 = multi-user.target (runlevel4.target)
- Runlevel 5 = graphical.target (runlevel5.target)
- Runlevel 6 = reboot.target (runlevel6.target)
我們將繼續學習systemd和本教程中需要了解的命令。
如何在啟動時更改默認的運行級別?
有很多原因可能導致您希望啟動到另一個運行級別。例如,系統管理員通常會引導進入命令行,並且僅在必要時才啟動圖形介面。
對於此功能,您需要確保將默認運行級別設置為3,而不是5。
過去,需要在啟動時編輯/ etc / inittab文件以定義默認運行級別。在某些發行版上,您可能仍然會遇到這種情況。
如果使用幾年未升級的作業系統,您仍然會發現此方法很適合您。
$ vi /etc/inittab

在上面的螢幕截圖中,運行級別5當前設置為啟動的默認運行級別。
截至2016年,大多數主要的Linux發行版都已淘汰了/ etc / inittab文件,轉而使用systemd目標。我們將在本文後面介紹這些差異。
您可能會發現您的系統根本沒有/ etc / inittab文件,或者您的inittab文件可能建議您使用systemd,就像這個CentOS系統的截圖一樣。

要檢查系統的當前默認目標:
$ systemctl get-default

在上面的螢幕截圖中,從系統返回的回復是「 graphical.target」。您可能會猜到,這等效於運行級別5。
要查看其他可用目標及其關聯的運行級別,請輸入:
$ ls -l /lib/systemd/system/runlevel*

這些符號鏈接告訴我們,systemd目標的操作方式幾乎與運行級別的操作方式基本相同。那麼,如何在啟動時更改默認運行級別(或目標)?我們需要創建一個新的符號鏈接,如下所示:
$ ln -sf /lib/systemd/system/runlevel3.target /etc/systemd/system/default.target

默認目標此命令會將我們的默認運行級別更改為3,因此,下次重啟時,我們的系統將處於運行級別3,而不是5。如果您想要一個不同的運行級別,只需用一個不同的數字代替命令中的「 3」即可。
作為參考,該命令中的-f開關指示在創建新鏈接之前應刪除目標文件。您也可以先使用簡單的rm命令將其刪除。
您可以再次確認使用「 systemctl get-default」命令成功地進行了更改。

運行級別3vs運行級別5
您將聽到並使用最多的兩個運行級別分別是3和5。基本上可以歸結為:runlevel 3是一個命令行,而runlevel 5是一個圖形用戶介面。
當然,並非每個發行版都遵循此約定,並且您的系統可以由管理員配置,以使這些運行級別具有更多差異。
但是,這就是它的工作原理。如果您想確切了解在這兩個運行級別上啟用了哪些服務,我們將在下一部分中介紹。
列出在特定運行級別啟用的服務
直到最近幾年,「 chkconfig –list」是列出將在不同運行級別啟用的服務的命令。如果您的作業系統是最新的,則該命令可能會給您帶來錯誤或將您轉向systemd。

如果要查看引導到圖形模式(運行級別5)時將啟動什麼服務,可以運行以下命令:
$ systemctl list-dependencies graphical.target

列出服務要查看默認情況下在其他運行級別上運行的服務,只需將「 graphical.target」替換為您需要查看的目標名稱。
流程將在哪個運行級別下運行?
如果您想查看特定服務在哪個運行級別運行,可以使用以下命令:
$ systemctl show -p WantedBy [name of service]
例如,如果您想查看SSH守護進程將在哪個運行級別運行,請鍵入:
$ systemctl show -p WantedBy sshd.service

根據以上螢幕截圖中的輸出,SSH服務將在運行級別2、3和4(multi-user.target)上啟動。
如何更改應用程式的運行級別?
如上所示,我們的SSH服務僅在2-4級運行(multi-user.target)。如果我們還希望它在啟動圖形介面-運行級別5(graphical.target)時啟動,該怎麼辦?我們可以通過以下命令應用該配置:
$ systemctl enable sshd.service

Linux中運行級別的安全性問題
正如我們在本文前面所說的,Linux運行級別的重點是使管理員可以控制在特定條件下運行的服務。對系統進行這種細粒度控制可以增強安全性,因為您可以確保沒有多餘的服務在運行。
當管理員不知道確切正在運行什麼服務時,就會出現問題,因此不必費心保護這些攻擊面。
您可以使用本指南中的方法來配置默認運行級別並控制正在運行的應用程式。這些做法不僅可以釋放系統資源,還可以使伺服器更安全。
記住,只使用所需的運行級別。例如,如果僅打算使用終端,則沒有必要啟動運行級別5(圖形介面)。
更改為不同的運行級別將引入多個新服務,其中一些服務可能會在後台完全運行,您可能會忘記保護它們。
哪個運行級別最適合我?
確定哪種運行級別對您來說是最好的,取決於具體的情況。通常,您可能會定期使用運行級別3和5。
如果您熟悉命令行,並且不需要圖形介面,則運行級別3(在大多數發行版中)將是最適合您的。
這將阻止不必要的服務運行。另一方面,如果您想要更多的桌面體驗和圖形介面來使用各種應用程式等,則運行級別5將是您的首選運行級別。
如果需要在生產伺服器上執行維護,則運行級別1非常適合這種情況。這用於確保您是伺服器上的唯一伺服器(甚至沒有啟動網路服務),並且可以不間斷地執行維護。
在極少數情況下,您甚至可能需要使用運行級別4。這僅在您或系統管理員具有自定義配置的運行級別的特定情況下使用。我們將在下一部分中介紹如何做到這一點。
如您所料,您不會(也無法)在運行級別0或6上運行系統,但是可以切換到它們以重新啟動或關閉電源。通常不需要這樣做,因為還有其他命令可以幫助我們完成此任務。
我們可以在Linux中創建新的運行級別嗎?
在Linux中創建新的運行級別是可能的,但是您不太可能需要這樣做。如果確定要執行此操作,則可以從複製現有的systemd目標之一開始,然後使用自己的自定義進行編輯。
目標位於:
/usr/lib/systemd/system
如果要基於graphical.target(運行級別5)作為新的運行級別/目標,請將該目錄複製到新的目標目錄。
$ cp /usr/lib/systemd/system/graphical.target /usr/lib/systemd/system/mynew.target
之後,創建一個新的「 wants」目錄,如下所示:
$ mkdir /etc/systemd/system/mynew.target.wants
然後從/ usr / lib / systemd / system符號鏈接為新的運行級別啟用其他服務。

