原文作者:技術成就夢想
原文連結:http://ixdba.blog.51cto.com/2895551/533740
一 系統運行級
windows系統有安全運行模式和正常運行模式,這是兩個不同的運行級,同樣,linux也有系統運行層級,並且linux系統的運行層級更加靈活,更加多樣化。
在講述運行層級前,先講述下linux下的init程式,因為init程式直接和系統運行層級相關聯, init程式是linux作業系統最主要的程式之一,是一個由系統核心啟動的使用者級進程,同時init進程也是所有其它系統進程的鼻祖,也就是說init 進程是系統啟動並執行第一個進程,它的進程號始終為1。
linux系統有7個運行層級,這些運行層級均在/etc/inittab檔案中指定,下面講述/etc/inittab檔案的具體實現。
以redhat linux為例,下面是/etc/inittab的某段資訊。
# 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)
上面這段資訊列出了linux系統的7個運行等級:
0-關機模式,
1-單一使用者模式,單使用者只有系統管理員可以登入。
2-多使用者模式,但是不支援檔案分享權限設定,例如不支援NFS服務.這種模式不常用。
3-完全的多使用者模式,支援NFS服務.最常用的使用者模式,預設登入到系統的字元介面。
4-基本不用的使用者模式,可以實現某些特定的登入請求。
5-完全多使用者模式,預設登入到X-window系統,也就是登入到linux圖形介面。
6-重啟模式,也就是執行關閉所有啟動並執行進程,然後重新啟動系統。
這些運行層級和linux中的init程式相互對應,例如執行init 1系統就進入單一使用者模式,執行init 6系統將重新啟動。
在inittab檔案中以#開頭的所有行都是注釋行。注釋行有助於使用者理解inittab檔案每項的具體含義,inittab檔案中的值都有如下格式組成:
label:runlevel:action:process
1.label欄位
label是有1~4個字元組成的標籤,用來標示輸入的值。一些系統只支援2個字元的標籤。鑒於此原因,多數人都將標籤字元的個數限制在2個以內。該標籤可以是任一字元構成的字串,在Red Hat Linux中使用的標籤有:
2.runlevel欄位
runlevel欄位指定系統的運行層級。可以指定多個運行層級,也可以不為runlevel欄位指定特定的值。
3. process欄位
process欄位包含了init執行的進程,也就是init程式具體要執行的命令,該進程採用的格式與在命令列下運行該進程的格式一樣,因此 process欄位都以該進程的名字開頭,後面是運行時要傳遞給該進程的參數。比如/sbin/shutdown -t3 -r now。
4.action欄位
action欄位定義了:當系統進入相應的運行層級後,init程式應該以何種方式運行process欄位對應的命令,action欄位常用的值如下表所示:
明白了inittab檔案的格式以後,我們就知道每項的含義了, 接著看/etc/inittab下面的內容:
id:5:initdefault:
表示系統將預設啟動到X-window介面下,如果我們想讓系統預設開機啟動到字元介面下,只需修改id:5:initdefault:為id:3:initdefault:即可。
# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit
該段告訴init程式,運行/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
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
上面這段資訊標明/etc/rc.d/rc可以運行在0~6各個運行層級,同時init程式等待/etc/rc.d/rc執行完畢才進入下一步操作。
# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
上面這段指定了當Ctrl+Alt+Del三個鍵同步選取時,init程式將執行/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"
上面這段資訊說明了:系統電源被切斷時,UPS通知init程式,init程式發出"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"
這段說明了:UPS接到電源恢複訊號後,通知init進程,然後init程式發出"Power Restored; Shutdown Cancelled"訊號,取消關機操作,這個過程在1~5運行層級上有效。
# 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
這段資訊說明了:在2~5運行層級上,始終開啟6個終端控制台,即使某個控制台被關閉,系統也會自動啟動。
# Run xdm in runlevel 5
x:5:respawn:/etc/X11/prefdm –nodaemon
最後這段資訊表明,在X-window案頭下始終啟動並執行進程是/etc/X11/prefdm。
二 系統啟動過程
1.核心引導
開啟系統電源,開始BIOS自檢,系統按照BIOS裡的設定啟動裝置(一般是硬碟啟動), 接著進入linux引導程式,一般Linux系統提供兩種引導方式: GRUB和LOLO,其中GRUB是大多數Linux系統的預設引導方式,而LILO則是根據一些特殊需求或個人喜好而準備的,一旦linux引導程式載 入記憶體,它顯示一個圖形介面給使用者,這個介面裡包含了不同的核心選項,使用者可以通過上下鍵去選擇不同的核心引導,當引導程式成功完成引導後,linux接 管了對CPU的控制權,接著CPU開始執行linux核心映像程式,載入核心, 在預定的地方找到initrd鏡像的壓縮包,對它進行解壓和掛載,並載入所有必須的驅動, 然後,Kernel會建立root裝置,以唯讀方式掛載root分區,並釋放所有沒有被使用的記憶體,此時,Kernel已經被裝載到記憶體裡運行起來了。但 是,因為沒有使用者應用程式允許輸入有意義的指令給系統,所以此時的系統不能做任何事情。
2.運行init
init進程是系統所有進程的起點, 緊接上面,Linux在完成核內引導以後,就開始運行init程式,init程式需要讀取設定檔/etc/inittab,而inittab是一個不可執行檔文字檔,關於這個檔案,我們將在”系統運行級”一節詳細講述。
3.系統初始化
init程式啟動後首先調用rc.sysinit和rc程式, rc.sysinit主要完成一些系統初始化的工作,它是系統每一個運行層級都要首先啟動並執行重要指令碼。它主要完成的工作有:檢查磁碟,載入硬體模組, 啟用交換分區,以及其它一些需要優先執行任務,當rc.sysinit程式執行完畢,引導返回到init程式。
4.啟動運行級的守護進程
rc.sysinit程式執行完畢,接下來,rc程式啟動, rc程式主要啟動系統對應運行層級的守護進程, rc程式執行完畢,又將返回init程式繼續下一步。
5.建立終端
此時系統基本環境已經設定好了,init程式接著會開啟6個終端,以便使用者登入。
6.登入系統
當我們看到mingetty的登入介面時,我們就可以輸入使用者名稱和密碼登入系統了。Linux的帳號驗證程式是login,當login程式執行成功後,最後就進入了shell終端。
這樣linux系統就完成了從開機到啟動的整個過程。
三 系統關機過程
在瞭解linux關機過程之前,我們先學習一下linux關機的一些常用命令,最常用的linux關機命令有如下幾個:init ,shutdown, halt,reboot等,這些命令都可以達到關機重啟的目的,但是每個命令的內部工作過程是不同的。我們通過對關機命令的講述,詳細瞭解linux安全 關機的過程。
1.shutdown命令
使用shutdown命令可以安全的關閉linux系統,有些linux初學者會使用直接關閉電源的方法來關閉linux,這是十分危險的,因為 linux與windows不同,在linux後台運行著很多進程,這些進程式控制制著linux對系統的各種操作,如果強制關機,可能會造成進程的混亂以至 遺失資料,如果在系統工作負載很高的情況下,突然斷電,不但會遺失資料,甚至會損壞硬體裝置。
shutdown命令是用shell編寫的程式,必須由超級使用者才能執行,shutdown命令執行後,會以廣播的形式通知正在系統中工作的所有使用者,系 統將在指定的時間內關閉,請儲存檔案,停止作業,登出使用者;此時login指令被凍結,新的使用者不能登入;當所有的使用者從系統中登出或者指定時間已到 時,shutdown就發送訊號給init程式,要求init程式改變系統運行層級,接著,init程式根據shutdown指令傳遞過來的參數,相應的 改變運行級,例如,shutdown指定的參數是關機命令的話,init程式就執行init 0進行關機,如果shutdown指定的參數是要重啟系統,那麼init程式就執行init 6進行系統重啟。
shutdown命令的詳細文法:
shutdown [-fFhknrc(參數名稱)] [-t 秒數] 時間 [警告資訊]
具體各參數功能:
-f 重新啟動時不執行fsck(註:fsck是Linux下的一個檢查和修複檔案系統的程式,我們會在以後章節詳細講述)。
-F 重新啟動時執行fsck。
-h 將系統關機,在某種程度上功能與halt命令相當。
-k 只是送出資訊給所有使用者,但並不會真正關機。
-n 不調用init程式關機,而是由shutdown自己進行(一般關機程式是由shutdown調用init來實現關機動作),使用此參數將加快關機速度,但是不建議使用者使用此種關機方式。
-r shutdown之後重新啟動系統。
-c 取消前一個shutdown命令。例如,當執行一個如“shutdown -h 15:30”的命令時,只要按“Ctrl+C”鍵就可以中斷關機的命令。而執行如“shutdown -h 15:30 & ” 的 命 令 就將 shutdown轉到後台運行了,此時,就需要使用shutdown -c將前一個shutdown命令取消。
-t<秒數> 送出警告資訊和關機訊號之間要延遲多少秒。警告資訊將提醒使用者儲存當前進行的工作。
[時間] 設定多久時間後執行shutdown命令。時間參數有hh:mm或+m兩種模式。
hh:mm格式表示在幾點幾分執行shutdown命令。例如 “shutdown 16:50”表示將在16:50執行shutdown, +m表示m分鐘後執行shutdown, 比較特別的用法是以now表示立即執行shutdown, 值得注意的是這部分參數不能省略。
[警告資訊] 要傳送給所有登入使用者的資訊。
應用舉例:
立即關機重啟:shutdown –r now
立即關機:shutdown –h now
設定5分鐘後關機,同時發出警告資訊給登入的linux使用者:
shutdown +5 “System will shutdown after 5 minutes”
2.halt命令
halt是最簡單的關機命令,相當於shutdown –h組合,halt執行時,kill掉多有應用程式,然後調用系統指令sync,sync將所有記憶體資訊通過檔案系統寫入硬碟,然後停止核心。
halt命令的部分參數如下:
[-f] 沒有調用shutdown而強制關機或重啟。
[-i] 關機或重新啟動之前,關掉所有的網路介面。
[-p] 關機時調用poweroff,此選項為預設選項。
3.reboot命令
reboot命令的執行過程與halt基本類似,不同的是halt是用於關機,而reboot是關機後引發系統重啟。
4.init命令
init進程是所有進程的鼻祖,其進程號始終為1,init程式主要用於系統不同運行級之間的切換,切換的工作是立即完成的,例如init 0就是將系統運行級切換到0,也就是關機,init 6命令用於將系統運行層級切換到6,也就是重啟系統。
完!