Linux啟動:用Upstart 代替傳統init

來源:互聯網
上載者:User

 長期以來,多數Linux發行版一直在使用Unix System V引入的 init 系統。init 由核心自身產生,任務是啟動系統剩餘部分,產生並監視所有其它進程,看其是否停止或僵死。System V init 雖然過去一直啟動並執行很好,但它已經有些遲暮了。這就是 Ubuntu 6.10(Edgy Eft) 為什麼使用Upstart來代替正在老化的 init 系統。

 設計 Upstart 的目標就是提供一種代替 System V Init (sysvinit)的機制,並與其它已經開發好的 init 替代者目的有所不同。由於現在的案頭電腦和伺服器跟十年前相比已經非常不同了,在 Ubuntu 裡試圖繼續運轉系統時碰到了一些問題。

 過去,啟動時的操作相對簡單,比如檢查和掛載檔案系統。僅支援有限的硬體,上電時串連裝置,掉電時斷開。核心知道磁碟類型和數目,所以使用者空間的啟動進程檢查和掛載它們毫不費力。

處理新的硬體

 目前的系統必需處理新產生的硬體,它們可以幾乎無數目限制地被串連到更複雜的拓撲匯流排上。這些新裝置可以隨插即用,使用前不需供電,這意味著當硬體改變時核心接要收到這些資訊。發現硬體串連時初始化產生的問題是:沒有擷取響應的方法。

 遇到無線網路檔案系統時,問題更大,我們不僅要等待伺服器回應,網路介面自己也要被配置。涉及了通過無線存取點上傳韌體到卡,從網路伺服器上請求IP地址,並登入網頁獲得Internet 接入。

 針對這些問題的解決辦法已經存在。例如,Ubuntu 找到跟檔案系統後檢測很可能存在的硬體,迴圈等待預期硬體檢測完畢。這些方法依靠啟動時等待,而且前提是已知等待的硬體。使用者一般希望啟動越快越好,啟動等待方法無法持久。提前知道硬體資訊也許可行,但硬體不斷引入新特性打破了該假定。

 我們也許可以通過後台服務程式解決。比如 HP Linux 列印映像系統,它隨機器啟動而運行,一旦硬體串連,立刻就能夠使用。這種方式使得擁有該硬體的使用者受益,同時沒有這些硬體的使用者也沒什麼損失。但更令人感興趣的是:僅當硬體串連時才運行服務程式。

 Linux核心在硬體支援上變得越來越好,隨著udev的引入,核心驅動核心、使用者空間都能知道硬體串連資訊。儘管如此,我們仍然依賴為啟動程式設定的一些shell指令碼。啟動進程裡關於哪些硬體可用仍做了假定。

試圖更新 init 系統的其它方式

 以前替代 init 系統的方法,例如 LSB 規範和 initNG 都聚焦於自動決定指令碼順序,允許指令碼並行啟動。兩者都減輕了開發人員的負擔, 加快了啟動速度。

 其它系統如 Solaris SMF 和 runit,用來解決服務管理問題,允許系統管理員查詢和改變正在運行服務的狀態和設定。 最後,Apple的 launchd 沒有解決任何問題,它提供一個後台代替傳統的 Unix 服務:init, cron, inetd等。

 以上系統都未解決我們要解決的問題。我們需要一個init 後台,它可以讓我們通過從init系統之外( 如udev )傳來的事件對指令碼進行選擇和排序,而不是僅讓指令碼自身來決定。實際上,我們需要的init順序就是要由這些事件和它們自身決定。

 為了避免推倒從來,我們首先看看修改現存方法需要多大精力。Sun SMF 和 Apple launchd 因許可問題直接被排除。解決方案首先要很明確是"free"的,遵循GPL,這樣其它發行版本可以採用。

 來看InitNG,udev發布前,問題能否依靠指令碼解決受質疑,但我們不認為它比已有方法更好。使用 LSB 規範引入的特性,不需替代 init 背景程式,使用已有init指令碼同樣可以實現。

 我們需要的系統是:/etc/fstab列出的檔案系統在核心檢測塊裝置時檢查並載入。同樣的,當核心檢測網路時配置網卡,若已擷取一個 IP 位址,試圖載入遠程系統。如果當指令碼完成後自身產生事件,其它指令碼和後台服務就可以開始了。

基於事件的init daemon

 該設計採用的術語是 event-based init daemon。要管理的事情分為兩種:指令碼和二進位,事件產生觸發它們運行或停止。init daemon 在特定點產生特定事件,如啟動和關機及其它任何可以改變狀態的任務。其它事件可由系統其它部分產生,如udev。

 和基於依賴關係的 init daemons 如initNG 做個比較。它的每個任務對應於一個依賴的列表,需要該任務時啟動它所依賴的部分。這就需要一個最終的目的地組合,來確保該啟動的都啟動,一般使用不同的runlevels解決。

 基於依賴關係的 init daemon 啟動網路是因為 Apache 需要它,掛載檔案系統是因為 Apache 和 gdm 需要這樣。如果gdm 或 Apache 啟動失敗,意味著網路不會有效,除非網路本身是目的地組合中的一個。

 基於事件的 init daemon 啟動源於一個單獨的事件如 "startup" 。它不需 runlevels,只要硬體有效,系統就可啟動。對於發行版而言,預設安裝更靈活。只要網卡有效網路就會啟動。在基於依賴關係的系統裡,如果網卡啟動時刻未串連 Apache 不會啟動。對於基於事件的系統,如果網卡幾分鐘後插入, Apache 會自動啟動。

掛載檔案系統的任務流程如下:

   1. "startup" 事件使 udev 後台啟動.
   2. udev 後台配置並發出一個 "塊裝置被添加" 事件給所有新的塊裝置.
   3. 如果在fstab列表裡,"塊裝置被添加" 事件使得裝置被檢測和掛載.
   4. 當所有在fstab列出的FHS指定的檔案系統被掛載後,發送"fhs-filesystem" 事件.

此外,我們還可配置網路介面並掛載遠程檔案系統:

   1. udev 後台發送一個 "網路介面被添加" 事件給所有新的網路介面.
   2. 如果在/etc/network/interfaces列表裡,"網路介面被添加" 事件使得該介面啟用並被配置.
   3. 擷取 IP 位址引發 "網路介面啟用" 事件被發送.
   4. 設定預設閘道引發 "預設閘道啟用" 事件被發送.
   5. 這些事件使系統嘗試掛載遠程檔案系統,引發 "fhs-filesystem" 事件.

 這些事件鏈,不管使用者如何配置,都使系統相應部分開始運轉。如果系統不依賴任何網路檔案系統,也不必調整任務的依賴關係,事件會使它自動設定。

定義事件

 事件本身是簡單的字串,配合環境變數傳遞更詳細的資訊給處理事件的任務。增加參數或來源來識別增加了什麼裝置或哪個任務停止了。使用 "initctl" 工具,系統任何部分都能發出事件,或者通過Unix domain 通訊端與 init 直接通訊。

 /etc/event.d目錄定義了Jobs,最簡單的就是:二進位檔案名,或shell 代碼。稍複雜有:任務開始前或結束後有要執行的shell代碼, 以及資源限制和環境設定。Jobs 啟動時機:列表中任一事件發生。當另外一事件發生,它們可正常中止自身,停止或重新執行。

 該項目目標是簡化系統配置。目前,使用者必需自己配置任務,無論是啟動時、網路裝置啟用後、AC電源串連上、或系統休眠時。

 由於事件能夠被系統任何其它進程捕獲,我們想修改其它後台以便代替執行指令碼目錄,他們發送事件給 init 然後所有這些任務能在/etc/event.d被配置。未來潛力包括:根據使用者習慣執行任務,基於時間的事件代替 cron, anacron 和 atd ,代替 inetd 後台。

 使用 Upstart 可以解決許多問題,使 Linux 更加友好,避免競爭和醜陋的工作區,使系統管理員更輕鬆。

 Upstart 適用於任何 Linux 發行版來代替 sysvinit。注意,與其它替代機制一樣,它也有自己的配置,它不會執行已存在的init 指令碼除非配置允許執行。推薦的移植計劃是( Ubuntu 所遵循的): 執行已存在的 System V rc 指令碼,並且讓它負責遺留 init 指令碼。

 Edgy Eft 倉庫裡包含 Upstart,立刻安上它試試 Upstart 吧。
 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.