CentOS5和6的啓動流程

前言



熟悉CentOS系統的啓動流程對我們學習linux系統是十分有幫助的。
因爲從CentOS7開始使用的初始化程序init已經大不相同了,這裏主要介紹CentOS5和6的啓動流程。


啓動基本流程:
POST –> Boot Sequence(BIOS) –> Boot Loader (MBR) –> Kernel(ramdisk) –> rootfs –> switchroot –> /sbin/init –>(配置文件:/etc/inittab, /etc/init/*.conf) –> 根據init配置文件設置默認運行級別 –> 運行系統初始化腳本/etc/rc.d/rc.sysinit,完成系統初始化 –> 開啓或關閉用戶選定的對應運行級別下所對應的服務 –> 啓動終端,打印登錄提示符。
注:
淺藍色的是在內核空間的啓動流程
紅色的是在用戶空間的啓動流程

第一階段硬件引導啓動

power on

首先肯定得通電嘛…

POST加電自檢

主要實現的功能是檢測各個外圍硬件設備是否存在而且能夠正常運行起來,實現這一自檢功能的是固化在主板上的ROM(主要代表爲CMOS)芯片上的BIOS(Basic Input/Output System)程序;例如BIOS會檢測CPU、Memory以及I/O設備是否能夠正常運行,如果是個人計算機的話可能還會檢測一下顯示器。只要一通電,CPU就會自動去加載ROM芯片上的BIOS程序,是這樣來實現的。而檢測完成之後就進行硬件設備的初始化。

ROM和RAM基本信息:
ROM:BIOS,Basic Input and Output System,保存着有關計算機系統最重要的基本輸入輸出程序,系統信息設置、開機加電自檢程序和系統啓動自舉程序等。
RAM:CMOS互補金屬氧化物半導體,保存各項參數的設定。

Boot Sequence(BIOS)

主要實現的功能是選擇要啓動的硬件設備,選擇了之後就可以讀取這個設備上位於MBR裏頭的bootloader了。這一步的實現是這樣的:根據BIOS中對啓動順序的設定,BIOS自己會依次掃描各個引導設備,然後第一個被掃描到具有引導程序(bootloader)的設備就被作爲要啓動的引導設備。簡單點說:就是按次序查找各引導設備,第一個有引導程序的設備即爲本次啓動用到設備.

Boot Loader (MBR)

這一步實現起來的步驟比較多,前面的BIOS通過讀取並執行啓動設備的MBR中的bootloader,而bootloader要實現的功能就是提供一個菜單給用戶,讓用戶去選擇要啓動的系統或不同的內核版本,然後把用戶選擇的內核版本加載至RAM中的特定空間,接着在RAM中解壓、展開,而後把系統控制權移交給內核。

第二階段GRUB啓動引導階段

grub是bootloader中的一種,就grub來說,爲了打破在MBR中只有446Bytes用於存放bootloader這一限制,
所以這一步的實現是這樣的:grub是通過分成三個階段來實現加載內核這一功能的,這三個階段分別是:
stage1, stage1.5以及stage2。其中:

stage1

stage1:存放於MBR的前446Bytes,用於加載stage1.5階段,目的是爲了識別並驅動stage2(或者/boot)所在分區的文件系統。

stage1.5

stage1.5:位於/boot基本磁盤分區中,爲識別內核文件所在的文件系統提供文件系統識別擴展
可以理解爲,Stage1.5是橋樑,由於Stage2較大,需要Stage1.5引導位於文件系統中的Stage2

stage2

stage2:存放於磁盤分區之上,具體存放於/boot/grub目錄之下,主要用於加載內核文件(vmlinuz-VERSION-RELEASE)
以及ramdisk這個臨時根文件系統(initrd-VERSION-RELEASE.img或initramfs-VERSION-RELEASE.img)。

注:假如要啓動的是硬盤設備,首先我們的硬件平臺主板BIOS必須能夠識別硬盤,然後BIOS才能加載硬盤中的bootloader,
而bootloader自身加載後就能夠直接識別當前主機上的硬盤設備了;不過,能夠識別硬盤設備不代表能夠識別硬盤設備中的
文件系統,因爲文件系統是額外附加的一層軟件組織的文件結構,所以要對接一種文件系統,就必須要有對應的能夠識別和
理解這種文件系統的驅動,這種驅動就稱爲文件系統驅動。而stage1.5就是向grub提供文件系統驅動的,這樣stage1就能訪問
stage2及內核所在的分區(/boot)了。


第三階段內核引導階段

Kerenl在得到系統控制權之後,首先要進行自身初始化,而初始化的主要作用是:

1.首先探測可識別到的所有硬件設備:

bootloader將系統控制權移交給內核就好比如後朝推翻前朝,
統治者(內核)當權之後,首先要檢查一下有哪些是前朝所留下的,判斷是否能留爲己用,不能就殺掉。

2.再加載硬件驅動程序:

即加載真正的根文件系統所在設備的驅動程序(藉助於ramdisk加載驅動)
同時在內存中釋放kernel使用的file system。

3.然後以只讀方式掛載根文件系統:

如果有藉助於ramdisk這個臨時文件系統(虛根),則在這一步之後會執行根切換;否則不執行根切換。

4.最後運行用戶空間的第一個應用程序:/sbin/init.

到這裏內核空間的啓動流程就結束了,而接下來是用戶空間完成後續的系統啓動流程。

注意: ramdisk和內核是由bootloader一同加載到內存當中的,ramdisk是用於實現系統初始化的、基於內存的磁盤設備,
即加載至內存(的某一段空間)後把內存當磁盤使用,並在內存中作爲臨時根文件系統提供給內核使用,幫助內核掛載真正
的根文件系統。而之所以能夠幫助內核掛載根文件系統是因爲在ramdisk這個臨時文件系統的/lib/modules目錄下有真正
的根文件系統所在設備的驅動程序。

第四階段init初始化階段

這一步的流程是:/sbin/init –> 根據init配置文件設置默認運行級別 –> 運行系統初始化腳本/etc/rc.d/rc.sysinit,
完成系統初始化 –> 關閉或啓動用戶選定的默認運行級別所對應的服務 –> 啓動終端,打印登錄提示符

init初始化最初

注:
init可以理解爲上帝既內核派來的使者,init這個初始化程序會根據其配置文件執行一系列操作。雖然CentOS 5、
CentOS 6以及CentOS 7的init配置 文件各不相同,但總體的啓動流程是不變的。

  • 對於CentOS 5來說,初始化程序init是SysV init,其配置文件爲:/etc/inittab;

  • 對於CentOS 6來說,初始化程序init是upstart,其配置文件爲:/etc/inittab,/etc/init/*.conf,
    也就是upstart將配置文件拆分成多個,在/etc/init/目錄下以conf結尾的都是upstart風格的配置文件,
    而/etc/inittab僅用於設置默認運行級別;

  • 對於CentOS 7來說,初始化程序init是systemd,其配置文件爲:/usr/lib/system/systemd/*,/etc/systemd/system/*;

雖然說初始化各有不同,但大概過程都是差不多的。

1.初始運行級別(RUN LEVEL)
2.系統初始化腳本
3.對應運行級別的腳本目錄
4.捕獲某個關鍵字順序
5.定義UPS電源終端/恢復腳本
6.在虛擬控制檯生成getty
7.在運行級別5初始化X

運行系統初始化腳本

運行系統初始化腳本主要作用有:

(1) 設置主機名
(2) 設置歡迎信息
(3) 激活udev和selinux
(4) 掛載/etc/fstab文件中定義的文件系統
(5) 檢測根文件系統,並以讀寫方式重新掛載根文件系統
(6) 設置系統時鐘
(7) 激活swap設備
(8) 根據/etc/sysctl.conf文件設置內核參數
(9) 激活lvm及software raid設備
(10) 加載額外設備的驅動程序
(11) 清理操作

初始化最後

關閉或情動用戶選定的默認運行級別所對應的服務。

K*:要停止的服務,K##*,優先級,數字越小,越優先關閉,依賴的服務先關閉,然後再關閉被依賴的。

S*:要啓動的服務,S##*,優先級,數字越小,越是優先啓動,被依賴的服務先啓動,而依賴的服務後啓動。

/etc/rc.d/init.d目錄還有個鏈接目錄爲/etc/init.d目錄,這兩目錄下文件相同.

腳本文件/etc/rc.d/rc作用爲當級別切換時啓動或停止服務;此腳本接受傳遞的參數給腳本中$runlevel變量,
然後,讀取/etc /rc$runlevel.d/K*和/etc/rc$runlevel.d/S*所有文件,這些文件就是爲什麼開機啓動後,
有些服務會自動啓動,有些服 務沒有啓動的原因。

大概情況用邏輯腳本顯示:

for srv in /etc/rc.d/rclever.d/K*; do
$srv stop
done
for srv in /etc/rc.d/rclever.d/S*; do
$srv start
done

最後

如果上面那些階段沒出問題,那麼到了這裏就啓動成功。




ღ ღ ღ 如果覺得文章對您有用,不妨贊一下ღ ღ ღ

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章