天天看點

什麼是 Init 系統 , init 系統的曆史和現狀(上)什麼是 Init 系統 , init 系統的曆史和現狀(上)

Linux 作業系統的啟動首先從 BIOS 開始,接下來進入 boot loader,由 bootloader 載入核心,進行核心初始化。核心初始化的最後一步就是啟動 pid 為 1 的 init 程序。這個程序是系統的第一個程序。它負責産生其他所有使用者程序。

init 以守護程序方式存在,是所有其他程序的祖先。init 程序非常獨特,能夠完成其他程序無法完成的任務。

Init 系統能夠定義、管理和控制 init 程序的行為。它負責組織和運作許多獨立的或相關的始化工作(是以被稱為 init 系統),進而讓計算機系統進入某種使用者預訂的運作模式。

僅僅将核心運作起來是毫無實際用途的,必須由 init 系統将系統代入可操作狀态。比如啟動外殼 shell 後,便有了人機互動,這樣就可以讓計算機執行一些預訂程式完成有實際意義的任務。

或者啟動 X 圖形系統以便提供更佳的人機界面,更加高效的完成任務。這裡,字元界面的 shell 或者 X 系統都是一種預設的運作模式。

大多數 Linux 發行版的 init 系統是和 System V 相相容的,被稱為 sysvinit。這是人們最熟悉的 init 系統。一些發行版如 Slackware 采用的是 BSD 風格 Init 系統,這種風格使用較少,本文不再涉及。

其他的發行版如 Gentoo 是自己定制的。Ubuntu 和 RHEL 采用 upstart 替代了傳統的 sysvinit。而 Fedora 從版本 15 開始使用了一個被稱為 systemd 的新 init 系統。

可以看到不同的發行版采用了不同的 init 實作,本系列文章就是打算講述三個主要的 Init 系統:sysvinit,UpStart 和 systemd。了解它們各自的設計特點,并簡要介紹它們的使用。

在 Linux 主要應用于伺服器和 PC 機的時代,SysVinit 運作非常良好,概念簡單清晰。它主要依賴于 Shell 腳本,這就決定了它的最大弱點:啟動太慢。在很少重新啟動的 Server 上,這個缺點并不重要。

而當 Linux 被應用到移動終端裝置的時候,啟動慢就成了一個大問題。為了更快地啟動,人們開始改進 sysvinit,先後出現了 upstart 和 systemd 這兩個主要的新一代 init 系統。Upstart 已經開發了 8 年多,在不少系統中已經替換 sysvinit。Systemd 出現較晚,但發展更快,大有取代 upstart 的趨勢。

本文的第一部分先簡要介紹 sysvinit。

sysvinit 就是 system V 風格的 init 系統,顧名思義,它源于 System V 系列 UNIX。它提供了比 BSD 風格 init 系統更高的靈活性。是已經風行了幾十年的 UNIX init 系統,一直被各類 Linux 發行版所采用。

Sysvinit 用術語 runlevel 來定義"預訂的運作模式"。Sysvinit 檢查 '/etc/inittab' 檔案中是否含有 'initdefault' 項。 這告訴 init 系統是否有一個預設運作模式。如果沒有預設的運作模式,那麼使用者将進入系統控制台,手動決定進入何種運作模式。

sysvinit 中運作模式描述了系統各種預訂的運作模式。通常會有 8 種運作模式,即運作模式 0 到 6 和 S 或者 s。

每種 Linux 發行版對運作模式的定義都不太一樣。但 0,1,6 卻得到了大家的一緻贊同:

0 關機

1 單使用者模式

6 重新開機

通常在 /etc/inittab 檔案中定義了各種運作模式的工作範圍。比如 RedHat 定義了 runlevel 3 和 5。運作模式 3 将系統初始化為字元界面的 shell 模式;運作模式 5 将系統初始化為 GUI 模式。

無論是指令行界面還是 GUI,運作模式 3 和 5 相對于其他運作模式而言都是完整的正式的運作狀态,計算機可以完成使用者需要的任務。而模式 1,S 等往往用于系統故障之後的排錯和恢複。

很顯然,這些不同的運作模式下系統需要初始化運作的程序和需要進行的初始化準備都是不同的。比如運作模式 3 不需要啟動 X 系統。使用者隻需要指定需要進入哪種模式,sysvinit 将負責執行所有該模式所必須的初始化工作。

Sysvinit 巧妙地用腳本,檔案命名規則和軟連結來實作不同的runlevel。首先,sysvinit 需要讀取/etc/inittab 檔案。分析這個檔案的内容,它獲得以下一些配置資訊:

系統需要進入的 runlevel

捕獲組合鍵的定義

定義電源 fail/restore 腳本

啟動 getty 和虛拟控制台

得到配置資訊後,sysvinit 順序地執行以下這些步驟,進而将系統初始化為預訂的 runlevel X。

/etc/rc.d/rc.sysinit

/etc/rc.d/rc 和/etc/rc.d/rcX.d/ (X 代表運作級别 0-6)

/etc/rc.d/rc.local

X Display Manager(如果需要的話)

首先,運作 rc.sysinit 以便執行一些重要的系統初始化任務。在 RedHat 公司的 RHEL5 中(RHEL6 已經使用 upstart 了),rc.sysinit 主要完成以下這些工作。

激活 udev 和 selinux

設定定義在/etc/sysctl.conf 中的核心參數

設定系統時鐘

加載 keymaps

使能交換分區

設定主機名(hostname)

根分區檢查和 remount

激活 RAID 和 LVM 裝置

開啟磁盤配額

檢查并挂載所有檔案系統

清除過期的 locks 和 PID 檔案

完成了以上這些工作之後,sysvinit 開始運作/etc/rc.d/rc 腳本。根據不同的 runlevel,rc 腳本将打開對應該 runlevel 的 rcX.d 目錄(X 就是 runlevel),找到并運作存放在該目錄下的所有啟動腳本。每個 runlevel X 都有一個這樣的目錄,目錄名為/etc/rc.d/rcX.d。

在這些目錄下存放着很多不同的腳本。檔案名以 S 開頭的腳本就是啟動時應該運作的腳本,S 後面跟的數字定義了這些腳本的執行順序。在/etc/rc.d/rcX.d 目錄下的腳本其實都是一些軟連結檔案,真實的腳本檔案存放在/etc/init.d 目錄下。如下所示:

當所有的初始化腳本執行完畢。Sysvinit 運作/etc/rc.d/rc.local 腳本。

rc.local 是 Linux 留給使用者進行個性化設定的地方。您可以把自己私人想設定和啟動的東西放到這裡,一台 Linux Server 的使用者一般不止一個,是以才有這樣的考慮。

Sysvinit 不僅需要負責初始化系統,還需要負責關閉系統。在系統關閉時,為了保證資料的一緻性,需要小心地按順序進行結束和清理工作。

比如應該先停止對檔案系統有讀寫操作的服務,然後再 umount 檔案系統。否則資料就會丢失。

這種順序的控制這也是依靠/etc/rc.d/rcX.d/目錄下所有腳本的命名規則來控制的,在該目錄下所有以 K 開頭的腳本都将在關閉系統時調用,字母 K 之後的數字定義了它們的執行順序。

這些腳本負責安全地停止服務或者其他的關閉工作。

此外,在系統啟動之後,管理者還需要對已經啟動的程序進行管理和控制。原始的 sysvinit 軟體包包含了一系列的控制啟動,運作和關閉所有其他程式的工具。

halt

停止系統。

init

這個就是 sysvinit 本身的 init 程序實體,以 pid1 身份運作,是所有使用者程序的父程序。最主要的作用是在啟動過程中使用/etc/inittab 檔案建立程序。

killall5

就是 SystemV 的 killall 指令。向除自己的會話(session)程序之外的其它程序發出信号,是以不能殺死目前使用的 shell。

last

回溯/var/log/wtmp 檔案(或者-f 選項指定的檔案),顯示自從這個檔案建立以來,所有使用者的登入情況。

lastb

作用和 last 差不多,預設情況下使用/var/log/btmp 檔案,顯示所有失敗登入企圖。

mesg

控制其它使用者對使用者終端的通路。

pidof

找出程式的程序識别号(pid),輸出到标準輸出裝置。

poweroff

等于 shutdown -h –p,或者 telinit 0。關閉系統并切斷電源。

reboot

等于 shutdown –r 或者 telinit 6。重新開機系統。

runlevel

讀取系統的登入記錄檔案(一般是/var/run/utmp)把以前和目前的系統運作級輸出到标準輸出裝置。

shutdown

以一種安全的方式終止系統,所有正在登入的使用者都會收到系統将要終止通知,并且不準新的登入。

sulogin

當系統進入單使用者模式時,被 init 調用。當接收到啟動加載程式傳遞的-b 選項時,init 也會調用 sulogin。

telinit

實際是 init 的一個連接配接,用來向 init 傳送單字元參數和信号。

utmpdump

以一種使用者友好的格式向标準輸出裝置顯示/var/run/utmp 檔案的内容。

wall

向所有有資訊權限的登入使用者發送消息。

不同的 Linux 發行版在這些 sysvinit 的基本工具基礎上又開發了一些輔助工具用來簡化 init 系統的管理工作。

比如 RedHat 的 RHEL 在 sysvinit 的基礎上開發了 initscripts 軟體包,包含了大量的啟動腳本 (如 rc.sysinit) ,還提供了 service,chkconfig 等指令行工具,甚至一套圖形化界面來管理 init 系統。

其他的 Linux 發行版也有各自的 initscript 或其他名字的 init 軟體包來簡化 sysvinit 的管理。

隻要您了解了 sysvinit 的機制,在一個最簡的僅有 sysvinit 的系統下,您也可以直接調用腳本啟動和停止服務,手動建立 inittab 和建立軟連接配接來完成這些任務。是以了解 sysvinit 的基本原理和指令是最重要的。您甚至也可以開發自己的一套管理工具。

Sysvinit 的優點是概念簡單。Service 開發人員隻需要編寫啟動和停止腳本,概念非常清楚;将 service 添加/删除到某個 runlevel 時,隻需要執行一些建立/删除軟連接配接檔案的基本操作;這些都不需要學習額外的知識或特殊的定義文法(UpStart 和 Systemd 都需要使用者學習新的定義系統初始化行為的語言)。

其次,sysvinit 的另一個重要優點是确定的執行順序:腳本嚴格按照啟動數字的大小順序執行,一個執行完畢再執行下一個,這非常有益于錯誤排查。

UpStart 和 systemd 支援并發啟動,導緻沒有人可以确定地了解具體的啟動順序,排錯不易。

但是串行地執行腳本導緻 sysvinit 運作效率較慢,在新的 IT 環境下,啟動快慢成為一個重要問題。此外動态裝置加載等 Linux 新特性也暴露出 sysvinit 設計的一些問題。針對這些問題,人們開始想辦法改進 sysvinit,以便加快啟動時間,并解決 sysvinit 自身的設計問題。

Upstart 是第一個被廣泛應用的新一代 init 系統。我們在接下來的第二部分介紹 UpStart。

來源:www.ibm.com(點選閱讀原文即可進去)

未完待續...

繼續閱讀