init
init(為英語:initialization的簡寫)是Unix和類Unix系統中用來產生其它所有行程的程式。它以守護行程的方式存在,其行程號為1。Linux系統在開機時載入Linux內核後,便由Linux內核載入init程式,由init程式完成餘下的開機過程,比如載入執行級別,載入服務,啟動Shell/圖形化介面等等。
Unix系列中(如System III和System V)init的作用,和研究中的Unix和BSD衍生版本相比,發生了一些變化。大多數Linux發行版是和System V相容的,但是一些發行版如Slackware採用的是BSD風格,其它的如Gentoo是自己客製化的。後來Ubuntu[1][2]和其他一些發行版採用Upstart[3]來代替[4]傳統的init處理程式。至2015年,大部分Linux發行版都已採用新的systemd替代System V和Upstart,但systemd向下相容System V。
BSD風格
BSD init執行存放於/etc/rc的初始化shell指令碼,然後啟動基於文字模式的終端(getty)或者基於圖形介面的終端(窗口系統,如X)。這裏沒有執行模式的問題,因為檔案rc決定了init如何執行。
值得注意的是,現代的BSD衍生系統一直支援使用rc.local檔案的方式,它將在正常啟動過程接近最後的時間以子指令碼的方式來執行。這樣做減少了整個系統無法啟動的風險。然後,第三方軟件套件可以將它們獨立的start/stop指令碼安裝到一個本地的rc.d目錄中(通常這是由ports collection/pkgsrc完成的)。FreeBSD和NetBSD現在預設使用rc.d,該目錄中所有的用戶啟動指令碼,都被分成更小的子指令碼,和SysV類似。rcorder通常根據在rc.d目錄中指令碼之間的依賴關係來決定指令碼的執行順序。
SysV風格
System V init檢查'/etc/inittab'檔案中是否含有'initdefault'項。這告訴init系統是否有一個預設執行模式。如果沒有預設的執行模式,那麼用戶將進入系統控制台,手動決定進入何種執行模式。
執行模式
System V中執行模式描述了系統各種可能的狀態。通常會有8種執行模式,即執行模式0到6和S或者s。其中執行模式3為"保留的"執行模式:
- 0.關機
- 1.單用戶模式
- 6.重新啟動
除了模式0,1,6外,每種Unix和Unix-like系統對執行模式的定義不太一樣。通常在/etc/inittab檔案中定義了各種執行模式的工作範圍。
目前絕大多數Linux發行版已經基於新的systemd,systemd一般不再使用/etc/inittab檔案,也使用新的target取代System V的執行等級,但仍然相容System V的執行等級。若要設置系統預設的執行模式,需要使用systemctl default targetname.target命令。
預設的執行模式
作業系統 | 預設的執行模式 |
---|---|
AIX | 2 |
Arch Linux | 3 |
CentOS | 3 |
Debian GNU/Linux | 2 [5] |
Gentoo Linux | 3 |
Mandriva Linux | 5 |
Mac OS X | 3 |
Red Hat Linux / Fedora | 3 or 5 |
Slackware Linux | 3 |
Solaris | 3 [6] |
SUSE Linux | 5 [7] |
Ubuntu | 2 [5] |
上面的表中有兩種Linux發行版預設的執行模式為5,模式5是多用戶圖形環境(X Window System),通常還包括X顯示管理器。然而在Solaris作業系統中,模式5被保留用來執行關機和自動切斷電源。
大多數作業系統的用戶可以用下面的命令來判斷當前的執行模式是什麼:
$ runlevel
$ who -r
在root權限下,執行telinit或者init命令可以改變當前的執行模式。/etc/inittab檔案中設置的預設的執行模式在:initdefault:項中。
跳過init
Linux系統中,現代的bootloader(如LILO或者GRUB),用戶可以在初始化過程中最後啟動的行程來取代預設的/sbin/init
。
通常是在bootloader環境中通過執行init=/foo/bar
命令。例如,如果執行init=/bin/bash
,啟動單用戶root的shell環境,無需用戶密碼。
BSD的變種,大多數平台,bootstrap程式是可以被打斷的,然後執行boot -s
命令進入單用戶模式。
單用戶模式並不沒有跳過init,它仍然可以執行/sbin/init
,但是它將使init詢問exec()
將要執行的命令(預設為/bin/sh
)的路徑,而不是採用正常的多用戶啟動順序。如果內核啟動時在/etc/ttys
檔案中被標註為"不安全"(在某些系統中,當前的"安全模式"可能會有些變化),在允許這種情況(或者回退到單用戶模式,如果用戶執行CTRL+D
),init將首先詢問root用戶的密碼。
如果該程式退出,內核將在多用戶模式下重新執行init。如果系統從多用戶模式切換到單用戶模式,還將碰到上述的情況。
如果內核載入後,init不能被正常啟動,這將導致panic錯誤,此時系統將不可使用。想要通過init自身來改變init的路徑,不同的版本情況不太一樣(NetBSD中可執行boot -a
;FreeBSD中利用init_path
命令裝載變數)。
其他風格
很多人一直努力地從某些方面改進傳統的init守護行程,使它變得更完善。下面列出的是一些改進(排序不分先後):
- SystemStarter:用來替代launchd—AppleMac OS X開啟行程
- Initng:完全代替init,可以非同步開啟行程
- Upstart:完全代替init,可以非同步開啟行程,曾由Ubuntu等使用
- Service Management Facility:完全代替/重新設計Solaris啟動Solaris 10
- runit:跨平台的完全代替init可以並列啟動服務
- BootScripts:GoboLinux
- Mudur:用Python寫成的init替代品,可以非同步開啟行程,PardusLinux發行版
- systemd:完全替代init,可並列啟動服務,並能減少在shell上的系統開銷,相比傳統的System V是一大革新,已被大多數Linux發行版所使用
下面列出的專案還沒有大範圍的使用:
- eINIT,完全代替init,可以非同步開啟行程,但是完成這個過程可以不使用shell指令碼
- svscan 來自daemontools被用作1號行程 - 似乎將被runit替代
- cinit
- twsinit,部分用x86組譯寫成,只是用來證明一種概念
- minit
- OpenRC,由Gentoo客制
參考文獻
- ^ 存档副本. [2009-06-09]. (原始內容存檔於2016-03-06).
- ^ 存档副本. [2009-06-09]. (原始內容存檔於2009-06-02).
- ^ 存档副本. [2009-09-12]. (原始內容存檔於2009-09-04).
- ^ 存档副本. [2009-06-09]. (原始內容存檔於2017-03-14).
- ^ 5.0 5.1 存档副本. [2009-06-09]. (原始內容存檔於2021-02-01).
- ^ 存档副本. [2011-06-13]. (原始內容存檔於2007-08-18).
- ^ 存档副本 (PDF). [2009-06-09]. (原始內容 (PDF)存檔於2006-11-04).
外部連結
- Linux init man page
- FreeBSD init man page(頁面存檔備份,存於互聯網檔案館)
- boot-scripts
- runit(頁面存檔備份,存於互聯網檔案館)
- minit(頁面存檔備份,存於互聯網檔案館)
- rc.d(頁面存檔備份,存於互聯網檔案館)
- busybox(頁面存檔備份,存於互聯網檔案館)
- smf and milestones in Solaris 10(頁面存檔備份,存於互聯網檔案館)
- cinit
- twsinit(頁面存檔備份,存於互聯網檔案館)
- Mudur
參見
- pidof或者killall5,從System V開始在很多發行版中使用的另一種程式