一文讀懂 | Linux系統啟動過程

語言: CN / TW / HK

如果有一天你們公司很重要的一臺Linux伺服器突然啟動不了了,重灌系統又浪費時間,如果是啟動過程有問題,那麼你知道啟動過程可以快速定位系統問題,很快就可以解決。

1. 上電載入BIOS

首先肯定是上電,當按下計算機的電源,計算機就會首先載入 BIOS 系統, BIOS ( Basic Input Output System )是基本輸入輸出系統,主要就是進行硬體檢測,檢測硬體能否滿足執行的基本條件,叫做“硬體自檢( Power-OnSelf-Test )”,簡稱 POST ,所以,計算機要順利啟動,就需要首先載入BIOS資訊,在計算機還沒載入作業系統的時候控制計算機。

BIOS程式一般被存放在主機板ROM(只讀儲存晶片)中,即使關機或掉電,該程式也不會丟失。

2. 載入MBR到記憶體

BIOS 程式的最後,將會指向計算機硬碟的 MBR ( Master Boot Record )主引導扇區,就是啟動盤的第一個扇區,硬碟上的 MBR 包含基本的Boot Loader(446位元組)和一個小的分割槽表(64位元組)及分隔標識(2位元組),它是一個512位元組大小的扇區。

系統讀取到 BIOS 所指向的硬碟的 MBR 後,就會將其load到記憶體(RAM)中,然後 BIOS 就會將控制權轉交給 MBR

3. GRUB引導

在Linux資料中,被俗稱 GRUB 的就是Boot Loader, GRUB 是GRand Unified Bootloader的縮寫, MBR 的前446位元組存放的就是 GRUB 程式的一部分,它是一個多重作業系統啟動管理器,用來引導不同系統, GRUB 是目前Linux環境中最流行的啟動管理器。

如果你的計算機上配置了雙作業系統,使用者就是在 GRUB 中進行選擇究竟啟動哪個作業系統。

4. 載入核心(Kernel)

系統啟動到這一步,首先會載入系統的 KernelKernel 是現代作業系統的核心,直接負責管理硬體。

5. 設定Inittab執行等級

在核心載入完畢後,會啟動Linux作業系統第一個守護程序init,這個程序的PID是1,所有的程序都是它的子程序。

通過這個程序讀取/etc/inittab檔案,/etc/inittab檔案的作用是設定Linux的執行等級,檔案內容大致如下:

# 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)
# 
id:3:initdefault:
 
...

從檔案內容知道Linux系統執行等級一共有7種:

0:關機模式,執行等級為0,系統會立即關機,在系統啟動後可以利用這種等級對系統進行關機操作,但是不允許將系統下次啟動時的等級設定為0,否則系統將無法正常啟動(啟動後立即關機)。
1:單使用者模式,類似於windows系統下的安全模式,具有ROOT許可權。
2:無網路支援的多使用者模式,顧名思義就是支援多使用者登入
3:字元介面多使用者模式,文字命令列介面,一般伺服器都是此模式
4:保留,未使用模式
5:圖形介面多使用者模式,系統啟動之後會進入到圖形化桌面系統中
6:重新引導系統,重啟模式,千萬不要設定為6,和0相似。

/etc/inittab檔案內容中的設定的行:

id:3:initdefault:

表示啟動的層級為3,即圖形介面多使用者模式。一般3和5比較常用,如果需要其它等級,可以手動修改這個值。

每一個執行級別都在/etc目錄下有一個對應的子目錄,可以指定每一個執行級別需要載入哪些程式,rcN.d的字母d是directory的意思,表示這是一個目錄。

6. 載入rc.sysinit

讀取完執行等級後,Linux系統就會執行第一個使用者層程序:/etc/rc.d/rc.sysinit,該程序的功能是設定PATH變數、設定網路配置、啟動/swap分割槽、設定/proc、系統函式和Selinux等等。

7. 載入核心模組

完成上述流程後,會讀取/etc/modules.conf檔案以及/etc/modules.c目錄下的檔案來載入系統的核心模組。

8. 啟動執行級別程式

根據前面設定的執行等級,系統會執行/etc/rc0.d/到/etc/rc6.d/中相應的指令碼程式,來完成相應的初始化工作和啟動相應的服務,都是一些服務程式。其中以 S 開頭表示系統即將啟動的程式,如果以 K 開頭,則代表停止該服務。 SK 後緊跟的數字為啟動順序編號。

前面提到,每一個執行級別都在/etc目錄下有一個對應的子目錄,但是如果每一個執行級別都要執行同一個程式,那就要每一個子目錄裡面都要拷貝一個這個程式進去,那這樣就會有一個問題:如果要修改一個程式,修改完豈不是每一個子目錄裡面都要修改一遍或者都要重新拷貝一遍?

所以Linux的解決辦法就是每一個/etc/rcN.d目錄下的檔案都設為連結檔案,下圖中看到箭頭指向/etc/init.d目錄下的檔案,所以實際執行的是/etc/init.d目錄下的檔案,只需要修改一次/etc/init.d目錄下的程式就搞定了。

至於什麼是連結檔案,可以看之前寫的 徹底明白Linux硬連結和軟連結 就可以明白。

9. 讀取rc.local檔案

啟動完服務程式後,會讀取執行/etc/rc.d/rc.local檔案,我們可以對該檔案設定一些關鍵核心業務開機自啟,也就是Linux留給使用者進行個性化的地方,你可以把你想要設定和啟動的東西放到這裡。

10. 執行/bin/login

到這裡,Linux系統啟動結束,最後執行/bin/login程式,啟動到系統登入介面,等待使用者輸入使用者名稱和密碼,然後就可登入到 Shell 終端。

end

一口Linux 

關注,回覆【 1024 】海量Linux資料贈送

精彩文章合集

文章推薦

【專輯】 ARM

【專輯】 粉絲問答

【專輯】 所有原創

專輯 linux 入門

專輯 計算機網路

專輯 Linux驅動

【乾貨】 嵌入式驅動工程師學習路線

【乾貨】 Linux嵌入式所有知識點-思維導圖