Linux系統啟動流程

對于linux系統的初學者來說,理解并掌握linux系統啟動流程能夠使你夠深入的理解linux系統,還可以通過系統的啟動過程來分析問題解決問題。

  Linux系統的啟動流程


  關于linux系統的啟動流程可以分為以下步驟:

    POST(加電自檢)–>加載BIOS(Basic Input/Outpu System)–>確定啟動設備(Boot sequence)、加載Boot Loader–>加載內核(kernel)初始化initrd–>運行/sbin/init初始化系統–>打印用戶登錄提示符

   下面讓我們逐步剖析說明系統啟動過程:

   1、POST開機自檢

      linux開機加電后,系統開始開機自檢,該過程主要對計算機各種硬件設備進行檢測,如CPU、內存、主板、硬盤、CMOS芯片等,如果出現致命故障則停機,并且由于初始化過程還沒完成,所以不會出現任何提示信號;如果出現一般故障則會發出聲音等提示信號,等待故障清除;若未出現故障,加電自檢完成。

   2、開機自檢完成,查找可啟動設備,加載主引導目錄(MBR)

      開機自檢完成后,CPU首先讀取位于CMOS中的BIOS程序,按照BIOS中設定的啟動次序(Boot Sequence)逐一查找可啟動設備,找到可啟動的設備后,去該設備的第一個扇區 中讀取MBR,那么MBR是什么哪?它又有什么作用哪?

       MBR存在于可啟動磁盤的0磁道0扇區,占用512字節,它主要用來告訴計算機從選定的可啟動設備的哪個分區來加載引導加載程序(Boot loader),MBR中存在如下內容:

           (1) Boot Loader 占用446字節,存儲有操作系統(OS)相關信息,如操作系統名稱,操作系統內核位置等,它的主要功能是加載內核到內存中運行。

           (2) Partition Table 分區表,占用64字節,每個主分區占用16字節(這就是為啥一塊硬盤只能有4個主分區啦^_^)

           (3)分區表有效性標記占用2字節 

       CPU將MBR讀取至內存,運行GRUB(Boot Loader常用的有GRUB和LILO兩種,現在常用的是GRUB),GRUB會把內核加載到內存去執行。

       blob.png

       由上圖可以看出,內核文件存在于/boot目錄下,但是在GRUB加載內核時,連/還沒有被加載,它是怎么在磁盤上找到內核的哪?我們來查看一下GRUB的配置文件可以找到答案。

       blob.png

       在/boot/grub/grub.conf中可以看到 root (hd0,0)這一行實際上是指定了/目錄的所在的位置,但這個根并不是真正的根,而是/所在的位置,可以理解成/boot是處在(hd0,0)/boot,而這里的(hd0,0)指的是第一個磁盤的第一個分區,GRUB不是通過文件系統來訪問內核的,以因為此時內核還沒有啟動,不存在文件系統,而是直接訪問      第一個磁盤的第一個分區(通過MBR中的分區表來識別分區),而識別MBR中的分區的文件系統,則是由GRUB通過加載自身攜帶的系統文件來實現的,這些文件在/boot/grub目錄中

      blob.png

    大家可以看到,紅色標出的地方就是GRUB可以識別的文件系統的類型了。事實上,總結一下,grub啟動過程可以分為兩個步驟:

      第1階段   BIOS加載MBR中的GRUB(GRUB第一階段的文件),而GRUB只有446字節,無法實現太多功能,所以利用該階段的文件去加載1.5階段的文件(/boot/grub/下的文      件)

      第1.5階段 用來加載識別文件系統的文件,識別完系統后才可以找到/boot目錄。

      第2階段  尋找內核并加載到內存中。

     下圖是GRUB啟動過程中所用的的文件

     blob.png 

   3、加載內核,初始化initrd

     GRUB把內核加載到內存后展開并運行,此時GRUB的任務已經完成,接下來內核將會接管并完成 探測硬件–>加載驅動–>掛載根文件系統–>切換至根文件系統(rootfs)–>運行/sbin/init完成系統初始化。但是,問題來了,要訪問根文件系統必須要加載根文件系統所在的設備,而這時根文件系統又沒有掛載,要掛載根文件系統有需要根文件系統的驅動程序,這是一個典型的先有雞先有蛋的問題啊!為解決這個問題,GRUB在加載內核同時,也把initrd加載到內存中并運行,那么initr又起到了什么作用哪?

     blob.png

   initrd展開后的文件

     blob.png  

   linux中/下的文件 

     blob.png  

   我們可以看到,其實initrd文件其實是一個虛擬的根文件系統,里面有bin、lib、lib64、sys、var、etc、sysroot、dev、proc、tmp等根目錄,它的功能就是講內核與真正的根建立聯系,內核通過它加載根文件系統的驅動程序,然后以讀寫方式掛載根文件系統,至此,內核加載完成。

    4、運行/sbin/init,進行系統初始化 

    內核并加載進內存運行并以讀寫方式掛載完根文件系統后,執行第一個用戶進程init,init首先運行/etc/init/rcS.conf腳本,如下圖

   blob.png

   可以看到,init進程通過執行/etc/rc.d/rcS.conf首先調用了/etc/rc.d/rc.sysinit,對系統做初始化設置,我們來看看這個腳本都是做了些什么哪?

  blob.png

   事實上init執行/etc/rc.d/rc.sysinit的初始化將會做很多設置:

        1、獲得網絡環境 

       2、掛載設備 

       3、開機啟動畫面Plymouth(取替了過往的 RHGB) 

       4、判斷是否啟用SELinux 

       5、顯示于開機過程中的歡迎畫面 

       6、初始化硬件 

       7、用戶自定義模塊的加載 

       8、配置內核的參數 

       9、設置主機名 

       10、同步存儲器 

       11、設備映射器及相關的初始化 

       12、初始化軟件磁盤陣列(RAID) 

       13、初始化 LVM 的文件系統功能 

       14、檢驗磁盤文件系統(fsck) 

       15、設置磁盤配額(quota) 

       16、重新以可讀寫模式掛載系統磁盤 

       17、更新quota(非必要) 

       18、啟動系統虛擬隨機數生成器 

       19、配置機器(非必要) 

       20、清除開機過程當中的臨時文件 

       21、創建ICE目錄 

       22、啟動交換分區(swap) 

       23、將開機信息寫入/var/log/dmesg文件中

       init執行完/etc/rc.d/rc.sysinit后,將會執行/etc/inittab來設定系統運行的默認級別:

       blob.png

       如上圖,linux中共有[0-6]七個運行級別,而我自己系統的默認運行級別是3.

              設定玩系統默認運行級別以后,接著調用/etc/rc.d/rc腳本,這個腳本接收默認運行級別參數后,依腳本設置啟用或停止/etc/rc.d/rc[0-6].d/中相應的程序,如下圖,看一下我系統運行默認級別(級別)3下的內容吧

    blob.png

    如圖示,/etc/rc.d/rc[0-6].d/下的文件在系統初始化階段,以S開頭的將被啟動,以K開頭的將被關閉,文件名K/S 后面的的數字代表優先級,數字越小優先級越高,優先執行。

    最后,將執行/etc/rc.d/rc.local腳本,可以根據自己的需求將一些執行命令或者腳本寫到其中,當開機時就可以加載。

    5、打印登錄提示符

      系統初始化完成后,init給出用戶登錄提示符(login)或者圖形化登錄界面,用戶輸入用戶和密碼登陸后,系統會為用戶分配一個用戶ID(uid)和組ID(gid),這兩個ID是用戶的身份標識,用于檢測用戶運行程序時的身份驗證。登錄成功后,整個系統啟動流程運行完畢!

 

原創文章,作者:Silently,如若轉載,請注明出處:http://www.www58058.com/4457

(0)
SilentlySilently
上一篇 2015-05-18
下一篇 2015-05-18

相關推薦

  • N26-上海-莫言

    持續更新…

    Linux干貨 2016-12-26
  • Linux下find命令的使用

    為什么要使用find命令?     Linux系統中有著成千上萬的文件,如果你想要找到自己想要的文件,一款查找軟件是必不可少的,而locate是根據其生成的數據庫進行查找,雖然速度會略快,但非實時查找,有些新的文件或目錄是匹配不到的,而且locate是模糊匹配,而find命令為實時查找,且為精確匹配,如果你對目錄的權限…

    Linux干貨 2016-08-18
  • RAID磁盤陣列

                           又是一周走過      &nbsp…

    2017-08-13
  • gitlab-ce并發超過30引起ip被封1小時的問題

    系統環境描述 System information System:     Ubuntu 14.04 Current User:   git Using RVM:  no Ruby Version: …

    Linux干貨 2015-09-06
  • linux基礎學習之進程管理和任務計劃

    內容:   進程相關概念(用戶空間、內核空間,進程、線程)   進程及系統相關工具(ps、top、pgrep、pidof、kill)   調整nice值(nice、renice)   作業管理(jobs、fg、bg、kill,&)   計劃任務(at、crontab) 一、進程相關概念 內核的功用:進…

    Linux干貨 2016-09-07
  • 1021作業

    關于用戶和組相關配置文件的總結 /etc/passwd:用戶及相關屬性信息 在Linux /etc/passwd文件中每個用戶都有一個對應的記錄行,它記錄了這個用戶的一些基本屬性。系統管理員經常會接觸到這個文件的修改以完成對用戶的管理工作。這個文件對所有用戶都是可讀的。但是Linux /etc/passwd文件中都有些什么內容呢? #cat/etc/pass…

    Linux干貨 2016-10-24

評論列表(1條)

  • stanley
    stanley 2015-05-18 17:49

    哇哦,專業!只是標簽需要加下哦

欧美性久久久久