歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 淺析 Linux 初始化 init 系統,第 2 部分: UpStart

淺析 Linux 初始化 init 系統,第 2 部分: UpStart

日期:2017/2/28 14:25:10   编辑:Linux教程

Upstart 簡介

假如您使用的 Linux 發行版是 Ubuntu,很可能會發現在您的計算機上找不到/etc/inittab 文件了,這是因為 Ubuntu 使用了一種被稱為 upstart 的新型 init 系統。

相關系列文章

  1. 淺析 Linux 初始化 init 系統,第 1 部分: sysvinit http://www.linuxidc.com/Linux/2014-12/110382.htm
  2. 淺析 Linux 初始化 init 系統,第 2 部分: UpStart http://www.linuxidc.com/Linux/2014-12/110381.htm
  3. 淺析 Linux 初始化 init 系統,第 3 部分: Systemd http://www.linuxidc.com/Linux/2014-12/110383.htm

開發 Upstart 的緣由

大約在 2006 年或者更早的時候, Ubuntu 開發人員試圖將 Linux 安裝在筆記本電腦上。在這期間技術人員發現經典的 sysvinit 存在一些問題:它不適合筆記本環境。這促使程序員 Scott James Remnant 著手開發 upstart。

當 Linux 內核進入 2.6 時代時,內核功能有了很多新的更新。新特性使得 Linux 不僅是一款優秀的服務器操作系統,也可以被用於桌面系統,甚至嵌入式設備。桌面系統或便攜式設備的一個特點是經常重啟,而且要頻繁地使用硬件熱插拔技術。在現代計算機系統中,硬件繁多、接口有限,人們並非將所有設備都始終連接在計算機上,比如 U 盤平時並不連接電腦,使用時才插入 USB 插口。因此,當系統上電啟動時,一些外設可能並沒有連接。而是在啟動後當需要的時候才連接這些設備。在 2.6 內核支持下,一旦新外設連接到系統,內核便可以自動實時地發現它們,並初始化這些設備,進而使用它們。這為便攜式設備用戶提供了很大的靈活性。

可是這些特性為 sysvinit 帶來了一些挑戰。當系統初始化時,需要被初始化的設備並沒有連接到系統上;比如打印機。為了管理打印任務,系統需要啟動 CUPS 等服務,而如果打印機沒有接入系統的情況下,啟動這些服務就是一種浪費。Sysvinit 沒有辦法處理這類需求,它必須一次性把所有可能用到的服務都啟動起來,即使打印機並沒有連接到系統,CUPS 服務也必須啟動。

還有網絡共享盤的掛載問題。在/etc/fstab 中,可以指定系統自動掛載一個網絡盤,比如 NFS,或者 iSCSI 設備。在本文的第一部分 sysvinit 的簡介中可以看到,sysvinit 分析/etc/fstab 掛載文件系統這個步驟是在網絡啟動之前。可是如果網絡沒有啟動,NFS 或者 iSCSI 都不可訪問,當然也無法進行掛載操作。Sysvinit 采用 netdev 的方式來解決這個問題,即/etc/fstab 發現 netdev 屬性掛載點的時候,不嘗試掛載它,在網絡初始化並使能之後,還有一個專門的 netfs 服務來掛載所有這些網絡盤。這是一個不得已的補救方法,給管理員帶來不便。部分新手管理員甚至從來也沒有聽說過 netdev 選項,因此經常成為系統管理的一個陷阱。

針對以上種種情況,Ubuntu 開發人員在評估了當時的幾個可選 init 系統之後,決定重新設計和開發一個全新的 init 系統,即 UpStart。UpStart 基於事件機制,比如 U 盤插入 USB 接口後,udev 得到內核通知,發現該設備,這就是一個新的事件。UpStart 在感知到該事件之後觸發相應的等待任務,比如處理/etc/fstab 中存在的掛載點。采用這種事件驅動的模式,upstart 完美地解決了即插即用設備帶來的新問題。

此外,采用事件驅動機制也帶來了一些其它有益的變化,比如加快了系統啟動時間。sysvinit 運行時是同步阻塞的。一個腳本運行的時候,後續腳本必須等待。這意味著所有的初始化步驟都是串行執行的,而實際上很多服務彼此並不相關,完全可以並行啟動,從而減小系統的啟動時間。在 Linux 大量應用於服務器的時代,系統啟動時間也許還不那麼重要;然而對於桌面系統和便攜式設備,啟動時間的長短對用戶體驗影響很大。此外雲計算等新的 Server 端技術也往往需要單個設備可以更加快速地啟動。

UpStart 滿足了這些需求,目前不僅桌面系統 Ubuntu 采用了 UpStart,甚至企業級服務器級的 RHEL 也默認采用 UpStart 來替換 sysvinit 作為 init 系統。

Upstart 的特點

UpStart 解決了之前提到的 sysvinit 的缺點。采用事件驅動模型,UpStart 可以:

  • 更快地啟動系統
  • 當新硬件被發現時動態啟動服務
  • 硬件被拔除時動態停止服務

這些特點使得 UpStart 可以很好地應用在桌面或者便攜式系統中,處理這些系統中的動態硬件插拔特性。

Upstart 概念和術語

Upstart 的基本概念和設計清晰明確。UpStart 主要的概念是 job 和 event。Job 就是一個工作單元,用來完成一件工作,比如啟動一個後台服務,或者運行一個配置命令。每個 Job 都等待一個或多個事件,一旦事件發生,upstart 就觸發該 job 完成相應的工作。

Job

Job 就是一個工作的單元,一個任務或者一個服務。可以理解為 sysvinit 中的一個服務腳本。有三種類型的工作:

  • task job;
  • service job;
  • abstract job;

task job 代表在一定時間內會執行完畢的任務,比如刪除一個文件;

service job 代表後台服務進程,比如 apache httpd。這裡進程一般不會退出,一旦開始運行就成為一個後台精靈進程,由 init 進程管理,如果這類進程退出,由 init 進程重新啟動,它們只能由 init 進程發送信號停止。它們的停止一般也是由於所依賴的停止事件而觸發的,不過 upstart 也提供命令行工具,讓管理人員手動停止某個服務;

Abstract job 僅由 upstart 內部使用,僅對理解 upstart 內部機理有所幫助。我們不用關心它。

除了以上的分類之外,還有另一種工作(Job)分類方法。Upstart 不僅可以用來為整個系統的初始化服務,也可以為每個用戶會話(session)的初始化服務。系統的初始化任務就叫做 system job,比如掛載文件系統的任務就是一個 system job;用戶會話的初始化服務就叫做 session job。

Job 生命周期

Upstart 為每個工作都維護一個生命周期。一般來說,工作有開始,運行和結束這幾種狀態。為了更精細地描述工作的變化,Upstart 還引入了一些其它的狀態。比如開始就有開始之前(pre-start),即將開始(starting)和已經開始了(started)幾種不同的狀態,這樣可以更加精確地描述工作的當前狀態。

工作從某種初始狀態開始,逐漸變化,或許要經歷其它幾種不同的狀態,最終進入另外一種狀態,形成一個狀態機。在這個過程中,當工作的狀態即將發生變化的時候,init 進程會發出相應的事件(event)。

表 1.Upstart 中 Job 的可能狀態
狀態名含義 Waiting 初始狀態 Starting Job 即將開始 pre-start 執行 pre-start 段,即任務開始前應該完成的工作 Spawned 准備執行 script 或者 exec 段 post-start 執行 post-start 動作 Running interim state set after post-start section processed denoting job is running (But it may have no associated PID!) pre-stop 執行 pre-stop 段 Stopping interim state set after pre-stop section processed Killed 任務即將被停止 post-stop 執行 post-stop 段

圖 1 展示了 Job 的狀態機。

圖 1. Job’s life cycle

其中有四個狀態會引起 init 進程發送相應的事件,表明該工作的相應變化:

  • Starting
  • Started
  • Stopping
  • Stopped

而其它的狀態變化不會發出事件。那麼我們接下來就來看看事件的詳細含義吧。

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-12/110381p2.htm

Copyright © Linux教程網 All Rights Reserved