歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

解析Linux系統的運行級與啟動機制

一 系統運行級

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

Copyright © Linux教程網 All Rights Reserved