1. 程式人生 > >CentOS啟動詳解

CentOS啟動詳解

color 完成 for 運行級別 虛擬 不支持 centos7 無需 mage

CentOS6啟動過程

技術分享圖片
2、POST加電自檢
POST: Power-On-Self-Test,加電自檢,是BIOS功能的一個主要部分。負責完成對CPU、主板、內存、硬盤子系統、顯示子系統、 串並行接口、鍵盤、 CD-ROM光驅等硬件情況的檢測。

ROM: BIOS, Basic Input and Output System,保存著有關計算機系統最重要的基本輸入輸出程序,系統信息設置、 開機加電自檢程序和系統啟動自舉程序等。

RAM: CMOS互補金屬氧化物半導體,保存各項參數的設定

按次序查找引導設備,第一個有引導程序的設備為本次啟動設備
3、bootloader程序(Linux系統上為grub)

引導過程:根據BIOS中設定的次序查找各引導設備,第一個有引導程序的設備,即為本次啟動要用到的設備

引導程序:bootloader:引導加載器、程序

windows:叫ntloader

Linux:

LILO:linux loader 現在很多android用的就是此引導程序,對1024柱面後的分區不支持

GRUB:grand uniform bootloader

Centos6: GRUB 0.X 零點幾的版本

Centos7: GRUB 1.X 一點幾的版本

1.X與0.X有很大不同,故GRUB 0.X的版本被稱為grub legacy,而GRUB 1.X的版本被稱為Grub2

引導程序的功能:

提供一個菜單,允許用戶選擇要啟動的系統或不同的內核版本;並能夠把用戶選定的內核,裝載到內存中的特定空間中,對其進行解壓展開,而後把整個系統的控制權,移交給內核

MBR:Master Boot Record主分區不能超過4個

MBR:一共512個字節byte,前446個字節存儲bootloader,後64byte存儲了分區表(fat),最後2個字節是存儲著4個16進制數據,一般為55AA,表示該MBR是有效的,其他數字表示該MBR無效

英文字符中,1個字符就需要1個字節

GRUB:因為MBR中只有前446個字節存儲bootloader,GRUB是bootloader的一種實現方式,也就是說GRUB正常情況下,只能有446個英文字符,這樣對程序員來說,要求太高,故通常情況下,grub分成以下幾個階段:

第一階段:存儲在bootloader中

第1.5階段:文件系統驅動,稱為第1.5階段,通常存儲在MBR緊跟著的扇區中,用來驅動/boot分區

第二階段:放在硬盤的/boot分區的/boot/grub下

第三階段:加載內核

一般情況下,系統啟動時是加電自檢,然後bootloader進行加載內核,但是grub風格的bootloader是先加載grub的第二階段,就是加載磁盤中的/boot/grub,該程序就擺脫了446字節的限定,從而提供了豐富的啟動接口,然後由該程序加載內核

註意:UEFI、GPT並不適用以上理論
4、加載內核,內核進行自身初始化
自身初始化的步驟和功能

<1>進行自身初始化:

探測可識別到的所有硬件設備

<2>加載硬件驅動程序;(可能會借助於ramdisk加載驅動)

<3>以只讀方式掛載根文件系統;(之所以要以只讀方式掛載,是為了避免萬一內核有bug,造成的文件系統損壞)

<4>運行用戶空間的第一個應用程序:/sbin/init
5、ramdisk程序介紹
Linux內核的特性之一:使用緩沖和緩存來加速對磁盤上的文件訪問

ramdisk 是一種把內存當磁盤用的機制,用來啟動時加載相應的驅動等

早期centos5上用的是initrd(就是把內存當磁盤使用),後來centos6和7換成了initramfs(內存當文件系統使用),之所以換,是因為initrd是把內存當磁盤用,但是一旦涉及到磁盤,為了加速寫入和讀取的速率,就會有緩沖和緩存的出現,但是ramdisk機制本身就是在內存上實現,如果再進行緩沖和緩存,就會造成系統浪費,所以,後期就換成了initramfs

centos5上initrd的創建工具程序:mkinitrd

centos6、7上initramfs上的創建工具程序:dracut或mkinitrd

initrd映像實際上是一個RAM磁盤,其中包含帶有基本配置文件、二進制文件、庫和驅動程序的小型文件系統。在這個小型文件系統中,有一個將在引導期間裝入到內存中的根文件系統,還有一個用於裝入系統設備驅動程序的初始化腳本;它將在加載完所有設備驅動程序後重新加載實際的根文件系統磁盤。

在內核引導過程中,初始RAM磁盤(initrd)是由grub階段2引導加載程序加載到內存中的,它會被復制到RAM中並掛載到系統上。這個initrd會作為RAM中的臨時根文件系統使用,並允許內核在沒有掛載任何物理磁盤的情況下完整地實現引導。由於與外圍設備進行交互所需要的模塊可能是initrd的一部分,因此內核可以非常小,但是仍然需要支持大量可能的硬件配置。在內核引導之後,就可以正式裝備根文件系統了(通過pivot_root):此時會將initrd根文件系統卸載掉,並掛載真正的根文件系統。
6、系統第一個程序init
init程序的類型:

centos5:SysV init

其配置文件:/etc/inittab

centos6: Upstart

其配置文件:/etc/inittab和/etc/init/*.conf

centos7:Systemd

其配置文件:/usr/lib/systemd/system/、/etc/systemd/system/

init管理用戶空間的各個程序運行,除非有需要進行內核特權級別操作時,內核才會被用戶空間的各個系統調用,完成一些內核級別的操作

init初始化用戶空間的啟動流程為:/sbin/init程序主要是通過讀取/etc/inittab文件來完成一定的任務,完成的任務有:

定義默認運行級別–>運行系統初始化腳本(/etc/rc.d/rc.sysinit)完成系統初始化–>關閉指定運行級別下的各服務,啟動指定級別下需要開啟的各服務–>啟動tty虛擬終端,調用login程序,顯示登錄提示符,讓終端進行登錄
7、/etc/inittab配置文件詳解
配置文件/etc/inittab的格式及其功能:

(以centos5上的該文件為例介紹,有助於理解centos6、7上對應的文件的作用)

每行定義一種action,以及與之對應的process

每行的格式為id:runlevel:action:process

id:一個任務的唯一標識符

runlevel:在那些級別啟動此任務;可以是一個數字,也可以多個數字,也可以為空(表示所有級別),例如:3或35或空

action:在什麽條件下啟動此任務

process:具體執行的任務

常見的action:

wait 等待切換至此任務所在的級別時,執行一次(剛切換時執行)

respawn:一旦此任務終止,就自動重新啟動之

initdefault:設定默認運行級別,此時,process省略,因為一旦有了initdefault,就表示是定義默認的運行級別,而不需要運行別的process

sysinit:設定系統初始化方式,該action對應的process一般為指定/etc/rc.d/rc.sysinit腳本,該腳本定義了整個系統初始化時的腳本(centos5、6有用到該腳本,但centos7沒有用到該腳本)

例如:

id:3:initdefault: 表示定義默認運行級別就是3

si::sysinit:/etc/rc.d/rc.sysinit 表示所有級別利用/etc/rc.d/rc.sysinit腳本完成系統初始化

tty1:2345:respawn:/usr/sbin/mingetty tty1 表示在2345運行級別啟動mingetty指令,給指令傳遞參數tty1,一旦該程序停止,要自動重啟。mingetty會調用login程序,打開虛擬終端的程序,除了mingetty之外,還有諸如getty等

l3:3:wait:/etc/rc.d/rc 3 表示當切換到3級別時運行/etc/rc.d/rc腳本,往腳本裏傳遞參數為3,意味著去啟動或關閉/etc/rc.d/rc3.d/目錄下的服務腳本所控制的服務
8、Linux運行級別:為了系統的運行或維護等目的而設定的機制
0-6一共七個級別,各級別的意義:

0:關機,shutdown

1:單用戶級別(single user),root用戶,無需認證,維護模式

2:多用戶模式,帶網絡功能,但無nfs功能,維護模式

3:完全多用戶模式;文本界面

4:預留級別,目前無特別使用目的,但習慣以同3級別功能使用

5:完全多用戶模式,圖形化界面

6:重啟 reboot

默認級別:3、5

級別切換:init 數字

級別查看:who -r或runlevel
9、系統初始化腳本/etc/rc.d/rc.sysinit
系統初始化腳本文件:/etc/rc.d/rc.sysinit的功能:

<1>設置主機名

<2>設置歡迎信息

<3>激活udev和selinux(udev主要是用來創建設備文件)

<4>掛載/etc/fstab文件中定義的所有文件系統

<5>檢測根文件系統,並以讀寫方式重新掛載根文件系統

<6>設置系統時鐘

<7>根據/etc/sysctl.conf文件的設定,來設定內核參數

<8>激活lvm及軟raid設備

<9>激活swap設備

<10>加載額外設備的驅動程序

<11>清理操作
10、系統相關運行級別上的相關服務
init在利用/etc/inittab配置文件,進行用戶空間系統初始化時,會有關於默認運行級別的定義,當定義好默認運行級別,利於/etc/rc.d/rc.sysinit完成系統初始化後,就會按照運行級別,來關閉、打開相應級別下的服務

各種服務的控制腳本程序是存放在/etc/rc.d/init.d/目錄下,然後各個對應級別下要關閉或開的程序以軟連接的方式存放在/etc/rc.d/rc運行級別.d/目錄下

以K開頭的表示要關閉的服務,後面數字表示優先級,數字越小,越先關閉

以S開頭的表示要開啟的服務,後面數字表示優先級,數字越小,越先開啟

一般是先關閉相關服務後,再開啟相關服務

/etc/rc.d/rc.local 該腳本為正常行級別的最後一個腳本,可以將一些希望開機時自動啟動,但又不合適編輯成服務腳本的一些命令或程序,寫在該文件中,單獨成行,即可完成開機自動啟動

CentOS7啟動過程

1.UEFi或BIOS初始化,運行POST開機自檢
2.選擇啟動設備
3.引導裝載程序, centos7是grub2
4.加載裝載程序的配置文件:/etc/grub.d/ /etc/default/grub /boot/grub2/grub.cfg
5.加載initramfs驅動模塊
6.加載內核選項
7.內核初始化,centos7使用systemd代替init
8.執行initrd.target所有單元,包括掛載/etc/fstab
9.從initramfs根文件系統切換到磁盤根目錄
10.systemd執行默認target配置,配置文件/etc/systemd/system/default.target
11.systemd執行sysinit.target初始化系統及basic.target準備操作系統
12.systemd啟動multi-user.target下的本機與服務器服務
13.systemd執行multi-user.target下的/etc/rc.d/rc.local
14.Systemd執行multi-user.target下的getty.target及登錄服務
15.systemd執行graphical需要的服務

CentOS啟動詳解