一 系統運行級
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,也就是重啟系統。
本文出自 “技術成就夢想” 博客,請務必保留此出處http://ixdba.blog.51cto.com/2895551/533740