linux啓動過程解析

原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://chrinux.blog.51cto.com/6466723/1192004

一、linux系統的啓動流程

   關於linux系統的啓動流程我們可以按步進行劃分爲如下:

POST加電自檢-->BIOS(Boot Sequence)-->加載對應引導上的MBR(bootloader)-->主引導設置加載其BootLoader-->Kernel初始化-->initrd—>/etc/init進程加載/etc/inittab,其進程流程圖如下:

圖像 148

二、剖析詳細啓動過程

⑴、

  1. POST開機自檢:電腦主機打開電源的時候,隨後會聽到滴的一聲,系統啓動開始了開機自檢(POST-power on self

  2. test)自檢開始),這個過程中主要是檢測計算機硬件設備比如:CPU,內存,主板,顯卡,CMOS等設備是否有故障存

  3. 在,如果有硬件故障的話將按兩種情況理:對於嚴重故障(致命性故障)則停機,此時由於各種初始化操作還沒完成,

  4. 不能給出任何提示或信號;對於非嚴重故障則給出提示或聲音報警信號,等待用戶處理),如果沒有故障,POST完整自己

  5. 的接力任務,將尾部工作交接給BIOS處理。

⑵、

  1. BIOS:計算機加電自檢完成後第一個讀取的地方就是就是BIOS(Basic Input Output System,基礎輸入輸出系統)

  2. ,BIOS裏面記錄了主機板的芯片集與相關設置,如CPU與接口設備的通信頻率、啓動設備的搜索順序、硬盤的大小與

  3. 類型、系統時間、外部總線、各種接口設備的I/O地址、已經與CPU通信的IRQ中斷信息,所以,啓動如果要順利啓動,

  4. 首先要讀取BIOS設置。

⑶、

  1. 按照BIOS所設定的系統啓動流程,如果檢測通過,則根據引導次序(Boot Sequence)開始在第一臺設備上支持啓動

  2. 程序,我們的啓動設備主要包括硬盤、USB、SD等,我們一般用的是硬盤,然後進行讀取第一個設備就是硬盤,第一個

  3. 要讀去的就是該硬盤的主引導記錄MBR(Master Boot Record),然後系統可以根據啓動區安裝的

  4. 引導加載程序(Boot Loader)開始執行核心識別的工作。【在此插一句:MBR程序只是找到只是硬盤分區內最前面

  5. 的446個字節的Boot Loader】然後查找相關配置和定義。

⑷、

  1. Boot Loader 加載Grub程序

  2.     在這個過程中主要靠Grub的引導開始的,Grub分爲連個階段:

  3.      stage1:主要是Boot loader

  4.      stage 1.5:過渡

  5.     stage2:主要是/boot/grub

圖像 149

通過上面我們可以發現linux的內核VMLnuz,grub、initrd都在/boot目錄下

圖像 150

在/boot/grub/下面我們看到了熟悉的stage1,stage2及grub工具的配置文件  grub.conf,那麼grub.conf內都定義了什麼吶??

圖像 151

⑸、Kernel


  1. 根據Grub內的定義,grub讀取完畢後就把下面的工作交個內核了。kernel主要是完成系統硬件探測及硬件驅動的初始

  2. 化,並且以讀寫的方式掛載根文件系統(根切換),那麼這裏就出現了一個“先有雞還是先有蛋的文件了”,具體是什麼

  3. 那?

  4.      要想訪問真正的根文件系統(rootfs)的話,就必須加載根文件系統中的設備,這時根文件系統又沒有掛載,

  5. 要掛載根文件系統又得加載根文件系統中的驅動程序,哪怎麼辦呢?爲了解決這個問題,這是就用到了initrd文件了。  

  6. 在來說下kernel初始化所要工作的內容做下簡單總結:  

  7.       探測硬件->加載驅動(initrd)->掛載根文件系統->rootfs(/sbin/init)

⑹、

  1. 到此止內核空間的相關工作已經完成,內核空間的任務開始向用戶空間轉移,內核空間通過一個間接的initrd(微型

  2. linux)向用戶空間的/sbin/init過度,所以gurb開始引導內核轉向initrd。

  3.     initrd:一個虛擬的文件系統,裏面有lib、bin、sbin、usr、proc、sys、var、dev、boot等一些目錄,

  4. 其實你會發現裏面的目錄有點像真的/對吧,所以我們稱之爲虛擬的根文件系統,作用就是將kernel和真的根文件系統

  5. 建立關聯關係,讓kernel去initrd中加載根文件系統所需要的驅動程序,並以讀寫的方式掛載根文件系統,並讓執行

  6. 用戶當中第一個進程init。

圖像 152

下面我們看下init腳本內的內容:

圖像 153


圖像 154

圖像 155

從上面的腳本內容我們可以看到init進程的主要工作:


  1. 掛載 :將initrd中的/proc, /sys  /dev 掛載到當前的主分區中的相應目錄  

  2. 創建目錄:/dev/mapper  

  3. 通過mknod完成block or character special files的創建  

  4. 相關模塊的掛載  

  5. 創建root設備  

  6. 掛載 /sysroot  

  7. 最後完成根切換

⑺、init執行完畢以後會啓動系統內的/etc/inittab文件,來完成系統系統的初始化工作。下面我們來介紹一下inittab這個配置文件內的詳細內容

圖像 156

圖像 157


各個級別的定義:

默認運行級別      

  1. 0:halt                      //關機  

  2. 1: single user mode    //單用戶維護模式)  

  3. 2:multi user mode, without NFS  //不支持NFS功能  

  4. 3: multi user mode, text mode     //字符界面  

  5. 4:reserved   //系統保留  

  6. 5: multi user mode, graphic mode   //圖形化界面  

  7. 6: reboot   //重啓

/etc/inittab格式及語法(:)    

  1. [選項]:[runlevel]:[行爲]:[命令]

  2. 行爲:  

  3.                   initdefault:代表默認運行級別  

  4.                   sysinit:代表系統初始化操作選項  

  5.                   ctrlaltdel:代表重啓的相關設置  

  6.                   wait:代表上一個命令執行結束後方可執行下面的操作  

  7.                   respawn:代表後面字段可以無限制再生(reboot)

  8. 命令選項  

  9.               一些命令,不過通常都是腳本


下面說下inittab內定義的初始化腳本:rc.sysinit  --/etc/rc.d/rc.sysinit

圖像 158

圖像 159



  1. 如上圖所示:rc.sysinit腳本內定義了一些與系統初始化的定義

  2. 設定主機名

  3. 檢測並掛載/etc/fstab中其他文件系統

  4. 啓動swap分區

  5. /etc/sysctl.conf設定內核參數

  6. 裝載鍵映射-->鍵盤上每個鍵的功能

  7. 然後根據系統運行級別運行相關的服務腳本:/etc/rc.d/init.d/腳本和/etc/rc.d/rc#d

圖像 161


  1. rc0-rc6目錄下腳本:

  2. K*     ##只要是以K開頭的文件均執行stop工作  

  3. S*     ##只要是以S開頭的文件均執行start工作  

  4. 0-99  (執行次序,數字越小越先被執行)

  5. 用戶自定義開機啓動程序(/etc/rc.d/rc.local)  

  6. 可以根據自己的需求將一些執行命令或是腳本寫到/etc/rc.d/rc.local裏,當開機時,就可以加載啦

三、總結

系統初始化的大致內容總結如下:


  1. 硬件的初始化,圖像界面啓動的初始化(如果設置了默認啓動基本)  

  2. 主機RAID的設置初始化,device mapper 及相關的初始化,  

  3. 檢測根文件系統,以只讀方式掛載  

  4. 激活udev和selinux  

  5. 設置內核參數 /etc/sysctl.conf  

  6. 設置系統時鐘  

  7. 啓用交換分區,設置主機名  

  8. 加載鍵盤映射  

  9. 激活RAID和LVM邏輯卷  

  10. 掛載額外的文件系統 /etc/fstab  

  11. 最後根據mingetty程序調用login讓用戶登錄->用戶登錄(完成系統啓動)

  12. 在系統啓動過程中主要的腳本和目錄有:

  13. boot

  14. /grub

  15. /boot/grub/grub.conf

  16. /boot/initrd+內核版本

  17. /initrd文件中的/proc/  /sys/    /dev/ 目錄的掛載 及根的切換

  18. /etc/inittab  腳本

  19. /etc/rc.d/rc.sysinit  腳本 等


    這些重要的腳本和目錄,還有其他重要的目錄和文件,腳本等。由此篇我們可以詳細瞭解linux系統的啓動和初始化過程,然後我們可以根據linux系統啓動的過程和所用到的命令自己動手DIY一個微型linux系統,關於“DIY微型linux系統”會再後兩至三天內發表博文,到時候我們在一起探討探討linux系統的組成部分等更詳細的相關

信息!!!

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