繼上一篇文章http://www.cnblogs.com/EasonJim/p/7163069.html深入研究了Linux的運行級別之后,發現網上大部分都說Ubuntu的運行級別默認為2,那么下面就深入分析以下為什么是2而不是其它。
分析過程:
首先從http://forum.ubuntu.org.cn/viewtopic.php?f=97&t=221304這篇文章了解到Debian系的運行級別2~5都是一樣的。並通過
cd /etc/init less rc-sysinit.conf
發現里面有句:env DEFAULT_RUNLEVEL=2,所以在這個發現上,可以說明Ubuntu的默認運行級別為2。
而且從以下網站內容中也很多人普遍說明這個問題:
https://debian-administration.org/article/212/An_introduction_to_run-levels
http://www.debianadmin.com/debian-and-ubuntu-linux-run-levels.html
https://stackoverflow.com/questions/16227792/runlevel-2-and-5-works-the-same-on-ubuntu
https://unix.stackexchange.com/questions/39411/why-does-debian-and-ubuntu-default-to-runlevel-2
https://wiki.debian.org/RunLevel
http://www.pathbreak.com/blog/ubuntu-startup-init-scripts-runlevels-upstart-jobs-explained
https://askubuntu.com/questions/686700/no-difference-between-runlevel-3-and-5-in-ubuntu-15-04
所以總結上面所說的,應該是這樣:根據Debian策略手冊,默認情況下,運行級別2到5之間沒有區別。如下所示:
0 : System halt. 1 : Single-User mode. 2 : Graphical multi-user plus networking (DEFAULT) 3 : Same as "2", but not used. 4 : Same as "2", but not used. 5 : Same as "2", but not used. 6 : System reboot.
也就是說,在Debian系的系統上,2為默認級別,其余的3~5都沒有使用。且官方介紹也是從2開始說起。
但是奇怪的發現,如果在Ubuntu 16.04的系統上運行runlevel命令,得到的是N 5,這於下面所示的級別上對應的就是GUI:
運行級別 | 名稱 | 描述 |
0 | 停 | 關閉系統 |
1 | 單用戶模式 | 管理任務模式。 |
2 | 多用戶模式 | 不配置網絡接口,不導出網絡服務 |
3 | 多用戶模式與網絡 | 正常啟動系統 |
4 | 未使用/用戶可定義 | 為了特殊目的 |
5 | 使用GUI顯示管理器正常啟動系統 | 運行級別3 +顯示管理器 |
6 | 重啟 | 重新啟動系統 |
s或S | 單用戶模式 | 不配置網絡接口或啟動后台進程。 |
或者會不會這樣,在Server版本里面才會顯示2,其實不是,經過測試,在Server 16.04版本上同樣是N 5。
那么這樣就奇怪了,會不會是隨着版本的升級,這個啟動級別同樣也升級了。
從http://forum.ubuntu.org.cn/viewtopic.php?t=474412,發現Ubuntu系統級別的變更歷史:
1、Ubuntu 6.10及以前版本使用Sysvinit。
2、Ubuntu 14.10及以前版本使用Upstart但是還留着Sysvinit並存。
https://wiki.ubuntu.com/Upstart
https://help.ubuntu.com/community/UpstartHowto
3、Ubuntu 15.04開始預設使用Systemd,但是可以在開機選項選擇使用Systemd或Upstart,但是不可同時使用Sysvinit或Upstart並存。
而Systemd不再使用runlevel進行代表,而是使用target進行展示,對照的表格如下:
Mapping between runlevels and systemd targets ┌─────────┬───────────────────┐ │Runlevel │ Target │ ├─────────┼───────────────────┤ │0 │ poweroff.target │ ├─────────┼───────────────────┤ │1 │ rescue.target │ ├─────────┼───────────────────┤ │2, 3, 4 │ multi-user.target │ ├─────────┼───────────────────┤ │5 │ graphical.target │ ├─────────┼───────────────────┤ │6 │ reboot.target │ └─────────┴───────────────────┘
這個表格出自:https://askubuntu.com/questions/788323/change-runlevel-on-16-04
那么我在測試時發現,在桌面版還是服務器版的Ubuntu 16.04獲取默認的target時。都是顯示graphical.target,也就是與N 5這個級別對應的。(命令:systemctl get-default
)
但似乎這個也沒有多少結論說明默認級別為2的問題。
總結:
所以,我猜測,由於歷史原因,在15.04之前,系統級別應該還是以2為默認,但是經過15.04,使用了Systemd的問題,默認級別上改為了5為默認,而經過上面的歷史發展,無論在2~5之間,都是沒有區別的。
或者是由於Systemd這個的使用,使以前的一些文章上如何修改系統運行級別的,在16.04不生效的問題。那么要修改運行級別,可以參考這篇文章進行修改:https://askubuntu.com/questions/788323/change-runlevel-on-16-04
其它發現:
如果16.04的系統以5為默認級別,那么我建立一個服務之后,放在2級別上面就不會運行嗎?不是這樣的,系統的運行級別是說從小到大的依次運行,要運行到5,那么會經過2;所以,我們在設置服務時,也就是直接在2上設置自動啟動就行了,但是發現一些服務會在2~5都設置自動運行,所以我猜測,這樣的做法應該是為了保險,無論在哪個運行級別都能啟動這個服務。參考:https://askubuntu.com/questions/323374/run-levels-only-at-start-up;
還有一些做法是在2~4設置啟動,然后到5就以K開頭去殺死,我覺得這種做法可以實現效果,但是如果按照上面的總結,依次運行的運行級別,會不會有點浪費資源,要先啟動再殺死,倒不如從一開始的2級別到5級別都不啟動好一些。
參考:
https://unix.stackexchange.com/questions/170555/why-is-my-debian-jessie-always-in-runlevel-5
https://askubuntu.com/questions/788323/change-runlevel-on-16-04
https://askubuntu.com/questions/323374/run-levels-only-at-start-up
https://askubuntu.com/questions/686700/no-difference-between-runlevel-3-and-5-in-ubuntu-15-04
http://www.pathbreak.com/blog/ubuntu-startup-init-scripts-runlevels-upstart-jobs-explained
https://wiki.debian.org/RunLevel
https://unix.stackexchange.com/questions/39411/why-does-debian-and-ubuntu-default-to-runlevel-2
https://stackoverflow.com/questions/16227792/runlevel-2-and-5-works-the-same-on-ubuntu
http://www.debianadmin.com/debian-and-ubuntu-linux-run-levels.html
https://debian-administration.org/article/212/An_introduction_to_run-levels