init

UNIX系統元件;在電腦系統開機期間第一個啟動的處理程序;持續執行到系統關閉的常駐程式;其他所有處理程序的直接或間接上層處理程序;自動成為孤立處理程序的上層

init(為英語:initialization的簡寫)是Unix類Unix系統中用來產生其它所有進程的程序。它以守護進程的方式存在,其進程號為1。Linux系統在開機時載入Linux內核後,便由Linux內核載入init程式,由init程式完成餘下的開機過程,比如載入執行級別,載入服務,啟動Shell/圖形化界面等等。

Unix系列中(如System IIISystem Vinit的作用,和研究中的UnixBSD衍生版本相比,發生了一些變化。大多數Linux發行版是和System V相兼容的,但是一些發行版如Slackware採用的是BSD風格,其它的如Gentoo是自己定製的。後來Ubuntu[1][2]和其他一些發行版採用Upstart[3]來代替[4]傳統的init處理程序。至2015年,大部分Linux發行版都已採用新的systemd替代System VUpstart,但systemd向下相容System V

BSD風格

編輯

BSD init運行存放於/etc/rc的初始化shell腳本,然後啟動基於文本模式的終端(getty)或者基於圖形界面的終端(窗口系統,如X)。這裡沒有運行模式的問題,因為文件rc決定了init如何執行。

值得注意的是,現代的BSD衍生系統一直支持使用rc.local文件的方式,它將在正常啟動過程接近最後的時間以子腳本的方式來執行。這樣做減少了整個系統無法啟動的風險。然後,第三方軟件包可以將它們獨立的start/stop腳本安裝到一個本地的rc.d目錄中(通常這是由ports collection/pkgsrc完成的)。FreeBSDNetBSD現在默認使用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外,每種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守護進程,使它變得更完善。下面列出的是一些改進(排序不分先後):

下面列出的項目還沒有大範圍的使用:

  • eINIT,完全代替init,可以異步開啟進程,但是完成這個過程可以不使用shell腳本
  • svscan 來自daemontools被用作1號進程 - 似乎將被runit替代
  • cinit
  • twsinit,部分用x86匯編寫成,只是用來證明一種概念
  • minit
  • OpenRC,由Gentoo客制

參考文獻

編輯
  1. ^ 存档副本. [2009-06-09]. (原始內容存檔於2016-03-06). 
  2. ^ 存档副本. [2009-06-09]. (原始內容存檔於2009-06-02). 
  3. ^ 存档副本. [2009-09-12]. (原始內容存檔於2009-09-04). 
  4. ^ 存档副本. [2009-06-09]. (原始內容存檔於2017-03-14). 
  5. ^ 5.0 5.1 存档副本. [2009-06-09]. (原始內容存檔於2021-02-01). 
  6. ^ 存档副本. [2011-06-13]. (原始內容存檔於2007-08-18). 
  7. ^ 存档副本 (PDF). [2009-06-09]. (原始內容 (PDF)存檔於2006-11-04). 

外部連結

編輯

參見

編輯
  • pidof或者killall5,從System V開始在很多發行版中使用的另一種程序