Linux的啟動過程及init進程
- 2021 年 2 月 25 日
- 筆記
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:定時器