不管你是用 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 請參考
- http://upstart.ubuntu.com/cookbook
- 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 請參考 https://benjr.tw/94015
7 thoughts on “System V 與 Upstart”