九、 運行級別
1 、 Linux 系統的運行級別 (runlevel)
Linux 系統有 7 個運行級別, Linux 系統任何時候都運行在一個指定的運行級別上,不同的運行級
別所運行的程序和服務不盡相同,所要完成的工作和要達到的目的也不相同
· 運行級別 0 系統停機 (halt) 狀態,系統的默認運行級別不能設為 0 ,否則不能正常啟動
· 運行級別 1 單用戶工作 (single user) 狀態, root 權限,用于系統維護,禁止遠程登陸
· 運行級別 2 多用戶 (multiuser) 狀態 ( 沒有 NFS)
· 運行級別 3 完全的多用戶 (multiuser) 狀態 ( 有 NFS) ,登陸后進入控制臺命令行模式
· 運行級別 4 系統未使用,保留
· 運行級別 5 X11 控制臺 (xdm 、 gdm 、 kdm) ,登陸后進入圖形 GUI 模式 · 運行級別 6 系統正常關閉并重啟 (reboot) ,默認運行級別不能設為 6 ,否則不能正常啟動
2 、運行級別的原理
在目錄 /etc/rc.d/init.d 下有許多服務器腳本程序,一般稱為服務 (service) , 在 /etc/rc.d 下
有 7 個名為 rcN.d 的目錄,其中 N=0-6 ,對應于系統的 7 個運行級別, rcN.d 目錄下,都是
一些符號鏈接文件,這些鏈接文件都指向 init.d 目錄下的 service 腳本文件,這些鏈接文件的命
名規則是 "K+nn+ 服務名 " 或 "S+nn+ 服務名 " ,其中 nn 為 2 位數字:
例 : rc3.d 目錄下的鏈接文件 S80sendmail 就指向 service 腳本文件 ../init.d/sendmail
系統會根據指定的 runlevel 進入對應的 rcN.d 目錄,并按照文件名順序檢索目錄下的鏈接文件
? 對于以 K 為開頭的鏈接文件,系統將終止對應的服務
? 對于以 S 為開頭的鏈接文件,系統將啟動對應的服務
通過這種方式來實現 " 不同的運行級別運行不同的程序和服務 "
3 、 /etc/inittab 配置文件詳解
init 的進程號是 1 ,從這一點就能看出, init 進程是系統所有進程的起點, Linux 在完成核內引導以后,
就開始運行 init 程序, init 程序需要讀取設置文件 /etc/inittab 。 inittab 是個不可執行的文本文件,他有若
干行指令所組成。在 Redhat 系統中, inittab 的內容如下所示 ( 以“ ###" 開始的中注釋為筆者增加的 ) :
( 如果你改變了 inittab 文件,那么要使他立即生效,需要使用一個命令: init q )
#
# inittab This file describes how the INIT process should set up
# the system in a certain run-level.
#
# Author: Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
# Modified for RHS Linux by Marc Ewing and Donnie Barnes
#
# Default runlevel. The runlevels used by RHS are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
#
### 表示當前缺省運行級別為 5(initdefault) ;
id:5:initdefault:
### 啟動時自動執行 /etc/rc.d/rc.sysinit 腳本 (sysinit)
# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2 l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
### 當運行級別為 5 時,以 5 為參數運行 /etc/rc.d/rc 腳本, init 將等待其返回 (wait)
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
### 在啟動過程中允許按 CTRL-ALT-DELETE 重啟系統
# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
# When our UPS tells us power has failed, assume we have a few minutes
# of power left. Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly.
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
# If power was restored before the shutdown kicked in, cancel it.
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
### 在 2 、 3 、 4 、 5 級別上以 ttyX 為參數執行 /sbin/mingetty 程序,打開 ttyX 終端用于用戶登錄,
### 如果進程退出則再次運行 mingetty 程序 (respawn)
# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
### 在 5 級別上運行 xdm 程序,提供 xdm 圖像方式登錄界面,并在退出時重新執行 (respawn)
# Run xdm in runlevel 5
x:5:respawn:/etc/X11/prefdm -nodaemon
以上面的 inittab 文件為例,來說明一下 inittab 的格式。其中以 # 開始的行是注釋行,除了注釋行之
外,每一行都有以下格式:
id:runlevel:action:process
對上面各項的周詳解釋如下:
1. id
id 是指入口標識符,他是個字符串,對于 getty 或 mingetty 等其他 login 程序項,需求 id 和 tty 的編
號相同,否則 getty 程序將不能正常工作。
2. runlevel
runlevel 是 init 所處于的運行級別的標識,一般使用 0 - 6 及 S 或 s 。 0 、 1 、 6 運行級別被系統保留:
其中 0 作為 shutdown 動作, 1 作為重啟至單用戶模式, 6 為重啟; S 和 s 意義相同,表示單用戶模式,
且無需 inittab 文件,因此也不在 inittab 中出現,實際上,進入單用戶模式時, init 直接在控制臺
( /dev/console )上運行 /sbin/sulogin 。在一般的系統實現中,都使用了 2 、 3 、 4 、 5 幾個級別,在 Redhat
系統中, 2 表示無 NFS 支持的多用戶模式, 3 表示完全多用戶模式(也是最常用的級別), 4 保留給用戶
自定義, 5 表示 XDM 圖像登錄方式。 7 - 9 級別也是能使用的,傳統的 Unix 系統沒有定義這幾個級別。
runlevel 能是并列的多個值,以匹配多個運行級別,對大多數 action 來說,僅當 runlevel 和當前運行級
別匹配成功才會執行。
3. action
action 是描述其后的 process 的運行方式的。 action 可取的值包括: initdefault 、 sysinit 、 boot 、 bootwait
等:
initdefault 是個特別的 action 值,用于標識缺省的啟動級別;當 init 由核心激活以后,他將讀取 inittab
中的 initdefault 項,取得其中的 runlevel ,并作為當前的運行級別。如果沒有 inittab 文件,或其中沒有
initdefault 項, init 將在控制臺上請求輸入 runlevel 。
sysinit 、 boot 、 bootwait 等 action 將在系統啟動時無條件運行,而忽略其中的 runlevel 。
其余的 action (不含 initdefault )都和某個 runlevel 相關。各個 action 的定義在 inittab 的 man 手冊
中有周詳的描述。
4. process
process 為具體的執行程序。程序后面能帶參數。
第三部分:系統初始化
在 init 的設置文件中有這么一行:
si::sysinit:/etc/rc.d/rc.sysinit
他調用執行了 /etc/rc.d/rc.sysinit ,而 rc.sysinit 是個 bash shell 的腳本,他主要
在 init 的設置文件中有這么一行:
si::sysinit:/etc/rc.d/rc.sysinit
他 調用執行了 /etc/rc.d/rc.sysinit ,而 rc.sysinit 是個 bash shell 的腳本,他主要是完成一些系統初始化的
工作, rc.sysinit 是每一個運行級別都要首先運行的重要腳本。他主要完成的工作有:激活交換分區,檢
查磁盤,加載硬件模塊及其他一些需要優先執行任務。 rc.sysinit 約有 850 多行,不過每個單一的功能還是比較簡單,而且帶有注釋,建議有興趣的用戶能自行
閱讀自己機器上的該文件,以了解系統初始化所周詳情況。由于此文件較長,所以不在本文中列出來,
也不做具體的介紹。
當 rc.sysinit 程序執行完畢后,將返回 init 繼續下一步。
第四部分:啟動對應運行級別的守護進程
在 rc.sysinit 執行后,將返回 init 繼續其他的動作,通常接下來會執行到 /etc/rc.d/rc 程序。以運行級別 5
為例, init 將執行設置文件 inittab 中的以下這行:
l5:5:wait:/etc/rc.d/rc 5
這一行表示以 5 為參數運行 /etc/rc.d/rc , /etc/rc.d/rc 是個 Shell 腳本,他接受 5 作為參數,去執行 /etc/rc.d
/rc5.d/ 目錄下的所有的 rc 啟動腳本, /etc/rc.d/rc5.d/ 目錄中的這些啟動腳本實際上都是一些鏈接文件,
而不是真正的 rc 啟動腳本,真正的 rc 啟動腳本實際上都是放在 /etc/rc.d/init.d/ 目錄下。而這些 rc 啟動
腳本有著類似的用法,他們一般能接受 start 、 stop 、 restart 、 status 等參數。
/etc/rc.d/rc5.d/ 中的 rc 啟動腳本通常是 K 或 S 開頭的鏈接文件,對于以以 S 開頭的啟動腳本,將以 start
參數來運行。而如果發現存在相應的腳本也存在 K 打頭的鏈接,而且已處于運行態了 ( 以 /var/lock/subsys/
下的文件作為標志 ) ,則將首先以 stop 為參數停止這些已啟動了的守護進程,然后再重新運行。這樣做
是為了確保是當 init 改動運行級別時,所有相關的守護進程都將重啟。
至于在每個運行級中將運行哪些守護進程,用戶能通過 chkconfig 或 setup 中的 "System Services" 來自行
設定。常見的守護進程有:
amd :自動安裝 NFS 守護進程
apmd: 高級電源管理守護進程
arpwatch :記錄日志并構建一個在 LAN 接口上看到的以太網地址和 IP 地址對數據庫
autofs :自動安裝管理進程 automount ,和 NFS 相關,依賴于 NIS
crond : Linux 下的計劃任務的守護進程
named : DNS 服務器
netfs :安裝 NFS 、 Samba 和 NetWare 網絡文件系統
network :激活已設置網絡接口的腳本程序
nfs :打開 NFS 服務
portmap : RPC portmap 管理器,他管理基于 RPC 服務的連接
sendmail :郵件服務器 sendmail
smb : Samba 文件共享 / 打印服務
syslog :一個讓系統引導時起動 syslog 和 klogd 系統日志守候進程的腳本
xfs : X Window 字型服務器,為本地和遠程 X 服務器提供字型集
Xinetd :支持多種網絡服務的核心守護進程,能管理 wuftp 、 sshd 、 telnet 等服務
這些守護進程也啟動完成了, rc 程序也就執行完了,然后又將返回 init 繼續下一步。
第五部分:建立終端
rc 執行完畢后,返回 init 。這時基本系統環境已設置好了,各種守護進程也已啟動了。 init 接下來會打
開 6 個終端,以便用戶登錄系統。通過按 Alt+Fn(n 對應 1-6) 能在這 6 個終端中轉換。在 inittab 中的以下
6 行就是定義了 6 個終端:
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6 從上面能看出在 2 、 3 、 4 、 5 的運行級別中都將以 respawn 方式運行 mingetty 程序, mingetty 程序能打
開終端、設置模式。同時他會顯示一個文本登錄界面,這個界面就是我們經常看到的登錄界面,在這個
登錄界面中會提示用戶輸入用戶名,而用戶輸入的用戶將作為參數傳給 login 程序來驗證用戶的身份。
第六部分:登錄系統,啟動完成
對于運行級別為 5 的圖像方式用戶來說,他們的登錄是通過一個圖像化的登錄界面。登錄成功后能直接
進入 KDE 、 Gnome 等窗口管理器。而本文主要講的還是文本方式登錄的情況:
當我們看到 mingetty 的登錄界面時,我們就能輸入用戶名和密碼來登錄系統了。
Linux 的賬號驗證程序是 login , login 會接收 mingetty 傳來的用戶名作為用戶名參數。然后 login 會
對用戶名進行分析:如果用戶名不是 root ,且存在 /etc/nologin 文件, login 將輸出 nologin 文件的內容,
然后退出。這通常用來系統維護時防止非 root 用戶登錄。只有 /etc/securetty 中登記了的終端才允許 root
用戶登錄,如果不存在這個文件,則 root 能在所有終端上登錄。 /etc /usertty 文件用于對用戶作出附加
訪問限制,如果不存在這個文件,則沒有其他限制。
在分析完用戶名后, login 將搜索 /etc/passwd 及 /etc/shadow 來驗證密碼及設置賬戶的其他信息,比如:
主目錄是什么、使用何種 shell 。如果沒有指定主目錄,將默認為根目錄;如果沒有指定 shell ,將默認
為 /bin/bash 。
login 程序成功后,會向對應的終端在輸出最近一次登錄的信息 ( 在 /var/log/lastlog 中有記錄 ) ,并檢查用
戶是否有新郵件 ( 在 /usr/spool /mail/ 的對應用戶名目錄下 ) 。然后開始設置各種環境變量:對于 bash 來說,
系統首先尋找 /etc/profile 腳本文件,并執行他;然后如果用戶的主目錄中存在 .bash_profile 文件,就執
行他,在這些文件中又可能調用了其他設置文件,所有的設置文件執行后后,各種環境變量也設好了,
這時會出現大家熟悉的命令行提示符,到此整個啟動過程就結束了。
4 、相關命令
4.1 、查看當前系統運行等級
[root@test ~]# runlevel
N 5
//’N’ 代表先前的 Runlevel; ‘5’ 代表目前的 Runlevel
4.2 、切換系統運行等級
#init N
// 切換到運行級別 N
# init 0
// 關機
# init 6
// 重啟動系統