linux系統GRUB啟動流程
內核的設計風格:
內核的設計風格:
- 單內核:把所有的功能都做到內核,例子:Linux (LWP)
linux雖然是單內核的,但它逐漸往微內核里面靠,采用了模塊化的設計,核心ko和共享模塊so,核心能夠動態加載各種的外圍的內核模塊,例如內核探測到一個磁盤,這個磁盤當前沒有驅動,內核探測到磁盤的特性,加載相對應得模塊,加載進來。而啟動加載進來的是只是核心本身。內核模塊放在/lib/modules/”內核版本號命名的目錄”/,內核命名:vmlinuz-版本 - 微內核:內核很小,只有核心功能,其他功能做成子系統,當需要用到那個子系統由內核調度進來,例子:Windows, Solaris (線程)
虛擬文件系統:
根所在的分區叫做根文件系統rootfs,如果內核沒有磁盤的驅動,那么就訪問不了根文件系統了,所有的訪問都是要通過根目錄才可以訪問,這樣就訪問不了/lib/modules,訪問不了這個目錄,就拿不到驅動,那么就有一個先后問題,要想訪問磁盤,要先有驅動,而要想有驅動,就必須要能訪問磁盤?
解決的辦法:找一個中間人,一個文件,這個文件是動態生成的,在安裝程序在安裝完成以后,它會知道內核要訪問的根在內核中有沒有這個模塊,也會知道這個磁盤到底需要哪一個驅動,然后動態生成這個中間人的文件,這么文件是一個獨立文件系統,是一個根文件系統,這個是一個虛根,跟真正的根沒有關系,只是臨時過渡的根文件系統,可以裝載到內存中,在內存中展開,將內存當磁盤來用,這個叫做ramdisk或者ramfs當內核能夠訪問真正的根了,掛載真正根文件系統了,讓根文件系統建立起來,這個虛根就不要了,這個過程就是根切換,這個虛根的文件名initrd(ramdisk ),initramfs(ramfs)。所有這個並不一定需要的,只有當內核無法掛載根文件系統的時候才用得上
啟動流程:
POST-->BIOS(BootSequence)-->MBR(bootloader,446)-->Kernel-->initrd(initramfs)-->(ROOTFS)/sbin/init(/etc/inittab)
- 加載BIOS的硬件信息與進行自我測試,並依據設置取得第一個可啟動的設備
- 讀取並執行第一個啟動設備內的MBR的bootLoader,例如grup
- 依據bootLoader的設置加載Kernel,kernel檢測硬件與加載驅動程序
- 在硬件驅動成功后,Kernel會主動調用init進程,而init進程會取得run-level信息
- init執行/etc/rc.d/rc.sysinit文件來准備軟件執行的操作環境
- init執行run-level的各個服務的啟動
- init執行/etc/rc.d/rc.local文件
- init執行終端機模擬程序mingetty來啟動login進程,等待用戶登錄
內核從某個磁盤分區上識別的,在內核還沒有啟動之前是沒有文件系統的,所以由MBR中的BootLoader來識別內核所在的分區
bootloader
- LILO: LInux LOader
-
GRUB: GRand Unified Bootloader,這個有三個階段:
- Stage1:裝在MBR,主要是為引導第二階段,不是引導操作系統的
- Stage1_5: 識別常見不同類型的文件系統,這樣才能在第二階段找到/boot/grub/
-
Stage2: 真正啟動操作系統,位於/boot/grub/
- grup的配置文件grup.conf
default=0 # 設定默認啟動的title的編號,從0開始
timeout=5 # 等待用戶選擇的超時時長,單位是秒
splashimage=(hd0,0)/grub/splash.xpm.gz # grub的背景圖片
hiddenmenu # 隱藏菜單
password 明文密碼 #這里使用密碼的話,在剛開機的時候如果需要進入編輯,需要輸入密碼
password --md5 密文密碼 # 用grup-md5-crypt生成密文的密碼
title Red Hat Enterprise Linux Server(2.6.18-308.el5)#內核標題,或操作系統名稱,字符串,可自由修改
root (hd0,0) #內核文件所在的設備;對grub而言,所有類型硬盤一律hd,格式為(hd#,N);hd#, #表示第幾個磁盤;最后的N表示對應磁盤的分區;
kernel /vmlinuz-2.6.18-308.el5 ro root=/dev/vol0/root rhgb quiet # 內核文件路徑,及傳遞給內核的參數
initrd /initrd-2.6.18-308.el5.img # ramdisk文件路徑
password --md5 密文密碼 #如果這里有密碼,那么啟動內核的時候需要輸入密碼才可以
title Install Red Hat Enterprise Linux 5
root (hd0,0)
kernel /vmlinuz-5 ks=xxxx ksdevice=eth0 noipv6
initrd /initrd-5
password --md5 密文密碼
- grup的配置文件grup.conf
Kernel的初始化過程
- 設備探測
- 驅動初始化(可能會從initrd(initramfs)文件中裝載驅動模塊)
- 以只讀掛載根文件系統;
- 裝載第一個進程init(PID:1)
/sbin/init:
配置文件/etc/inittab:
/etc/inittab的任務:
- 1、設定默認運行級別;
- 2、運行系統初始化腳本;
- 3、運行指定運行級別對應的目錄下的腳本;
- 4、設定Ctrl+Alt+Del組合鍵的操作;
- 5、定義UPS電源在電源故障/恢復時執行的操作;
- 6、啟動虛擬終端(2345級別);
- 7、啟動圖形終端(5級別);
運行級別:
0:halt
1: single user mode, 直接以管理員身份切入,
2:multi user mode, no NFS
3: multi user mode, text mode
4:reserved
5: multi user mode, graphic mode
6: reboot
查看運行級別的相關命令:
- runlevel
- who -r
init的處理流程
- 先取得runlevel
- 使用/etc/rc.d/rc.sysinit進行系統初始化
- etc/rc.d/rc.sysinit完成的任務:
- 1、激活udev和selinux;
- 2、根據/etc/sysctl.conf文件,來設定內核參數;
- 3、設定時鍾時鍾;
- 4、裝載鍵盤映射;
- 5、啟用交換分區;
- 6、設置主機名;
- 7、根文件系統檢測,並以讀寫方式重新掛載;
- 8、激活RAID和LVM設備;
- 9、啟用磁盤配額;
- 10、根據/etc/fstab,檢查並掛載其它文件系統;
- 11、清理過期的鎖和PID文件;
- etc/rc.d/rc.sysinit完成的任務:
- 根據runlevel進行相對應的動作,程序
- 設置好【ctrl】+【alt】+【del】這組的組合鍵功能
- 設置不斷電系統的pf,pr兩種機制
- 啟動mingetty的6個終端機
- 最終以/etc/x11/perfdm -nodaemon啟動圖形界面
內容:
id:3:initdefault:設置默認運行級別
id:runlevels:action:process
* id: 標識符
* unlevels: 在哪個級別運行此行;
* action: 在什么情況下執行此行;
+ initdefault: 設定默認運行級別
+ sysinit: 系統初始化
+ wait: 等待級別切換至此級別時執行
+ respawn: 一旦程序終止,會重新啟動
* process: 要運行程序;
啟動系統服務以及相關的啟動配置文件
服務類腳本: 可以使用start|stop|restart|status|reload|configtest這些參數的腳本,主要在/etc/rc.d/init.d,文件名去那邊以Sxx或Kxx開頭
每個文件都有#chkconfig和#description這兩項
格式:
/# chkconfig: runlevels SS KK 當chkconfig命令來為此腳本在rc#.d目錄創建鏈接時,runlevels表示默認創建為S*開頭的鏈接,-表示沒有級別默認為S*開頭的鏈接;除此之外的級別默認創建為K*開頭的鏈接;
S后面的啟動優先級為SS所表示的數字;K后面關閉優先次序為KK所表示的數字;
/# description: 用於說明此腳本的簡單功能; , 續行
chkconfig命令:
chkconfig --list: 查看所有獨立守護服務的啟動設定;獨立守護進程!
chkconfig --list SERVICE_NAME:查看某一個服務
chkconfig --add SERVICE_NAME:為某一個服務創建S開頭,K開頭的鏈接
chkconfig --del SERVICE_NAME:刪除某一個服務S開頭,K開頭的鏈接
chkconfig [--level RUNLEVELS] SERVICE_NAME {on|off}:關閉或開啟某一個級別
如果省略級別指定,默認為2345級別;
守護進程的類型:
獨立守護進程:獨立的,不關聯運行級別
瞬時守護進程:不需要關聯至運行級別,所有的瞬時守護進程都由xinetd獨立守護進程管理,xinetd也叫超級守護進程
/etc/rc.d/rc.local
> 系統最后啟動的一個服務,准確說,應該執行的一個腳本
,