Centos的開機啟動流程
具體步驟解釋: |
第一步:加電自檢:POST
加電自檢是檢測硬件設備是否正常運行,以及一些外圍設備的輸入輸出是否存在。
自檢功能的實現是依靠BIOS軟件程序實現的
BIOS即基本輸入輸出系統,它是裝載在一個硬件芯片COMS上的,加電過程就是給硬件COMS通電,使其啟動BIOS程序,然后BIOS會根據CMOS上面的配置信息去讀取其他的硬件設備信息并檢測是否存在,能夠正常運行,之后進行硬件設備的初始化。
第二步:加載MBR
按次序查找各引導設備(引導設備為自定義),第一個有引導程序的設備即為本次啟動要用到的設備。這里以mbr為例
在硬件設備初始化之后,BIOS會列出一些可啟動的裝置順序,接下來就去讀取第一個可以啟動的設備中操作系統的核心文件,由于不同的系統的文件系統格式不同,為了避免不兼容的問題,就需要一個管理程序來處理這些核心文件的加載問題,即Boot Loader(引導加載程序) ,Boot Loader是一個程序,它存放于硬盤中的第一個扇區內,就是MBR(主引導記錄)中。
MBR:主引導記錄
總字節數:512bytes
前446bytes:存儲BootLoader,引導加載器
中間64bytes:分區表,每16bytes標識一個分區
最后2bytes:前面信息的有效性標識,55AA表示前面510bytes有效
加載MBR主引導記錄
第三步:GRUB菜單
GRUB:統一引導加載器
Centos5、6:GRUB0.X Grub legacy
Centos7:GRUB1.X Grub2
查看grub版本信息:grub –version
由于MBR的446字節太小,不足以提供Grub的功能實現,所以Grub就把其功能分為三段
Bood Loader:第1階段 功能:運行主程序,這個程序必須要被安裝在啟動區,即MBR中,因為MBR的空間有限,因此在MBR中僅安裝Boot Loader的最小程序,并沒有安裝Boot Loader的相關配置文件
Partition:filesystem driver 第1.5階段 功能:在MBR隨后的扇區中存放,主要用于與第二階段所在分區的文件系統進行交互
Partition:/boot/grub 第2階段 功能:通過Boot Loader加載所有配置文件及相關的環境參數信息,這些配置文件及相關的環境參數都存放與磁盤分區上的/boot目錄中。該階段提供了Grub啟動菜單和交互式的grub的shell
Boot Loader原本是用來加載內核的,這里讓Bood Loader去加載Grub的第二個階段,第二階段完成后,由它完成加載內核。
Boot Loader的第一個功能是去識別、加載操作系統中的核心文件,并提交到內存中,從而啟動操作系統。不同的操作系統的文件格式不同,因此每一個操作系統都有自己的Boot loader程序
Boot Loader的第二個功能是提供一個菜單,允許用戶選擇要啟動的系統或不同的內核版本,把用戶選定的內核裝載到MBR中的特定空間,解壓、展開,而后把系統的控制權移交給內核;
第四步:加載系統內核 Kernel
在Bood Loader開始讀取炒作系統內核文件后,接下來就會將內核文件解壓后裝在到內存當中,然后根據內核提供的功能開始測試與加載各個設備,這里的設備檢查與之前的BIOS自檢不同,此時內核程已經完全接管了BIOS的工作,之后的操作都是由內核來完成的。內核文件通常放置在/boot/目錄中,并且是一個以vmlinuz開頭的文件。
此時內核程序還沒有加載到磁盤,又如何去讀取文件系統上的內核文件呢? 為了解決這個問題,我們采用了一種叫做虛擬文件系統來解決這個問題,虛擬文件系統(Initial RAM DISK),同樣它也放置在/boot/目錄下面
Centos5的虛擬文件系統是基于ramdisk
文件為:/boot/initrd-VERSION-release.img
制作此文件工具:mkinitrd
Centos6、7的虛擬文件系統是基于ramfs
文件為:/boot/initramfs-VERSION-erlease.img
制作此文件工具:dracut、mkinitrd
Linux內核的特征之一:使用緩沖和緩存來加速對磁盤上的文件訪問
ramdisk:把內存當作磁盤
ramdiskàramfs
這兩種文件的特點是:能夠通過Bood Loader程序將其加載到內存中,然后此種文件會被解壓縮并且在內存中模擬一個根文件系統,這個根文件系統能夠提供一個可以運行的程序,通過該程序可以加載在啟動過程中所需要的核心模塊(如:RAID、LVM、SCSI等文件系統與磁盤的驅動程序),加載完成后,會協助內核重新呼叫/sbin/init來執行后續的正常啟動
內核的功能:
① 探測可識別到的所有硬件設備(CPU、硬盤、網卡等)
② 加載硬件驅動程序(有可能會借助于ramdisk加載驅動)
③ 以只讀方式掛載根文件系統
④ 運行用戶空間的第一個應用程序:/sibn/init
第四步:啟動第一個進程 /sbin/init
在內核、硬件及驅動信息加載完畢后,內核會呼叫用戶控件的第一個執行程序/sbin/init,init程序的主要功能是準備軟件運行環境,包括系統的主機名稱、網絡配置、文件系統格式等其他服務的啟動管理。而這些都是通過init的配置文件來定義的。
Init的配置文件:
Centos5:采用SysV init方式
特點:啟動用戶空間的服務程序,通常通過腳本進行,有依賴關系的服務將串行啟動,所以,就導致了centos5的系統啟動非常緩慢。
配置文件為:/etc/inittab
Centos6:采用Upstart方式
特點:守護進程間的通信依賴于D-Bus進行,因此,可以基本實現類似并行的方式啟動
配置文件:/etc/inittab ,/etc/init/*.conf
Centos7:采用Systemd方式
特點:服務只有在第一次被訪問時才會真正啟動起來,centos7系統的啟動過程非??臁?/span>
配置文件:/usr/lib/system/* ,/etc/system/system/*
在init的配置文件中有一個非常重要的配置項,就是默認的系統啟動級別,分為一下幾種:
1、0:關閉所有服務; 關機
2、1:維護模式,單用戶模式,root用戶直接登陸,多用于系統維護
3、2:維護模式,多用戶模式,需要用戶認證,會啟動網絡服務,但不支持FNS
4、3:正常級別,完全的多用戶模式,文本界面
5、4:預留級別,默認與3級別相同
6、5:正常級別,完整的圖形界面多用戶模式
7、6:關閉所有服務;重啟
3和6級別用的比較多
切換模式的方式為:init[0-6]
查看當前運行級別:runlevel 或 who –r
Centos5的配置文為/etc/inittab
打開配置文件:
id:runlevel:action:process //默認runlevel配置
解釋:id:一個任務的標識符
runlevels:在哪些級別啟動此任務,#,###(#代表上述的級別) 也可以為空,表示所有級別
action:在什么條件下啟動此任務
wait:等待切換至此任務所在的級別時執行一次
respawn:此任務終止時,就自動重新啟動
initdefault:設定默認運行級別;此時process省略
sysinit:設定系統初始化方式,此處一般指定/etc/rc.d/rc.sysinit腳本
si:sysinit:/etc/rc.d/rc.sysinit //系統軟件運行環境的腳本
/etc/rc.d/rc.sysinit為初始化用戶空間環境,會執行許多系統初始化任務,在完成初始化腳本后,系統還會啟動對應級別下折定為要啟動的服務,關閉那些設定為要停止的服務。
7個不同的runlevel 需要啟動的服務的scripts放置位置:
l0:0wait/etc/rc.d/rc 0 <=runlevel 0在/etc/rc.d/rc0.d
l1:1wait/etc/rc.d/rc 1 <=runlevel 1在/etc/rc.d/rc1.d
l2:2wait/etc/rc.d/rc 2 <=runlevel 2在/etc/rc.d/rc2.d
l3:3wait/etc/rc.d/rc 3 <=runlevel 3在/etc/rc.d/rc3.d
l4:4wait/etc/rc.d/rc 4 <=runlevel 4在/etc/rc.d/rc4.d
l5:5wait/etc/rc.d/rc 5 <=runlevel 5在/etc/rc.d/rc5.d
l6:6wait/etc/rc.d/rc 6 <=runlevel 6在/etc/rc.d/rc6.d
在/etc/rc.d/rc#.d/下的所有鏈接文件來決定如何啟動關閉服務,所有以S開頭的鏈接文件,都會被傳遞start參數以啟動;所有以K開頭的鏈接文件;都會被傳遞stop參數以停止
Init的處理流程
Init是通過自上而下的讀取inittab文件來一次執行的,因此init的處理流程是:
1、 讀取默認的runlevel,這里使用的是默認級別3
2、 使用/etc/rc.d/rc.sysinit進行系統的初始化
3、 由于采用的是3級別,因此只能進行l3:3:wait:/etc/rc.d/rc3 其他的忽略
4、 配合好[ctrl]+[alt]+[del]組合鍵的功能
5、 配置不斷電系統pf、pr兩種機制
6、 啟動mingetty6個終端
7、 如果是5級別,則會以/etc/X11/prefdm-nodaemon啟動圖形化界面
如果不想啟用6個終端,可以將多余的注釋掉 加#即可
在init執行的第二步執行系統初始化過程,init是根據/etc/rc.d/rc.sysinit中定義的內容進行系統初始化,做一下事情:
1、 根據配置文件中的設定來設定主機名(讀取/etc/sysconfig/network文件中的HOSTNAM進行)
2、 打印文本歡迎信息
3、 激活SELinux和udev
4、 掛載所有定義在/etc/fstab文件中的文件系統
5、 激活swap設備
6、 檢測根文件系統,并以讀寫的方式掛載
7、 設置系統時鐘
8、 根據/etc/sysctl.conf文件設定內核參數值
9、 激活LVM和RAID設備
10、 加載額外的設備驅動程序
11、 清理操作
服務的啟動:
服務的啟動停止是通過inittab里面提到的l3:3wait:/etc/rc.d/rc 3配置,實際上是通過/etc/rc.d/rc3.d/下的所有鏈接文件來決定如何啟動或關閉服務的。
/etc/rc.d/rc3.d下的所有鏈接文件其實都是在/etc/init.d/下面的所有腳本,這些腳本遵循LSB服務腳本的定義規范,接受至少四個基本參數:{start|stop|restart|status}
start:啟動服務
stop:停止服務
restart:重啟服務
status:查看服務狀態
腳本在指定級別啟停的控制方法:
腳本開頭添加這些項:
#chkconfig: 哪些級別 啟動數 停止數 例如: #chkconfig: 234 25 85
#description: 腳本描述 (centos5中必須填寫,centos6可寫可不寫)
可通過chkconfig命令來管理服務腳本
chkconfitg –level 級別 腳本 on|off
–level:指明級別為on或off,其余的保持原狀,默認級別為2345
chkconfig –list 腳本
查看服務在對應級別的狀態
chkconfig –add | –del 腳本
–add :添加服務 為某存放在/etc/init.d的服務在對應的/etc/rc.d/rc0-6.d目錄添加符號鏈接
–del :刪除服務 把指定腳本在7個符號鏈接中都刪除
注意:有一個S99local的符號鏈接,指向的是/etc/rc.local腳本,其功能為:那些不便定義為服務腳本,設定開機自動運行的腳本, 可直接把命令寫入次腳本中,以實現開機即運行。
Linux系統啟動后,一般會開啟6個tty終端,每個中端啟動后,會立即通過此終端附加一個應用程序——-lofin,如果運行級別為5還會啟動一個圖形虛擬終端。
Centos6的配置文件及其功能:
/etc/inittab
設置系統默認的運行級別
id:3:initdefault:
/etc/init/control-alt-delete.conf //設置ctrl+alt+del三鍵操作
/etc/init/tty.conf //控制tty終端的開啟
/etc/init/start-ttys.conf //配置tty終端的開啟數量,設備文件
/etc/init/rc.conf //兼容腳本,負責個運行級別的調用處理/
/etc/init/rcS.conf //加載rc.sysinit腳本,完成系統初始化任務
/etc/rcS-sulogin.cong //為單用戶模式啟動/sbin/sushell環境
centos6的啟動過程:
1. 加載BIOS 的硬件信息,獲取第一個啟動設備。
2. 讀取第一個啟動設備MBR 的引導加載程序(grub) 的啟動信息
3. 加載核心操作系統的核心信息,核心開始解壓縮,并嘗試驅動所有的硬件設備。
4. 核型執行init 程序并獲取運行信息。
5.Init 執行/etc/rc.d/rc.sysinit 文件。
6. 啟動核心的外掛模塊(/etc/modprobe.conf)。 。
7.Init 執行運行的各個批處理文件(scripts).
8.Init 執行/etc/rc.d/rc.local.
9. 執行/bin/login 程序,等待用戶登錄。
10. 登錄之后開始以Shell 控制主機。
原創文章,作者:ZJM,如若轉載,請注明出處:http://www.www58058.com/45716