CentOS 6開機啟動流程理論篇
-
centos 系統的啟動流程
-
grub
-
破壞Linux的核心文件再修復體驗系統啟動流程
概述
任 何系統啟動的第一步必然是加電,然后計算機硬件會主動地讀取BIOS來加載硬件設備信息并檢測,之后系統會主動地讀取第一個有引導程序的設備,該引導程序 (grub)可以指定使用哪個內核來啟動,并將其加載至內存當中運行,同時內核還要加載其他硬件設備以及對應的驅動程序,來例主機各個組件開始運行,等所 有硬件設備加載完后,系統就真正地啟動了,稍后系統會操作一些外部程序開始準備軟件的運行環境,之后加載一些系統運行時所需要的軟件程序,最后一公里就是 等待用戶的登陸.
本文主要以CentOS 5、6的啟動說明Linux系統的啟動流程,CentOS 7來日再敘!主要以CentOS 6為例說明!
從宏觀上講,centos 6的開機可簡述為:
POST(加電自檢)–> MBR引導–> grub–> 加載內核 –> 啟動init進程 –> 用戶登錄
具體詳情見下圖:
1.加載BIOS的硬件信息,獲取第一個啟動設備 2.讀取第一個啟動設備MBR的引導加載程序(grub)的啟動信息 3.加載核心操作系統的核心信息,核心開始解壓縮,并嘗試驅動所有的硬件設備 4.核心執行init程序,并獲取默認的運行信息 5.init程序執行/etc/rc.d/rc.sysinit文件 6.啟動核心的外掛模塊 7.init執行運行的各個批處理文件(scripts) 8.init執行/etc/rc.d/rc.local 9.執行/bin/login程序,等待用戶登錄 10.登錄之后開始以Shell控制主機
關鍵詞:
bootloader: 引導程序,一個引導加載器
對于Windows而言,其bootloader為ntloader,僅啟動的是OS.
對于Linux而言,目前流行的是gurb,其功能強大,允許用戶選擇要啟動的系統(不同的內核版本),把用戶選定的內核裝載到內存中的特定空間中,解壓、展開,并把系統控制權移交給內核。
MBR: 主引導刻錄,位于硬盤的主引導扇區里面(硬盤的0柱面、0磁頭、1扇區稱為主引導扇區),其中bootloader占用了446bytes, 分區表占用了64bytes,2bytes的分區標識符55AA.
GRUB:
primary boot loader : 1st stage,1.5 stage secondary boot loader :2nd stage,分區文件
grub的程序運行本配置加載是分三個階段(stage)來運行:
stage1:運行bootloader主程序,這個程序必須要被安裝在主引導區,即MBR中,而MBR中僅安裝了bootloader的最小主程序,并沒有安裝bootloader的相關配置文件。
stage1_5: 在MBR隨后的扇區中存放,主要用于與stage2所有分區的文件系統進行交互。
stage2: 通過bootloader加載所有配置文件及相關的環境參數信息,這些配置文件及相關的環境參數都存放于磁盤分區上的/boot目錄下。
當bootloader讀取了這些文件系統所定義的數據后,就能夠識別文件系統并讀取在該文件系統上的內核文件了。
grub作為Linux系統使用最廣泛的啟動管理器,我們有必要了解一下其配置文件grub.conf的內容:
Note:
default=0 表示默認的啟動條目 timeout=5 表示等待時間,如果超過5秒,則使用默認的啟動條目defaultsplashimage=(hd0,0)/grub/splash.xpm.gz 定義啟動時的背景圖片信息 hiddenmenu 啟動時是否要顯示菜單,默認情況下是不顯示菜單信息,如果要顯示,注釋掉該行即可 title 定義各個操作系統的名稱 root (hd0,0) root: 表示內核文件存放的位置,這里指的是分區位置,而非根目錄; 硬盤以hd表示,代號以()括起來,如(hd0,0)表示磁盤上的第一個分區,磁盤編 號是grub搜尋到的順序。 kernel 內核的名稱及一些啟動時的核心參數,由于啟動過程中需要掛載根目錄,因此 就需要指定根目錄所在的分區。 initrd initrd或initramfs,即虛擬文件系統
grub也支持命令行接口:直接在shell中輸入grub
grub的保護機制:只有通過認證才能修改grub.conf信息,可以通過以下方式來對grub.conf進行保護:
1. 在第一個title之上添加password --md5 主要用于保護編輯功能; 2. 在某個title內添加password --md5 主要用于保護內核 生成密碼的命令:grub-md5-crypt openssl passwd -1 # -1表示生成md5
Kernel: 自身初始化
探測可識別到的所有硬件設備 加載硬件驅動程序(可能借助于ramdisk加載驅動) 以只讀方式掛載根文件系統 運行用戶空間的第一個應用程序:/sbin/init
init:
SysV: init, CentOS 5之前 配置文件:/etc/inittabUpstart: init,CentOS6 配置文件:/etc/inittab, /etc/init/*.conf Systemd:systemd, CentOS 7 配置文件:/usr/lib/systemd/system /etc/systemd/system
ramdisk:
內核中的特性之一:使用緩沖和緩存來加速對磁盤上的文件訪問 ramdisk--> ramfs提高速度 CentOS 5: initrd, 工具程序:mkinitrd CentOS 6: initramfs,工具程序:mkinitrd, dracut
在/etc/inittab中定義了系統的默認啟動級別及所有的級別,通常默認為3或5級別,各級別之間可通過 init [0-6] 來切換,可通過runlevel或者who -r命令來查看當前的運行級別。
7個不同的run level 需要啟動的scripts放置路徑: /etc/rc.d/
其中,/etc/rc.d/rc.sysinit是系統的初始化腳本,其實現以下作用:
(1) 設置主機名 (2) 設置歡迎信息 (3) 激活udev和selinux (4) 掛載/etc/fstab文件中定義的文件系統 (5) 檢測根文件系統,并以讀寫方式重新掛載根文件系統 (6) 設置系統時鐘 (7) 激活swap設備 (8) 根據/etc/sysctl.conf文件設置內核參數 (9) 激活lvm及software raid設備 (10) 加載額外設備的驅動程序 (11) 清理操作
另外,centos 5中,/etc/inittab中還有這一字段:
rc N意味著讀取/etc/rc.d/rcN.d/,里面的文件都是以K或S打頭的鏈接文件。
K*: K##*:##運行次序;數字越小,越先運行;數字越小的服務,通常為依賴到別的服務 S*: S##*:##運行次序;數字越小,越先運行;數字越小的服務,通常為被依賴到的服務
注意:正常級別下,最后啟動一個服務S99local沒有鏈接至/etc/rc.d/init.d一個服務腳本,而是指向了/etc/rc.d/rc.local腳本;
另外,不便或不需寫為服務腳本放置于/etc/rc.d/init.d/目錄,且又想開機時自動運行的命令,可直接放置于/etc/rc.d/rc.local文件中;
/etc/rc.d/rc.local在指定運行級別腳本后運行,可以根據情況,進行自定義修改
小結:CentOS 6的啟動流程:
POST –> Boot Sequence(BIOS) –> Boot Loader –> Kernel(ramdisk) –> rootfs–> switchroot–> /sbin/init–>(/etc/inittab, /etc/init/*.conf) –> 設定默認運行級別–> 系統初始化腳本rc.sysinit–> 關閉或啟動對應級別的服務–> 啟動終端
小結:grub
-
stage1: mbr
-
stage1_5: mbr之后的扇區,讓stage1中的bootloader能識別stage2所在的分區上的文件系統
-
stage2:磁盤分區(/boot/grub/), stage2及內核等通常放置于一個基本磁盤分區
在grub引導內核啟動的過程中是可以設置內核參數的,譬如是否開啟selinux, 系統的最大loop文件,系統要啟動的第一個進程等,這些設置的內核參數可用如下命令查看:
[root@centos6 ~]#cat /proc/cmdline ro root=UUID=02ca7016-e9e5-47c2-b015-cd99629f2df0 rd_NO_LUKS rd_NO_LVM .UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet [root@centos6 ~]#
當然,還有專門的內核參考文檔:usr/share/doc/kernel-doc-2.6.32/Documentation/k ernel-parameters.txt
要想查看此文檔,需要安裝相應的kernel-doc包,直接掛載光盤可安裝。
[root@centos6 /usr/share/doc/kernel-doc-2.6.32/Documentation]#ls kernel-docs.txt kernel-docs.txt [root@centos6 /usr/share/doc/kernel-doc-2.6.32/Documentation]#
關于臨時根文件系統
臨 時根文件系統允許內核在沒有掛載任何物理磁盤的情況下完整地實現引導,這個臨時根文件系統就是initrd. 在內核引導過程中,初始 RAM 磁盤(initrd/initramfs)是由stage2加載到內存中的,它會被復制到RAM中,并掛載到系統上。當內核被引導之后,可以正式裝備根文 件系統了,此時會將 initrd 根文件系統卸載掉,并掛載真正的根文件系統,這就是所謂的switch root,即根切換.
了 解了系統啟動的基本流程,以下我們通過“破壞式實驗”,即破壞系統啟動過程中的一些關鍵環節,使系統無法啟動,然后我們再通過修復這些文件使得系統正常重 啟,進而體驗Linux系統的啟動流程,這些關鍵環節包括破壞grub三個stage(stage1、stage1-5、stage2) 中的任何一個階段,甚至是整個grub; 還有掛載文件/etc/fstab,內核文件vmlinuz, 系統引導時需要加載的驅動程序文件initramfs以及MBR中的相關信息等。
本文半前部分(理論篇)我們主要講述了centos 6的啟動流程,解析了相關的關鍵詞,后半 部分(實驗篇)將通過大量破壞式實驗體驗了相關的關鍵文件在Linux系統中起的作用。
原創文章,作者:Liansir,如若轉載,請注明出處:http://www.www58058.com/47749