4,972 瀏覽數

System V 與 Upstart

不管你是用 RedHat 6 還是 Ubuntu 13.04 (Ubuntu 6.10 即採用 upstart 用以取代傳統 sysvinit) 都是採用 Upstart 的開機方式,這兩種 System V (傳統 Linux 開機方式) 與 Upstart 有什麼不同??

兩者最大的不同是 傳統 Linux 開機的方式為透過 Dependency-based 的方式將 Daemon (服務)一一開起,但 upstart 採用了 event-based 的方式不需要依序開起個別的 daemon.他可以同時開啟多個 Daemon.

不過並不是所有的程式都有 upstart 的格式,所以現在 RedHat / Ubuntu 仍然保留了傳統的 sysvinit 啟動方式.

System V

程式啟動腳本皆存放在 /etc/init.d , Ubuntu 可以用 #update-rc.d(RedHat 則是使用 #chkconfig,Ubuntu 也可以下載 sysv-rc-conf 來使用,類似 Redhat 的 #chkconfig)來決定 runlevel 是否啟用該服務,主要也是修改 /etc/init.d/ 的軟連結(symbolic links)在 /etc/rc#.d/。還記得 Sysvinit 的啟動前面會帶 K## 或 S##,前面代表 kill 或 start 的,後面的數字則是決定先後順序.

以前 Linux 系統是由 UNIX System V (“System five”) 為基礎所設計出的.這就是所謂的 sysvinit.而 Upstart 主要為了取代傳統的 init daemon Upstart 是由 Kernel 所生成用以啟動 (starting) ,監控(supervising)和 停止(stopping) 其他系統行程 (processes).

Upstart

Upstart 所採用的方式是平行啟動不同的 daemons 以及 services 甚至於驅動程式.這樣的方式可以讓系統快速開啟.不需再像傳統的方式必須等待其他服務或是裝置啟動,所有的行程( processes )可以同時在背景執行,不會影響到其他行程的啟動( processes )!

如果有服務非預期下死亡,在固定時間內會自動再被產生一次.

程式啟動腳本在 /etc/init/*.conf 定義哪些服務應該在何 runlevel 需要被執行

root@ben-virtual-machine:~# cat /etc/init/ssh.conf
# ssh - OpenBSD Secure Shell server
#
# The OpenSSH server provides secure shell access to the system.

description     "OpenSSH server"

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

respawn
respawn limit 10 5
umask 022

# 'sshd -D' leaks stderr and confuses things in conjunction with 'console log'
console none

pre-start script
    test -x /usr/sbin/sshd || { stop; exit 0; }
    test -e /etc/ssh/sshd_not_to_be_run && { stop; exit 0; }
    test -c /dev/null || { stop; exit 0; }

    mkdir -p -m0755 /var/run/sshd
end script

# if you used to set SSHD_OPTS in /etc/default/ssh, you can change the
# 'exec' line here instead
exec /usr/sbin/sshd -D

裡面定義了 srtart , stop 的 runlevel
start on filesystem or runlevel [2345]
stop on runlevel [!2345]

關於更多 Upstart 請參考
Upstart Intro, Cookbook and Best Practises
https://help.ubuntu.com/community/UbuntuBootupHowto

頭暈了嗎? 來整理一下剛剛說的 Upstart 與 sysvinit:
目錄與設定檔

  • /etc/init 這裡是 upstart init 的設定.
  • /etc/init.d 這裡是 sysvinit 的設定.
  • /etc/init/rc-sysinit.conf 這是控制傳統 sysvinit 腳本設定檔案,要新增傳統 sysvinit 腳本通常使用 update-rc.d 來新增
  • /etc/default 大部分的設定檔都會存放在這裡,包括傳統的 sysvinit 或是新的 upstart.

如何 啟動/停止/檢視 服務
sysvinit 傳統的 “service" 指令,在 upstart 已經不使用了,都改成為 #initctl ( reload, restart, start, status, stop 都是 initctl 的連結).

  • initctl – 在 upstart 新的啟動服務指令.
  • start – 啟動指定的 Job.
  • stop – 停止指定的 Job.
  • reload – 這個指令會發送 SIGHUP 信號發送給該 Job,請該 Job 自行重新初始化本身,但需要注意的是相關的設定檔不重讀.所以需要重讀設定檔的請使用 #initctl reload-configuration 這個指令.
  • restart – 工作 Job 會被 殺害 Kill 和重生 respawned, 請注意, restart 不會重新讀取設定檔,如果需要重新讀取設定檔請使用 #stop job ,然後 #start job
  • status – 查詢單一 Job 的狀態

這幾個 Job commands ,為了不要打這麼長一串的指令,所以系統已經將一些常用的幾個參數建立好連結成為獨立的指令 reload, restart, start, status, stop 都是 initctl 的連結

啟動服務

  • sysvinit
    #/etc/init.d/myservice start
    #service myservice start
    
  • Upstart
    #inintctl start myservice
    #start myservice
    

停止服務

  • sysvinit
    #/etc/init.d/myservice stop
    #service myservice stop
    
  • Upstart
    #inintctl stop myservice
    #stop myservice
    

列出服務

  • sysvinit
    #chkconfig --list
    #service --status-all
    
  • Upstart:
    #initctl list
    

透過 #service 這個指令一樣可以啟動 upstart 的服務,更多關於 initctl 請參考 http://benjr.tw/94015

7 個網友的想法 “System V 與 Upstart

  1. 自動參照通知: RedHat – systemctl – Benjr.tw

  2. 自動參照通知: Linux command – service | Benjr.tw

  3. 自動參照通知: Linux daemon – irqbalance | Benjr.tw

  4. 自動參照通知: Ubuntu NetworkManager | Benjr.tw

  5. 自動參照通知: Ubuntu + DHCP Server | Benjr.tw

  6. 自動參照通知: Ubuntu + TFTP | Benjr.tw

  7. 自動參照通知: Ubuntu + SSH | Benjr.tw

發表迴響