動作

Upstart

出自 Itsmw

UpStart 簡介

這個是 Ubuntu Linux 用來規範開機啟動程序的工具,是由 Canonical Ltd. 公司(Ubuntu)的員工 Scott James Remnant 開發而成。在 Unix-Like 底下,這原來是由 sysvinit 服務,並配合 runlevel 的機制運作,但 Ubuntu 為實現快速開機的需求,因此另外建立 Upstart 專案,並巧妙的融合 sysvinit 的運作於內。


Ubuntu 自 6.10 起就開始採用此一機制,但並不是一開始就全面停用 System-V init,取而代之的是漸漸的移轉,因此即使到了 12.04 仍有部分的網路服務是採用 System-V init。



Ubuntu 開機管理

其實 Ubuntu 的開機管理是以 upstart 為主核心,巧妙的融入原 System-V init 機制。但以使用者的觀點來看,仍可以用簡單的兩分法:某些服務跑 sysvinit ;另外走 upstart。因此,要設定開機是否啟用某服務,只要搞懂該服務是走那個路子的,就有辦法改。



判斷依據

  1. 在 /etc/init 底下找不到該 .conf ,就歸 sysvinit 管。
  2. 下指令
    root@dns:~# initctl list
    若是由 upstart 啟動的服務,便會列出其狀態。



System-V init 運作機制

  • 設定工具: rcconf
  • 適用服務:目前大多數的服務,舉凡 apache2 , xrdp, postfix,...等
  • 工作目錄:所有服務的啟動 shell 放在 /etc/init.d 底下
  • 運作概要:
    • 在 /etc/ 底下,分成 rc1.d, rc2.d, rc3.d, rc4.d, rc5.d 及 rcS.d 幾個資料夾,代表當以某個 level 來開機時,要啟動的程序有那些。
    • RunLevel 重點
      • rcS.d -> 無論那個 runlevel ,必定要執行的服務。
      • rc1.d -> 安全模式下(sigle user mode)會啟動的項目
      • rc3.d -> 純文字介面下會啟動的項目
      • rc5.d -> 圖形化介面下會啟動的項目
    • 各個 runlevel (rcX.d)下要啟動的項目,以,在該資料夾底下建立該服務的啟動捷徑
      例如: /etc/rc3.d/K09apache2 -> /etc/init.d/apache2
    • 這些動作的設定,是用 rcconf 或 sysv-rc-conf 工作來作,不必打指令



UPStart 運作機制

  • 設定工具:無,但可透過設定檔的修改,來決定開機是否啟動
  • 適用服務:請參考本文最下方的列表
  • 工作目錄:所有啟動程序在 /etc/init 底下
  • 工作原理:
    • 每個服務,都被寫成一個工作定義檔,例:ssh.conf
    • 這個工作定義檔,包含了:要在那些 runlevel 執行;啟動要檢查及執行那些指令。
    • 不像 System-V init 一樣,還要建立「捷徑」來控制。



UPStart 開機啟動設定

前置說明

  • 服務一旦安裝,設定檔便會自動寫妥,並設定成開機自動啟動
  • /etc/init/ 底下的 *.conf 只是工作定義,不是 SHELL Script
  • 定義檔參數說明(英文)
    http://upstart.ubuntu.com/wiki/Stanzas



/etc/init/*.conf 工作定義檔結構說明

四大區塊解說:以 /etc/init.d/vsftpd.conf 為例

  • 註解區
description     "vsftpd daemon"
author          "Chuck Short <zulcss@ubuntu.com>"


  • 啟動時機暨啟動失敗管理
# 在檔案系統及網卡啟動後 start
start on (filesystem and net-device-up IFACE!=lo) 

# 若 runlevel 不在 2345 的情況下要 stop 運作(意即 single user mode 下要 stop)
stop on runlevel [!2345]

# 若啟動失敗,要重試
respawn

# 在 5 秒內重試 10 次,仍無法啟動成功就放棄
respawn limit 10 5


  • 啟動前置作業
pre-start script
        check_standalone_mode()
        {
                # Return 1 if vsftpd.conf doesn't have listen yes or listen_ipv6=yes
                CONFFILE="/etc/vsftpd.conf"

                if [ -e  "${CONFFILE}" ] && ! egrep -iq "^ *listen(_ipv6)? *= *yes" "${CONFFILE}"
                then
                        echo "${CONFFILE}: listen disabled - service will not start"
                        return 1
                fi
        }
        [ -d /var/run/vsftpd ] || install -m 755 -o root -g root -d /var/run/vsftpd
        [ -d /var/run/vsftpd/empty ] || install -m 755 -o root -g root -d /var/run/vsftpd/empty
        check_standalone_mode || stop
end script


  • 啟動指令
exec /usr/sbin/vsftpd




關閉開機啟動的方式

  • 把 start on 那部分(可能一行或兩行),全部加「#」號註解掉,下次開機便不再啟動。
  • 以 ssh.conf 為例,/etc/init/ssh.conf 部分內容如下
description     "OpenSSH server"

#start on filesystem or runlevel [2345]
stop on runlevel [!2345]


  • 手動啟動 ssh 服務
    root@dns:~# start ssh
  • 手動關閉 ssh 服務
    root@dns:~# stop ssh
  • 檢查TCP port 22 的狀況,就知服務是否已啟用
    root@dns:~# netstat -nltp


  • 測試成果:重新開機後便知有沒有效




已轉成 upstart 的網路服務清單

  • 在 ubuntu 11.04 目前筆者已知的項目
    • vsftpd : tcp 21
    • ssh: tcp 22
    • dovecot: tcp 110, 143, 993, 995
    • nmbd: upd 137, 138
    • smbd: tcp 139, 445
    • mysql: localhost tcp 3306
  • ubuntu 後續版本之狀況,有時間再寫



本文小檔案

題名: Title::UPStart
作者: Creator::itsmw作者群
主題/關鍵詞: Subject::init daemon, upstart, sysvinit
簡述: Description::Ubuntu 上所採用的開機啟動管理
出版者: Publisher::MyIP itsmw 計畫
其他參與者: Contributor::itsmw作者群
日期: Date::2011-10-26
文件類型: Type::05作業系統
資料格式: Format::text/html
文件識別代號: Identifier::http://myip.tw/itsmw/index.php?title=Upstart
來源: Source::http://upstart.ubuntu.com/
語言: Language::zh-TW
相關資源: Relation::http://upstart.ubuntu.com/
文件涵蓋範圍: Coverage::Linux平台
版權規範: Rights::GNU Free Documentation License 1.2