詳細講解Linux啓動流程及啓動用到的配置文件及腳本

   《一》:詳解Linux啓動流程及需要使用到的配置文件

POST加電自檢-->BIOS(Boot Sequence)->MBR(bootloader)->Kernel->initrd->rootfs(/sbin/init)  
下面對每個啓動流程做詳細解釋:

POST(加電自檢)
         計算機本身不執行任何程序,所以系統必須要完成自舉的過程,在CPU的控制下,將RAM芯片中的某個程序映射到ROM地址空間,並執其中的指令完成系統硬件健康狀況檢查,例如存儲設備、網卡、CPU、聲卡等其他硬件設備是否完好。當檢查完成後,所有硬件或基本硬件、核心硬件沒有問題,則下一個啓動流程->BIOS

BIOS(Boot Sequence)
      
   按照BIOS所設定的系統啓動流程,根據引導次序(Boot Sequence)自上而下的尋找對應存儲設備上操作系統的MBR,如果MBR存在,則會讀取MBR中的bootloader

MBR(bootloader)
       
會根據MBR所指引的活動分區上尋找系統分區中的 bootloader,bootloader稱爲是一段程序,佔據446字節。在bootloader當中配置了所要引導操作系統的內核所在的位置,因此BIOS被載入內存以後,當它實現將控制權限轉交給bootloader以後,bootloader接收整個系統的控制權限,而後根據用戶的選擇去讀取相應操作系統中的內核,並將內核裝載入內存的某個空間位置,解壓縮,這時kernel就可以在內存中活動,並根據kernel本身功能在內存當中探索硬件並加載硬件驅動程序並完成內核初始化,bootloader會將控制權限轉交給內核。

Kernel(初始化)
     
我們知道kernel是完成探索硬件及加載硬件驅動程序,並以讀寫的方式掛載根文件系統。那麼這裏就出現一個比較詭異的問題,是什麼問題呢?

      我們又知道,要想訪問真正的根文件系統(rootfs)的話,就必須加載根文件系統中的設備,這時根文件系統又沒有掛載,要掛載根文件系統又得加載根文件系統中的驅動程序,哪怎麼辦呢?這是就用到了initrd文件了。
在來說下kernel初始化所要工作的內容做下簡單總結:
        探測硬件->加載驅動(initrd)->掛載根文件系統->rootfs(/sbin/init)

initrd功能介紹
     
  其實說白了initrd就是一個虛擬的文件系統,裏面有/、lib、bin、sbin、usr、proc、sys、var、dev、boot等一些目錄,其實你會發現裏面的目錄有點像真的/對吧,所以我們稱之爲虛擬的根文件系統,作用就是將kernel和真的根文件系統建立關聯關係,讓kernel去initrd中加載根文件系統所需要的驅動程序,並以讀寫的方式掛載根文件系統,並讓執行用戶當中第一個進程init。

/sbin/init(/etc/inittab)
         /sbin/init啓動會用到/etc/inittab所定義的條目,如:默認登陸級別id:3:initdefault:(這裏就是默認啓動3級別)
下面就來說下/etc/inittab所工作那些內容:
/etc/inittab
默認運行級別
0:halt
1: single user mode(單用戶維護模式)
2:multi user mode, without NFS(不支持NFS功能)
3: multi user mode, text mode(字符界面)
4:reserved (系統保留)
5: multi user mode, graphic mode  (圖形化界面)
6: reboot   (重啓)
系統初始化(/etc/rc.d/rc.sysinit)
檢測,並以讀寫方式掛載根文件系統
設定主機名
檢測並掛載/etc/fstab中其它文件系統
啓動swap分區
初始化外圍硬件設備驅動
根據/etc/sysctl.conf設定內核參數
激活udev和selinux
激活LVM和RAID設備
清理過期鎖文件和PID文件
裝載鍵映射-->鍵盤上每個鍵的功能
運行指定級別的服務腳本
/etc/rc.d/init.d/
/etc/rc.d/rc#.d
                       rc0-rc6
                                     K*     ##只要是以K開頭的文件均執行stop工作
                                     S*     ##只要是以S開頭的文件均執行start工作
                                     0-99  (執行次序,數字越小越先被執行) 
init執行/etc/rc.d/rc.local
init執行中斷機模擬程序mingetty來啓動login進程,最後等待用戶登錄

下面在來說下/etc/inittab的語法及格式:
/etc/inittab格式及語法(:)
[設置選項]:[runlevel]:[init操作行爲]:[命令選項]
設置選項:
               代表init主要工作選項
運行級別
               0-6
init操作行爲:
               initdefault:代表默認運行級別
                  sysinit:代表系統初始化操作選項
                  ctrlaltdel:代表重啓的相關設置
                  wait:代表上一個命令執行結束後方可執行下面的操作
                  respawn:代表後面字段可以無限制再生(reboot)
命令選項
             
一些命令,不過通常都是腳本
 

init處理流程:
 根據/etc/inittab設置進行處理:以默認級別3說明:id:3:initdefault:
 default runlevel->/etc/rc.d/rc.sysinit->/etc/rc.d/rc5.d->ctrlatdel->set "pf" and "pr"->mingetty->login


init處理系統初始化流程/etc/rc.d/rc.sysinit(設置系統環境)
取得網絡環境與主機類型->/etc/sysconfig/network
測試與掛載內存設備/proc及/sys
SElinux
啓動系統的隨機數生成器
設置終端機字體
設置系統啓動過程中的歡迎界面
設置系統時間與時區設置/etc/sysconfig/clock
接口設備檢測
用戶自定義模塊加載->/etc/sysconfig/modules/*.modules
根據/etc/sysctl.conf設置內核參數
初始化軟件磁盤陣列->/etc/mdadm.conf
初始化LVM文件系統功能
fsck檢測磁盤文件系統
磁盤配額
檢測,並以讀寫方式重新掛載根文件系統
清除清除過程當中的臨時文件
將啓動的相關信息->/var/log/dmesg
 
啓動服務與相關啓動配置文件(/etc/rc.d/rc # &/etc/sysconfig )
以默認級別3說明:id:3:initdefault:
l3:3:wait:/etc/rc.d/rc 3
找到/etc/rc.d/rc3.d
 以K*開頭的文件,並運行/etc/rc.d/rc3.d/K* stop
 以S*開頭的文件,並運行/etc/rc.d/rc3.d/S* start
 /etc/rc.d/rc#.d/裏面的文件鏈接的都是/etc/rc.d/init.d的文件

用戶自定義開機啓動程序(/etc/rc.d/rc.local)
可以根據自己的需求將一些執行命令或是腳本寫到/etc/rc.d/rc.local裏,當開機時,就可以加載啦


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

 

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