Linux的啓動流程(CentOS 6)

前言

Linux啓動的過程在實際生產中有着至關重要的作用。試想一下,如果我們在實際生產中服務器因爲某一個服務出了問題,而不能啓動,這時我們應該怎麼辦。如果我們瞭解Linux的詳細啓動過程,知道是在哪一個環節出了問題,我們就能夠進入到相應的環節,排除掉相應的問題,從而解決實際生產中的問題。

同時,我們在這裏提出一個問題,有誰知道Windows的啓動過程呢?如果啓動過程出了問題,我們該怎麼辦呢?恐怕答案只有重啓系統了吧……

Linux 系統的啓動過程對於管理員來說是完全透明的,瞭解了Linux的啓動過程,就好像有了透視眼一樣,能夠清楚的瞭解Linux的一切。知道了這些,不僅能夠解決實際生產中的問題,更能夠自己來製作Linux,自己定製Linux了,總之Linux大法好……

寫在前面(最重要)

本文部分資料參考了以下博文。

  1. Linux Booting Process steps – RHEL/CentOS 7

  2. http://www.linuxidc.com/Linux/2014-03/97862.htm

  3. http://www.cnblogs.com/zengkefu/p/5559058.html

先來看一張圖

可以圖片上點擊右鍵,選擇在新的標籤頁中打開,這樣可以查看大圖。此圖爲筆者根據參考資料重製,轉載請註明出處。

Linux%E5%90%AF%E5%8A%A8%E8%BF%87%E7%A8%8

這張圖大體上描述了Linux 的啓動流程,在Linux的不同啓動階段,標註的相應的註釋。本文將在此圖的基礎上,對Linux的啓動過程分階段的進行詳細的描述。同時由於自身能力有限,文中描述難免有紕漏之處,還請各位讀者留言指出,我會及時改正。

Linux啓動過程都經歷了什麼!!

  • 硬件引導啓動

  • grub啓動引導階段

  • 內核引導階段

  • init初始化階段

硬件引導啓動

硬件引導啓動過程在Linux和Windows上是相似的。熟悉Windows系統的朋友可以結合Windows的啓動過程來理解。

BIOS 啓動

稍有計算機基礎的人都會知道BIOS(Basic Input / Output System),又稱爲基本輸入輸出系統,它是一組固化到計算機主板上的一段程序,存儲在ROM中。裏面保存了計算機最基本的輸入輸出程序,計算機啓動的時候首先根據BIOS中提供的信息去查找相應的硬件,並完成最基本的檢測。如果這個過程中出現了問題,系統就不會啓動。
舉一個最簡單的例子,如果系統在BIOS階段發現,內存條沒有成功加載,那麼系統還能夠正常啓動嗎?即便Windows系統在這一點上也是如此的。

MBR 分區引導

關於Linux系統的分區結構有兩種方式,分別是MBR分區和GPT分區。二者在分區結構上有很大的不同,區別也很多,二者的異同可以去查看相關的資料,我們在這裏不做詳細的介紹。
我們以MBR分區爲例,來介紹Linux的啓動過程。
硬盤上第0磁道第一個扇區被稱爲MBR,也就是Master Boot Record,即主引導記錄,它的大小是512字節,預啓動信息、分區表信息。

在計算機完成了BIOS階段之後,系統會找到BIOS中指定的硬盤的MBR,此時系統啓動的控制權就移交到MBR階段。如圖所示,在MBR由三部分組成,分別是BootLoader(主引導程序),DPT(硬盤分區表)和55AA(硬盤有效標誌)。其詳細結構可參考上圖。

grub 啓動引導階段

系統啓動到MBR階段的時候會讀取MBR中記錄的BootLoader。所謂的BootLoader指的就是在操作系統內核運行之前運行的一段小程序。通過這段小程序,我們可以初始化硬件設備、建立內存空間的映射圖,從而將系統的軟硬件環境帶到一個合適的狀態,以便爲最終調用操作系統內核做好一切準備。在Linux 中就是grub。

Linux 中的grub 啓動位於/boot/grub/目錄下

實驗 如果僅僅保留 grub.conf 文件,系統能夠正常啓動嗎?

僅保留grub.conf

僅僅保留 grub.conf 在啓動過程發生的錯誤,提示信息如下圖所示

僅保留grub.conf的錯誤提示信息

stage 1階段

系統進入到MBR階段中,就會直接將磁盤的前446字節讀入內存中,也就是BootLoader。stage 1階段就是指的這一段。
stage 1 階段的任務非常簡單,就是將硬盤中的這446個字節讀入內存中,並解析,然後爲下一個階段做好準備。

實驗 如果Stage1 階段被破壞了,如何修復啓動?

前面我們說過,Stage1 主要位於BootLoader 中,也就是硬盤的第0個磁道的第一個扇區的前446個字節,那麼我們只要將446個字節破壞掉了就可以模擬這個實驗。先看下面一個動圖。

stage1 啓動失敗

從圖中可以看到,這時系統會直接進入救援模式。因爲系統找不到找不到硬盤啓動代碼。所以我們就進入到救援模式,進行一系列的救援操作。

stage1 救援

grub-install 的作用就是重新安裝grub,會恢復/boot/grub 目錄下的文件。 我們在執行 grub-install的過程,不僅修復了stage1 階段,還修復了stage1.5階段和stage2階段。

stage 1.5階段

stage1 位於/boot基本磁盤分區中,爲識別內核文件所在的文件系統提供系統識別擴展。 Stage 1.5 是橋樑,Stage 1 並不能直接識別文件系統,所以需要Stage 1.5來引導某個文件系統當中的Stage 2.

stage 2階段

stage 2階段是GRUB的核心程序,能讓用戶以菜單方式將操作系統加載、新增參數、修改選項,這些全都是stage2的功用。對GRUB來說,stage2除了不能自己啓動外,剩下的事情全都由stage2完成。像是用戶在啓動時所看到的GRUB啓動倒數畫面,或是緊接着的啓動菜單畫面,就都是由stage2所提供的。 在 /boot/grub/目錄下可以看到由一個stage2 的文件,就是這個文件起到了至關重要的作用。
在Stage 2階段 會讀取 grub.conf 文件,而grub.conf 文件也是在Linux的整個啓動過程中佔據着尤爲重要的一環。

grub.conf 配置文件

grub.conf 文件在啓動過程中有着很大的作用

  • 能夠指定默認啓動的內核或者系統

  • 提供交互式接口

  • 提供啓動時的密碼保護

下面我們就會詳細的解釋一下grub.conf 這個配置文件。如下圖所示,是我們自定義的grub.conf文件。

grub.conf

  • default=0 默認啓動的是哪個操作系統

  • timeout=5 選擇需要啓動的操作系統所需要的時間,如果5秒鐘之內不選的話,就啓動默認內核或者操作系統

  • splashp_w_picpath 啓動菜單的背景 ,也就是在選擇 需要啓動的內核或者操作系統的界面

  • passwd 輸入啓動項的密碼,意思就是說在看到系統啓動項之後,只有輸入密碼才能進行命令操作,比如說進入單用戶。這裏配置密碼的方式有多種,可以以明文的形式進行配置也可以以加密的形式進行配置。而加密的方式有兩種,grub-md5-crypt,grub-crypt. 在文件中配置如下所示。

	passwd magedu
	passwd --md5 加密密碼
	passwd --encrypted  加密密碼
  • hiddenmenu 隱藏選擇kernel或操作系統菜單,只有出現等待界面後按下enter鍵纔會出現。如果沒有這個字段,則每次系統啓動都會出現這個選擇菜單。

  • title 定義需要啓動的菜單,(hd0,0) 可以去掉,但是 kernel 和 initrd 兩者的順序不能顛倒,否則系統啓動失敗。

  • rhgb 選項可以去掉,隱藏 啓動的動畫界面(通常是CentOS 6 或者 CentOS 7的LOGO),直接顯示字符界面,字符界面上顯示的是各種服務的相關啓動信息

  • quiet 默認隱藏內核的啓動信息,如果去掉,啓動時不光顯示服務的啓動信息,還顯示內核的啓動信息。

如果我們隱藏了內核的啓動信息,去哪裏能夠查看內核的啓動信息呢?

cat /proc/cmdline 會顯示與grub.conf 一致的內核信息。

內核引導階段

Kernel,內核,Kernel是Linux系統最主要的程序,實際上,Kernel的文件很小,只保留了最基本的模塊,並以壓縮的文件形式存儲在硬盤中,當GRUB將Kernel讀進內存,內存開始解壓縮內核文件。講內核啓動,應該先講下initrd這個文件,

initrd(Initial RAM Disk),它在stage2這個步驟就被拷貝到了內存中,這個文件是在安裝系統時產生的,是一個臨時的根文件系統(rootfs)。因爲Kernel爲了精簡,只保留了最基本的模塊,因此,Kernel上並沒有各種硬件的驅動程序,也就無法識rootfs所在的設備,故產生了initrd這個文件,該文件裝載了必要的驅動模塊,當Kernel啓動時,可以從initrd文件中裝載驅動模塊,直到掛載真正的rootfs,然後將initrd從內存中移除。

Kernel會以只讀方式掛載根文件系統,當根文件系統被掛載後,開始裝載第一個進程(用戶空間的進程),執行/sbin/init,之後就將控制權交接給了init程序。

init 初始化階段

init 過程,顧名思義,就是對操作系統進行初始化的一個過程,此時操作系統內核已經在內存中加載。實際上是根據/etc/inittab(定義了系統默認運行級別)設定的動作進行腳本的執行,第一個被執行的腳本爲/etc/rc.d/rc.sysinit,這個是真正的OS初始化腳本 相關的內容以及配置在圖中已經有了詳細的描述,此處不再詳述。

綜上,系統啓動流程進行了大體的介紹,無奈,時間緊張,有很多地方只是簡單地一筆帶過。實際生產中,有些細節也很重要,包括整個啓動過程中每一個環節如果出了故障應該如何修復,都是值得詳細描述的知識點。以後有時間會回來重新更新補充,以圖做到更好。



個人博客地址:http://www.pojun.tech/ 歡迎訪問

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章