本頁使用了標題或全文手工轉換

init

維基百科,自由的百科全書
跳至導覽 跳至搜尋

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

Unix 系列中(如 System IIISystem V)init的作用,和研究中的 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 開始在很多發行版中使用的另一種程式