Linux進程的啟動順序是由系統初始化進程init開始的。在傳統的SysVinit啟動系統中,init進程是所有其他進程的父進程。init進程會按照一定的順序啟動系統中的各個服務和進程。
在SysVinit系統中,init進程會讀取/etc/inittab文件來確定要啟動的進程。該文件中定義了運行級別(runlevel)和對應的啟動腳本。運行級別是一個數字或字母,表示系統的不同狀態,比如0表示關機,1表示單用戶模式,2表示多用戶模式(沒有網絡服務),3表示完全多用戶模式,5表示帶圖形界面的多用戶模式等。
根據運行級別,init進程會執行對應的啟動腳本,啟動相應的服務和進程。啟動腳本一般存放在/etc/init.d目錄下,腳本的名稱通常以字母S或K開頭,后面跟著一個數字,用于表示啟動的順序。以S開頭的腳本表示要啟動的服務,而以K開頭的腳本表示要停止的服務。
例如,運行級別為3時,init進程會按照一定的順序執行/etc/rc.d/rc3.d目錄下所有以S開頭的腳本,以啟動相應的服務和進程。同樣,在切換到其他運行級別時,init進程會執行相應運行級別下的腳本,啟動或停止相應的服務和進程。
在新的init系統systemd中,啟動順序由unit文件來定義。unit文件是用于描述系統資源和服務的配置文件。systemd根據依賴關系來啟動和管理各個unit。每個unit都有一個唯一的名稱和類型,例如.service表示系統服務,.target表示一組相關的服務或其他unit。
systemd使用Target作為運行級別的概念,不同的Target對應不同的系統狀態。例如,multi-user.target表示多用戶模式,graphical.target表示圖形界面模式。每個Target都有對應的unit文件,定義了要啟動的服務和進程。
systemd啟動時,默認會加載default.target,該文件包含了系統啟動時要啟動的服務和進程。在default.target中,systemd會按照依賴關系依次啟動各個unit。
總的來說,Linux進程的啟動順序是由init或systemd進程按照配置文件中定義的順序來啟動的,根據運行級別或Target的不同,啟動的服務和進程也會有所區別。