首頁 > 軟體

漫談傳統的 Linux 初始化系統的執行級別

2020-06-16 17:08:10

了解執行級別是如何設定的,如何改變系統執行級別以及修改對應狀態下執行的服務。

在 Linux 系統中,執行級別run level是指運維的級別,用於描述一種表明什麼服務是可用的系統執行狀態。

執行級別 1 是嚴格限制的,僅僅用於系統維護;該級別下,網路連線將不可操作,但是管理員可以通過控制台連線登入系統。

其他執行級別的系統允許任何人登入和使用,但是不同級別中可使用的服務不同。本文將探索如何設定執行級別,如何互動式改變系統執行級別以及修改該狀態下可用的服務。

Linux 系統的預設執行狀態是一個在系統開機時使用的執行級別(除非有其他的指示),它通常是在 /etc/inittab 檔案中進行設定的,該檔案內容通常如下:

  1. id:3:initdefault

包括 Debian 系統在內的一些系統,預設執行級別為 2,而不是上述檔案中的 3,甚至都沒有 /etc/inittab 檔案。

執行級別在預設情況下是如何被設定,其設定依賴於你所執行的 Linux 作業系統的具體發行版本。 例如,在某些系統中, 執行級別 2 是多使用者模式,執行級別 3 是多使用者模式並支援 NFS (網路檔案系統)。 在另外一些系統,執行級別 2 - 5 基本相同,執行級別 1 是單使用者模式。例如,Debian 系統的所用執行級別如下:

  1. 0=停機
  2. 1=單使用者(維護模式)
  3. 2=多使用者模式
  4. 3-5=2一樣
  5. 6=重新啟動

在 Linux 系統上,執行級別 3 用於共用檔案系統給其它系統,可以方便地只通過改變系統的執行級別來啟動和停止檔案系統共用。系統從執行級別 2 改變到 3 系統將允許檔案系統共用,反之從執行級別 3 改變到 2 則系統不支援檔案系統共用。

在某個執行級別中,系統執行哪些進程依賴於目錄 /etc/rc?.d 目錄的內容,其中 ? 可以是 2、 3、 4 或 5 (對應於相應的執行級別)。

在以下範例中(Ubuntu 系統),由於這些目錄的設定是相同的,我們將看見上述 4 個級別對應的目錄中的內容是一致的。

  1. /etc/rc2.d$ ls
  2. README S20smartmontools S50saned S99grub-common
  3. S20kerneloops S20speech-dispatcher S70dns-clean S99ondemand
  4. S20rsync S20sysstat S70pppd-dns S99rc.local
  5. /etc/rc2.d$ cd../rc3.d
  6. /etc/rc3.d$ ls
  7. README S20smartmontools S50saned S99grub-common
  8. S20kerneloops S20speech-dispatcher S70dns-clean S99ondemand
  9. S20rsync S20sysstat S70pppd-dns S99rc.local
  10. /etc/rc3.d$ cd../rc4.d
  11. /etc/rc4.d$ ls
  12. README S20smartmontools S50saned S99grub-common
  13. S20kerneloops S20speech-dispatcher S70dns-clean S99ondemand
  14. S20rsync S20sysstat S70pppd-dns S99rc.local
  15. /etc/rc4.d$ cd../rc5.d
  16. /etc/rc5.d$ ls
  17. README S20smartmontools S50saned S99grub-common
  18. S20kerneloops S20speech-dispatcher S70dns-clean S99ondemand
  19. S20rsync S20sysstat S70pppd-dns S99rc.local

這些都是什麼檔案?它們都是指向 /etc/init.d 目錄下用於啟動服務的指令碼符號連線。 這些檔案的檔名是至關重要的, 因為它們決定了這些指令碼檔案的執行順序,例如, S20 指令碼是在 S50 指令碼前面執行的。

  1. $ ls-l
  2. total 4
  3. -rw-r--r--1 root root 677Feb162016 README
  4. lrwxrwxrwx 1 root root 20Aug3014:40 S20kerneloops ->../init.d/kerneloops
  5. lrwxrwxrwx 1 root root 15Aug3014:40 S20rsync ->../init.d/rsync
  6. lrwxrwxrwx 1 root root 23Aug3016:10 S20smartmontools ->../init.d/smartmontools
  7. lrwxrwxrwx 1 root root 27Aug3014:40 S20speech-dispatcher ->../init.d/speech-dispatcher
  8. lrwxrwxrwx 1 root root 17Aug3114:12 S20sysstat ->../init.d/sysstat
  9. lrwxrwxrwx 1 root root 15Aug3014:40 S50saned ->../init.d/saned
  10. lrwxrwxrwx 1 root root 19Aug3014:40 S70dns-clean ->../init.d/dns-clean
  11. lrwxrwxrwx 1 root root 18Aug3014:40 S70pppd-dns ->../init.d/pppd-dns
  12. lrwxrwxrwx 1 root root 21Aug3014:40 S99grub-common ->../init.d/grub-common
  13. lrwxrwxrwx 1 root root 18Aug3014:40 S99ondemand ->../init.d/ondemand
  14. lrwxrwxrwx 1 root root 18Aug3014:40 S99rc.local->../init.d/rc.local

如你所想,目錄 /etc/rc1.d 因執行級別 1 的特殊而不同。它包含的符號連結指向非常不同的一套指令碼。 同樣也要注意到其中一些指令碼以 K 開頭命名,而另一些與其它執行級別指令碼一樣以 S 開頭命名。這是因為當系統進入單使用者模式時, 一些服務需要停止。 然而這些 K 開頭的符號連結指向了其它級別 S 開頭的符號連結的同一檔案時, K(kill)表示這個指令碼將以指示其停止的引數執行,而不是以啟動的引數執行。

  1. /etc/rc1.d$ ls-l
  2. total 4
  3. lrwxrwxrwx 1 root root 20Aug3014:40 K20kerneloops ->../init.d/kerneloops
  4. lrwxrwxrwx 1 root root 15Aug3014:40 K20rsync ->../init.d/rsync
  5. lrwxrwxrwx 1 root root 15Aug3014:40 K20saned ->../init.d/saned
  6. lrwxrwxrwx 1 root root 23Aug3016:10 K20smartmontools ->../init.d/smartmontools
  7. lrwxrwxrwx 1 root root 27Aug3014:40 K20speech-dispatcher ->../init.d/speech-dispatcher
  8. -rw-r--r--1 root root 369Mar122014 README
  9. lrwxrwxrwx 1 root root 19Aug3014:40 S30killprocs ->../init.d/killprocs
  10. lrwxrwxrwx 1 root root 19Aug3014:40 S70dns-clean ->../init.d/dns-clean
  11. lrwxrwxrwx 1 root root 18Aug3014:40 S70pppd-dns ->../init.d/pppd-dns
  12. lrwxrwxrwx 1 root root 16Aug3014:40 S90single ->../init.d/single

你可以改變系統的預設執行級別,儘管這很少被用到。例如,通過修改前文中提到的 /etc/inittab 檔案,你能夠設定 Debian 系統的預設執行級別為 3 (而不是 2),以下是該檔案範例:

  1. id:3:initdefault:

一旦你修改完成並重新啟動系統, runlevel 命令將顯示如下:

  1. $ runlevel
  2. N 3

另外一種可選方式,使用 init 3 命令,你也能改變系統執行級別(且無需重新啟動立即生效), runlevel 命令的輸出為:

  1. $ runlevel
  2. 23

當然,除非你修改了系統預設級別的 /etc/rc?.d 目錄下的符號連結,使得系統預設執行在一個修改的執行級別之下,否則很少需要通過建立或修改 /etc/inittab 檔案改變系統的執行級別。

 

在 Linux 系統中如何使用執行級別?

為了扼要重述在系統中如何使用執行級別,下面有幾個關於執行級別的快速問答問題:

如何查詢系統當前的執行級別?

使用 runlevel 命令。

如何檢視特定執行級別所關聯的服務進程?

檢視與該執行級別關聯的執行級別開始目錄(例如, /etc/rc2.d 對應於執行級別 2)。

如何檢視系統的預設執行級別?

首先,檢視 /etc/inittab 檔案是否存在。如果不存在,就執行 runlevel 命令查詢,你一般就已經處在該執行級別。

如何改變系統執行級別?

init 命令(例如 init 3)臨時改變執行級別,通過修改或建立 /etc/inittab 檔案永久改變其執行級別。

能改變特定執行級別下執行的服務麼?

當然,通過改變對應的 /etc/rc?.d 目錄下的符號連線即可。

還有一些其他的什麼需要考慮?

當改變系統執行級別時,你應該特別小心,確保不影響到系統上正在執行的服務或者正在使用的使用者。

(題圖:Vincent Desjardins (CC BY 2.0)


via: https://www.networkworld.com/article/3222070/linux/maneuvering-around-run-levels-on-linux.html

作者:Sandra Henry-Stocker 譯者:penghuster 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

本文永久更新連結地址http://www.linuxidc.com/Linux/2017-09/146844.htm


IT145.com E-mail:sddin#qq.com