Linux的啓動過程及init進程

Linux下有三個特殊進程:shell

  • 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程序。centos

Linux中的全部進程都是由init進程建立並運行的。首先Linux內核啓動,而後在用戶空間中啓動init進程,再啓動其餘進程。在系統啓動完成後,init進程將變成守護進程監視系統的其餘進程。
init啓動了login進程(用戶登陸進程),命令行進程(提供命令行環境),shell進程(提供命令解釋和執行)
其中,shell進程是用戶登陸後運行的第一個程序。網絡

運行級別:socket

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

直接使用init+運行級別centos7

在centos7中,init進程是systemed進程;在centos6中是upstart進程;在centos5中是init進程,在unbuntu中是init進程。命令行

Centos7啓動過程:
init.png
1.打開電源
2.POST加電自檢。初始化硬件設備,檢查系統主要外圍設備。啓動固化在主板上的ROM芯片上的BIOS程序,BIOS程序會檢測內存,CPU,IO設備等是否能正常運行。只要一通電,CPU就會自動加載BIOS程序,檢測完成以後進行硬件的初始化。
3.根據BIOS啓動的順序依次掃描各個引導設備,讀取MBR(主引導扇區,是硬盤的第一個扇區)中的主引導程序bootloader並加載到內存執行。
啓動.png
4.執行MBR中的BootLoader(centos7是GRUB2),加載其配置文件,提供一個菜單給用戶,選擇要啓動的系統或者內核版本。
5.加載內核,內核獲得系統控制權後,進行初始化。探測可識別的硬件設備,加載硬件驅動程序,以只讀方式掛載文件系統,運行用戶空間的第一個程序systemed。
6.加載systemed的配置文件,根據配置文件設置默認運行級別。
7.運行系統初始化腳本/etc/rc.d/rc.sysinit,完成系統初始化。
8.啓動終端,打印登陸提示符。code

unit文件:
systemed能夠管理全部的系統資源,不一樣的資源統稱爲unit文件。
unit文件一共有12種文件類型:blog

    • .service:系統服務
    • .target:多個unit組成的一組,引導其餘unit,代替了之前的運行級別
    • .device:硬件設備
    • .mount:文件系統的掛載點
    • .automount:自動掛載點
    • .path:用於監控指定的目錄變化,並觸發其餘unit運行,用於定義文件系統的一個文件或目錄
    • .scope:描述一些系統服務的分組信息,不是用戶建立的,系統本身產生的
    • .slice:進程組
    • .snapshot:systemed快照
    • .socket:進程間通訊的socket
    • .swap:用於作虛擬內存的交換分區,標識swap設備
    • .timer:定時器
相關文章
相關標籤/搜索