1. 程式人生 > >Linux的啟動過程及init程序

Linux的啟動過程及init程序

Linux下有三個特殊程序:

  • idle程序(pid=0)
    idle程序其前身是系統建立的第一個程序,0號程序,也唯一一個沒有通過fork()或者kernel_thread產生的程序,由系統自動建立,執行在核心態。0號程序在建立了init程序後,演變成為idle程序。主處理器上的idle程序是由原始程序(0號程序)演變而來,從處理器上的idle程序是由init程序fork得到的,pid也為0。idle程序的優先順序最低,不參與排程,只有在執行佇列為空時才排程。
  • init程序(pid=1)
    init程序由0號程序建立,完成系統的初始化,是第一個使用者程序,是其他所有使用者程序的父程序。
  • kthreadd程序(pid=2)
    kthreadd程序由idle通過kernel_thread建立,始終執行在核心空間,負責核心程序的排程和管理。

init程序一開始是核心態,然後在運行了一個使用者態的init程式之後,轉成使用者態,之後只能在使用者態工作。使用者想要進入核心態只能通過呼叫API。
init程序要把自己轉換成使用者態,就需要執行一個使用者態的應用程式(init程式),需要執行這個程式就需要找到這個程式,需要找到這個程式就需要掛載根檔案系統,因為所有的應用程式都在檔案系統中。
所以,需要先掛載根檔案系統,並找到使用者態下的init程式。

Linux中的所有程序都是由init程序建立並執行的。首先Linux核心啟動,然後在使用者空間中啟動init程序,再啟動其他程序。在系統啟動完成後,init程序將變成守護程序監視系統的其他程序。
init啟動了login程序(使用者登入程序),命令列程序(提供命令列環境),shell程序(提供命令解釋和執行)
其中,shell程序是使用者登入後執行的第一個程式。

執行級別:

0  關機
1  單使用者
2  多使用者,會啟動網路功能,但不會啟動NFS,是維護模式
3  多使用者
4  不使用,預留
5  圖形化介面
6  重啟
emergency  急救模式

直接使用init+執行級別

在centos7中,init程序是systemed程序;在centos6中是upstart程序;在centos5中是init程序,在unbuntu中是init程序。

Centos7啟動過程:

1.開啟電源
2.POST加電自檢。初始化硬體裝置,檢查系統主要外圍裝置。啟動固化在主機板上的ROM晶片上的BIOS程式,BIOS程式會檢測記憶體,CPU,IO裝置等是否能正常執行。只要一通電,CPU就會自動載入BIOS程式,檢測完成之後進行硬體的初始化。
3.根據BIOS啟動的順序依次掃描各個引導裝置,讀取MBR(主引導扇區,是硬碟的第一個扇區)中的主載入程式bootloader並載入到記憶體執行。


4.執行MBR中的BootLoader(centos7是GRUB2),載入其配置檔案,提供一個選單給使用者,選擇要啟動的系統或者核心版本。
5.載入核心,核心得到系統控制權後,進行初始化。探測可識別的硬體裝置,載入硬體驅動程式,以只讀方式掛載檔案系統,執行使用者空間的第一個程式systemed。
6.載入systemed的配置檔案,根據配置檔案設定預設執行級別。
7.執行系統初始化指令碼/etc/rc.d/rc.sysinit,完成系統初始化。
8.啟動終端,列印登入提示符。

unit檔案:
systemed可以管理所有的系統資源,不同的資源統稱為unit檔案。
unit檔案一共有12種檔案型別:

    • .service:系統服務
    • .target:多個unit組成的一組,引導其他unit,代替了以前的執行級別
    • .device:硬體裝置
    • .mount:檔案系統的掛載點
    • .automount:自動掛載點
    • .path:用於監控指定的目錄變化,並觸發其他unit執行,用於定義檔案系統的一個檔案或目錄
    • .scope:描述一些系統服務的分組資訊,不是使用者建立的,系統自己產生的
    • .slice:程序組
    • .snapshot:systemed快照
    • .socket:程序間通訊的socket
    • .swap:用於做虛擬記憶體的交換分割槽,標識swap裝置
    • .timer:定時器