linux引導流程分析

學習Linux首先要做的工作,我覺得就是了解它的引導流程,這樣我們才能深入地瞭解系統。 首先簡單地概括下Linux的啓動過程:

      1、加載BIOS的硬件信息與進行自我測試,並依據設置取得第一個可啓動的設備;

      2、讀取並執行第一個啓動設備內MBR的的Boot Loader(即是grub,spfdisk等程序);

      3、依據Boot Loader的設置加載KernelKernel會開始檢測硬件與加載驅動程序;

      4、在硬件驅動成功後,Kernel會主動調用init進程,而init會取得run-level信息;

      5init執行/etc/rc.d/rc.sysinit文件來準備軟件執行的操作環境(如環境變量、網絡、時區等);

      6init執行/etc/rc.d/rc以根據默認設置的運行級別來啓動相應的腳本程序;

      7init執行/etc/rc.d/rcN.d (其中N=0-6)下的腳本以啓動相應的系統服務(如默認運行級別爲3,則這裏執行的是/etc/rc.d/rc3.d下的相應腳本);

      8init執行終端機模擬程序mingetty來啓動login進程,最後就是等待用戶登錄。

      呵呵,這一串描述下來有沒有點暈的感覺呢?反正我第一次接觸的時候是暈了。就算跟我一樣暈了也沒關係,下面我用圖來大概展示下這個過程:


      

系統引導過程中自檢程序載入Kernel後,Kernel要完成兩件事:驅動硬件和啓動init進程。init啓動後讀取inittab文件,執行缺省運行級別,從而繼續引導過程。在Unix系統中,init是第一個可以存在的進程,它的PID恆爲1,但它也必須向一個更高級的功能負責:PID0的內核調度器(Kernel scheduler,主要負責CPU時間分配和進程切換),從而獲得CPU時間。這裏有必要附加一點對Linux進程的說明,在Linux中,如果父進程終止而其子進程由於某種原因沒有終止,當系統檢測到這種孤立進程後,會將其父進程指向init進程;如果子進程終止了,而父進程不知道子進程已經終止,仍然試圖與其保持聯繫,這種情況下子進程將成爲殭屍進程。


由上面的分析我們知道,系統引導過程中啓動的第一個進程就是init進程,而init進程啓動後就立馬去讀取/etc/inittab配置文件進而繼續後續引導過程。那麼這個inittab文件中都是些什麼東東呢?下面我們就對這個/etc/inittab文件進行剖析。

我們直接打開這個inittab文件,我們會看到文件開頭一段註釋就是對文件功能的描述:



這一小段描述相信大家都能看懂,這裏我就不囉嗦了。再往下走,我們會看到Linux運行級別的描述:


由此我們知道系統有7個運行級別,0表示關機;1表示單用戶模式(注意,在該模式下只有root才能登陸);2表示多用戶模式,但是該模式下沒有NFS3表示多用戶模式;4暫時還沒使用;5表示圖形界面;6表示重啓。瞭解了系統的運行級別後我們就可以修改系統的默認運行級別了,設置系統默認運行級別就是接下來的一句配置系統默認是啓動圖形界面,通常我們不需要圖形界面就直接把這裏的5改成3來讓其默認啓動命令行。接着往下走,我們會看到這麼一小段由註釋我們知道這是系統初始化動作,在這裏我們看到了上面描述引導流程中提到的/etc/rc.d/rc.sysinit。接着往下我們看到了上面提到的/etc/rc.d/rc


這裏是上面提到的各個run level要執行的各項腳本放置處,主要通過/etc/rc.d/rc這個命令來處理相關任務。假設這默認的run level3,那麼系統接下來就會執行/etc/rc.d/rc3.d下面的腳本


我們會發現這裏面的文件都是以K或者S開頭的,其實這些S開頭的文件都是在run level3時需要運行的服務,而K開頭的文件都是run level3時需要停止的服務,到這裏系統就進入相應的運行級別啓動相應服務。我們接着來看inittab文件,下面一段內容我們大概瞭解下就行了


我們看到#Run gettys in standard runlevels這行註釋下面的這一段就是系統運行終端,默認提供6個運行終端tty1-tty6,我們也可以自己添加,通過這些運行終端我們就可以登錄系統。


這裏附加一點對inittab的說明,在inittab中所有的條目均採用個格式是id:run-levels:action:process。各個字段的分別表示:

      id:標識符,一般爲兩位字母或數字
      run-levels:指定運行級別,可以指定多個
      action:指定運行狀態
      process:指定要運行的腳本/命令


      其中常用的action值有:

      initdefault:指定系統缺省啓動的運行級別
      sysinit:系統啓動執行process中指定的命令
      wait:執行process中指定的命令,並等其結束再運行其他命令
      once:執行process中指定的命令,不等待其結束
      ctrlaltdel:按下Ctrl+Alt+Del時執行process指定的命令
      powerfail:當出現電源錯誤時執行process指定的命令,不等待其結束
      powerokwait:當電源恢復時執行process指定的命令
      respawn:一旦process指定的命令中止,便重新運行該命令


OK,上面就是Linux的引導流程。貌似寫的有點亂呀,湊合看吧。我這裏只是大概的分析了下啓動過程,如果想要更詳細地瞭解,推薦大家一本書《鳥哥的Linux私房菜》,這本書的第20章對這個啓動分析的很詳細。

發佈了30 篇原創文章 · 獲贊 0 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章