標籤:sysvint upstart systemd rc.sysinit rc.local linux系統啟動
linux系統啟動首先從BIOS開始檢測硬體資訊=》開始啟動引導程式。讀取MBR(磁碟上第0磁軌第一個扇區)也就是Master Boot Record 即主引導記錄。MBR記錄了開機前資訊和分區表資訊。然後將grub(作用:設定核心映象在磁碟分割的位置)資訊複製到記憶體中。為啟動核心做準備。===》載入核心。核心初始化產生一個PID為1的init進程。
由於核心運行起來是毫無用途的,需要一個系統能夠定義,管理和控制init進程的行為,並負責組織和運行完成初始化的工作,從而讓系統進入一個使用者設定的運行模式中,這個系統就是init系統。
init(為英語:initialization的簡寫)是 unix和 類Unix 系統中用來產生其它所有進程的程式。它以守護進程的方式存在,其進程號為1。Linux系統在開機時載入Linux核心後,便由Linux核心載入init程式,由init程式完成餘下的開機過程。
init 的運行方式曆經: sysvinit , upstart , systemd
早期的linux系統的init運行方式相容UNIX system V(Unix系統的一個版本)下init運行方式。
System V 下init的運行方式:
System V init 檢查 ‘/etc/inittab‘ 檔案中是否含有 ‘initdefault‘ 項。 這告訴 init 系統是否有一個預設的運行。System V init 描述了 8中狀態 。0-6 和S 或s .linux 設定了6各層級:#cat /etc/inittab
# Default runlevel. The runlevels used are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
unix system v 預設是 3層級啟動。 linux伺服器大多版本預設是3層級。而案頭版本一般為5.(圖形化介面)。如何查看 : $ runlevel 或 $ who -r.
Sysvinit 的優點是概念簡單。Service 開發人員只需要編寫啟動和停止指令碼,概念非常清楚;將 service 添加/刪除到某個 runlevel 時,只需要執行一些建立/刪除軟串連檔案的基本操作;這些都不需要學習額外的知識或特殊的定義文法(UpStart 和 Systemd 都需要使用者學習新的定義系統初始化行為的語言)。
其次,sysvinit 的另一個重要優點是確定的執行順序:指令碼嚴格按照啟動數位大小順序執行,一個執行完畢再執行下一個,這非常有益於錯誤排查。UpStart 和 systemd 支援並發啟動,導致沒有人可以確定地瞭解具體的啟動順序,排錯不易。
2006年的時候Ubuntu 打算把系統用在筆記本上。最大的困境是:sysvinit 對行動裝置(USB 裝置的裝置)的熱插拔支援不夠。於是開發了upstart 基於事件機制.比如 USB 磁碟機插入 USB 介面後,udev 得到核心通知,發現該裝置,這就是一個新的事件。UpStart 在感知到該事件之後觸發相應的等待任務,比如處理/etc/fstab 中存在的掛載點。採用這種事件驅動的模式,upstart 完美地解決了隨插即用裝置帶來的新問題。UpStart採用了非同步方式 可以:更快地啟動系統;當新硬體被發現時動態啟動服務;硬體被拔除時動態停止服務。這些特點使得 UpStart 可以很好地應用在案頭或者攜帶型系統中,處理這些系統中的動態硬體插拔特性。但是UPstart沒有完全擺脫 runlevel機制。只是在相容的基礎上相應的最佳化了runlevel機制。
為了減少系統啟動時間,systemd 的目標是:儘可能啟動更少的進程,儘可能將更多進程並行啟動,減少了啟動進程間的依賴。沒有必要的進程可以在需要使用的時候才啟動。此外systemd開創了新的管理體系。以前運行層級(runlevel)的概念被新的運行目標(target)所取代。target的命名體系類似於“multi-user.target"和原來的運行層級3(runlevel 3)相對應。在centos7中由於使用了新systemd管理機制。不再使用runlevel的概念,所以/etc/inittab不在被系統使用。
centos7下systemd 管理體系理預設的target通過軟連結來實現的。
(由於版面的問題 把 inode值 屬主屬組和日期 刪除)
[[email protected] ~]# ll /etc/systemd/system/default.target
lrwxrwxrwx. /etc/systemd/system/default.target -> /lib/systemd/system/multi-user.target
如果想修改運行目標。只需要把這個軟連結刪除。軟連結到新的運行目標。
# rm -rf /etc/systemd/system/default.target
# ln -s /lib/systemd/system/multi-user.target /etc/systemd/system/default.target
我們來查看下centos7下 /etc/inittab檔案
$ cat /etc/inittab
# inittab is no longer used when using systemd.
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
# systemd uses ‘targets‘ instead of runlevels. By default, there are two main target
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
# To view current default target, run:
# systemctl get-default
# To set a default target, run:
# systemctl set-default TARGET.target
很明確定義了新的target的位置:/usr/lib/systemd/system/ctrl-alt-del.target
同樣查看下: (由於版面的問題 把 inode值 屬主屬組和日期 刪除)
# ll /usr/lib/systemd/system/runlevel*
lrwxrwxrwx /usr/lib/systemd/system/runlevel0.target -> poweroff.target
lrwxrwxrwx /usr/lib/systemd/system/runlevel1.target -> rescue.target
lrwxrwxrwx /usr/lib/systemd/system/runlevel2.target -> multi-user.target
lrwxrwxrwx /usr/lib/systemd/system/runlevel3.target -> multi-user.target
lrwxrwxrwx /usr/lib/systemd/system/runlevel4.target -> multi-user.target
lrwxrwxrwx /usr/lib/systemd/system/runlevel5.target -> graphical.target
lrwxrwxrwx /usr/lib/systemd/system/runlevel6.target -> reboot.target
此外,systemd 管理體系還引入了 命令列工具systemctl。 systemctl 可以看作是service和chkconfig
得組合體。不過不用擔心。就的service命令在centos7下依舊可以使用,不過,它會重新導向所有命令到新的systemctl 工具。
幾個例子:
(sysvint)
#service network start |stop |status
#chkconfig httpd on
( systemclt)
# systemctl start|stop|status network.service
#systemctl enable httpd.service
目前: Ubuntu 15.04及後續版本在預設的init上都安裝了 systemd.
介紹完主流init系統後,開始繼續啟動系統。
BIOS - mbr -grub -核心 - /etc/inittab- /etc/rc.d/rc.sysinit -啟動核心模組/etc/modules.conf-啟動指定層級下的指令碼rcx.d-執行/etc/rc.d/rc.local -/bin/login
雖然前面說了新的init系統的諸多好處:不過現在畢竟centos7的企業使用者群體總體上不多。我們還是需要熟練掌握centos7一下的版本的啟動。方便以後的管理。而且centos7 在命令層面上完全向下相容。
梳理了,開機啟動流程。可以來些小的應用。
比如:在/etc/rc.d/rc.local 裡面掛載行動裝置,添加個人化服務啟動。如果,改階段那個服務啟動不了,導致。啟動阻塞。是否可以先進入單一使用者模式,在/etc/rc.d/rc.local 檔案下注釋掉服務。待開機後在測試,修複呢?
最主要的是。熟悉了開機啟動後。可以根據開機的錯誤資訊。排查是那個階段出現的錯誤。比如系統一起重啟。查看 /etc/inittab 是否設定了runlevel6模式。開機指令碼錯誤是不是應該單使用者進入系統排查。/etc/rc.d/rcx.d下面的指令碼,必要是可以把S開頭的指令碼先改名為K 。待系統啟動後在恢複。
本文出自 “趙雁生的linux之旅” 部落格,請務必保留此出處http://12042068.blog.51cto.com/12032068/1893062
淺談centos啟動那點事兒