啟動(dòng)引導(dǎo)程序(Boot Loader,也就是 GRUB)會(huì)在啟動(dòng)過程中加載內(nèi)核,之后內(nèi)核才能取代 BIOS 接管啟動(dòng)過程。如果沒有啟動(dòng)引導(dǎo)程序,那么內(nèi)核是不能被加載的。在 CentOS 6.x 中,啟動(dòng)引導(dǎo)程序默認(rèn)是 GRUB,GRUB 是現(xiàn)在最為流行的啟動(dòng)引導(dǎo)程序,我們也用 GRUB 來說明啟動(dòng)引導(dǎo)程序的作用, initramfs 這個(gè)虛擬文件系統(tǒng)也是要靠啟動(dòng)引導(dǎo)程序調(diào)用的。
成都創(chuàng)新互聯(lián)公司是一家朝氣蓬勃的網(wǎng)站建設(shè)公司。公司專注于為企業(yè)提供信息化建設(shè)解決方案。從事網(wǎng)站開發(fā),網(wǎng)站制作,網(wǎng)站設(shè)計(jì),網(wǎng)站模板,微信公眾號(hào)開發(fā),軟件開發(fā),小程序設(shè)計(jì),十年建站對(duì)自上料攪拌車等多個(gè)行業(yè),擁有多年的網(wǎng)站制作經(jīng)驗(yàn)。早期的 LILO 引導(dǎo)程序已經(jīng)不是很常見了,GRUB 相比來講有很多優(yōu)勢(shì),主要有:
GRUB加載內(nèi)核的過程:GRUB 的作用有以下幾個(gè):
按照啟動(dòng)流程,BIOS 在自檢完成后,會(huì)到第一個(gè)啟動(dòng)設(shè)備的 MBR 中讀取 GRUB。在 MBR 中用來放置啟動(dòng)引導(dǎo)程序的空間只有 446 Byte,那么 GRUB 可以放到這里嗎?答案是空間不夠,GRUB 的功能非常強(qiáng)大,MBR空間是不夠使用的。那么 Linux 的解決辦法是把 GRUB 的程序分成了三個(gè)階段來執(zhí)行。
stage1:執(zhí)行GRUB主程序
第一階段是用來執(zhí)行 GRUB 主程序的,這個(gè)主程序必須放在啟動(dòng)區(qū)中(也就是 MBR 或者引導(dǎo)扇區(qū)中)。但是 MBR 太小了,所以只能安裝 GRUB 的最小的主程序,而不能安裝 GRUB 的相關(guān)配置文件。這個(gè)主程序主要是用來啟動(dòng) Stage 1.5 和 Stage 2 的。
stage1.5:識(shí)別不同的文件系統(tǒng)
Stage 2 比較大,只能放在文件系統(tǒng)中(分區(qū)),但是 Stage 1 不能識(shí)別不同的文件系統(tǒng),所以不能直接加載 Stage 2。這時(shí)需要先加載 Stage 1.5,由 Stage 1.5 來加載不同文件系統(tǒng)中的 Stage 2。 Stage 1.5 不是放在文件系統(tǒng)中的嗎?如果是,那么 Stage 1 同樣不能找到 Stage 1.5。其實(shí),Stage 1.5 沒有放在文件系統(tǒng)中,而是在安裝 GRUB 時(shí),直接安裝到緊跟 MBR 之后的 32KB 的空間中,這段硬盤空間是空白無用的,而且是沒有文件系統(tǒng)的,所以 Stage 1 可以直接讀取 Stage 1.5。讀取了 Stage 1.5 就能識(shí)別不同的文件系統(tǒng),才能加載 Stage 2。
stage2:加載GRUB的配置文件
Stage 2 階段主要就是加載 GRUB 的配置文件 /boot/grub/grub.conf,然后根據(jù)配置文件中的定義,加載內(nèi)核和虛擬文件系統(tǒng)。接下來內(nèi)核就可以接管啟動(dòng)過程,繼續(xù)自檢與加載硬件模塊了。
16.9 /boot/grub/目錄分析BIOS 在進(jìn)行完成系統(tǒng)檢測(cè)之后,就會(huì)找到第一個(gè)可以啟動(dòng)的設(shè)備,并讀取該設(shè)備的 MBR(主引導(dǎo)記錄)以及加載 MBR 中的 boot loader(啟動(dòng)引導(dǎo)程序),這個(gè)啟動(dòng)引導(dǎo)程序可以具有菜單功能、直接加載核心文件以及控制權(quán)移交的功能等。系統(tǒng)必須要借助啟動(dòng)引導(dǎo)程序,才能加載內(nèi)核,那么問題來了,MBR 只是占據(jù)整個(gè)設(shè)備的第一個(gè)扇區(qū)中,其大小也就只有 446 字節(jié)而已,但啟動(dòng)引導(dǎo)程序功能這么強(qiáng)大,光程序代碼即配置數(shù)據(jù)就肯定不止 446 字節(jié),是怎么安裝的嗎?
是這樣的,Linux 系統(tǒng)將啟動(dòng)引導(dǎo)程序的程序代碼運(yùn)行與配置數(shù)據(jù)加載分為以下 2 個(gè)階段:
其中,與 GRUB(啟動(dòng)引導(dǎo)程序)相關(guān)的配置文件,都放置在 /boot/grub 目錄中。我們來看看這個(gè)目錄下到底有哪些文件。
[root@CncLucZK ~]# ll /boot/grub2
total 32
#GRUB中硬盤的設(shè)備文件名與系統(tǒng)的設(shè)備文件名的對(duì)應(yīng)文件
-rw-r--r--. 1 root root 64 Nov 26 2019 device.map
#ext2/ext3文件系統(tǒng)的Stage 1.5文件
-rw-r--r--. 1 root root 14K 4月 10 21:49 e2fs_stage1_5
#FAT文件系統(tǒng)的Stage 1文件
-rw-r--r--. 1 root root 13K 4月 10 21:49 fat_stage1_5
#FFS文件系統(tǒng)的Stage 1.5文件
-rw-r--r--. 1 root root 12K 4月 10 21:49 ffs_stage1_5
drwxr-xr-x. 2 root root 4096 Nov 26 2019 fonts
#GRUB的配置文件
-rw-r--r--. 1 root root 4630 Mar 9 2020 grub.cfg
-rw-r--r--. 1 root root 1024 Nov 26 2019 grubenv
drwxr-xr-x. 2 root root 12288 Nov 26 2019 i386-pc
#iso9660文件系統(tǒng)的Stage 1.5文件
-rw-r--r--. 1 root root 12K 4 月 10 21:49 iso9660_stage1_5
#JFS文件系統(tǒng)的Stage 1.5文件
-rw-r--r--. 1 root root 13K 4月 10 21:49 jfs_stage1_5
#GRUB的配置文件。和grub.conf是軟鏈接,所以兩個(gè)文件修改哪一個(gè)都可以
Irwxrwxrwx. 1 root root 11 4月 10 21:49 menu.lst ->./grub.conf
#MINIX文件系統(tǒng)的Stage 1.5文件
-rw-r--r--. 1 root root 12K 4 月 10 21:49 minix_stage1_5
#ReiserFS文件系統(tǒng)的Stage 1.5文件
-rw-r--r--. 1 root root 15K 4 月 10 21:49 reiserfs_stage1_5
#系統(tǒng)啟動(dòng)時(shí),GRUB程序的背景圖像
-rw-r--r--. 1 root root 1.4K 11 月 15 2010 splash.xpm.gz
#安裝到引導(dǎo)扇區(qū)中的Stage 1的備份文件
-rw-r--r--. 1 root root 512 4月 10 21:49 stage1
#Stage2的備份文件
-rw-r--r--. 1 raot root 124K 4月 10 21:49 stage2
#UFS文件系統(tǒng)的Stage 1.
-rw-r--r--. 1 root root 12K 4月 10 21:49 ufs2_stage1_5
#vstafs文件系統(tǒng)的Stage 1.5文件
-rw-r--r--. 1 root root 12K 4 月 10 21:49 vstafs_stage1_5
#XFS文件系統(tǒng)的Stage 1.5文件
-rw-r--r--. 1 root root 14K 4月 10 21:49 xfs_stage1_5
Linux 系統(tǒng)分區(qū)的設(shè)備文件名的命名是有嚴(yán)格規(guī)范的,類似于 /dev/sda1 代表第一塊 SCSI 硬盤的第一個(gè)主分區(qū)。但是在 GRUB 中分區(qū)的表示方法卻完全不同,采用了類似 hd(0,0) 的方式來表示分區(qū)。
其實(shí)也很好理解,其中:
也就是說,hd(0,0) 代表的是第一塊硬盤的第一個(gè)分區(qū),和 Linux 系統(tǒng)中 /dev/sda1 的含義類似,只是不再區(qū)分是 SCSI 硬盤還是 IDE 硬盤。我們說明一下 Linux 系統(tǒng)對(duì)分區(qū)的描述和 GRUB 中對(duì)硬盤的描述。
硬 盤 | 分 區(qū) | Linux中的設(shè)備文件名 | GRUB中的設(shè)備文件名 |
---|---|---|---|
第一塊 SCSI 硬盤 | 第一個(gè)主分區(qū) | /dev/sda1 | hd(0,0) |
第二個(gè)主分區(qū) | /dev/sda2 | hd(0,1) | hd(0,1) |
擴(kuò)展分區(qū) | /dev/sda3 | hd(0,2) | hd(0,2) |
第一個(gè)邏輯分區(qū) | /dev/sda5 | hd(0,4) | hd(0,4) |
第二塊 SCSI 硬盤 | 第一個(gè)主分區(qū) | /dev/sdb1 | hd(1,0) |
第二個(gè)主分區(qū) | /dev/sdb2 | hd(1,1) | hd(1,1) |
擴(kuò)展分區(qū) | /dev/sdb3 | hd(1,2) | hd(1,2) |
第一個(gè)邏輯分區(qū) | /dev/sdb5 | hd(1,4) | hd(1,4) |
[root@CncLucZK ~]# vi /boot/grub/grub.conf
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
#以上為GRUB的整體設(shè)置
title
CentOS (2.6.32-279.el6.i686)
root (hdO,0)
kernel /vmlinuz-2.6.32-279.el6.i686 ro root=OOID=b9a7ala8-767f-4a87-8a2b-a535edb362c9 rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel= auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-279.el6.i686.img
這個(gè)文件的內(nèi)容可以分成兩部分:前 4 行為 GRUB 的整體設(shè)置;title 以下 4 行為要啟動(dòng)的 CentOS 系統(tǒng)的具體配置。這里只安裝了一個(gè)系統(tǒng),如果多系統(tǒng)并存,那么每個(gè)系統(tǒng)都會(huì)有類似的 title 行存在(不一定都是 4 行)。
我們先看整體設(shè)置:
再來介紹 CentOS 系統(tǒng)的具體配置:
査詢分區(qū)的 UUID 最簡(jiǎn)單的辦法就查詢 /ec/fstab 文件。命令如下:
[root@CncLucZK ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Tue Nov 26 02:11:36 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
UUID=b9a7a1a8-767f-4a87-8a2b-a535edb362c9 / ext4 defaults 1 1
/www/swap swap swap defaults 0 0
可以看到"/“分區(qū)的 UUID 和 kernel 行中的 UUID 是匹配的。注意一下 grep 后的”/“,在”/"后是有空格的。
以下禁用都只是在啟動(dòng)過程中禁用,是為了加速系統(tǒng)啟動(dòng)的:
除了以上這樣,命令輸出信息中還包含以下內(nèi)容:
GRUB的配置文件的內(nèi)容就是這樣的,主要是 kernel 行較為復(fù)雜。不過,在這個(gè) /boot/gmb/grub.conf 配置文件中,只啟動(dòng)了一個(gè) Linux 系統(tǒng)。如果在 Linux 服務(wù)器中 既安裝了 Linux 系統(tǒng),又安裝了 Windows 系統(tǒng),那么 GRUB 的配置文件又是什么樣子的呢?
每個(gè)系統(tǒng)都是用 title 字段來表示的,如果在服務(wù)器中又多了一個(gè) Windows 系統(tǒng),那么在 GRUB 的配置文件中只不過就是多了一個(gè) title 字段而已。不過要注意,我們一般建議先安裝 Windows 系統(tǒng),后安裝 Linux 系統(tǒng)。原因是 Windows 系統(tǒng)的啟動(dòng)引導(dǎo)程序無法把啟動(dòng)過程轉(zhuǎn)交到 Linux 系統(tǒng)的 GRUB 中,自然就不能啟動(dòng) Linux 系統(tǒng)了。如果我們后安裝 Linux 系統(tǒng),GRUB 就會(huì)安裝到 MBR 中,覆蓋 Windows 系統(tǒng)的啟動(dòng)引導(dǎo)程序。而 GRUB 是可以把啟動(dòng)過程轉(zhuǎn)交到 Windows 系統(tǒng)的啟動(dòng)引導(dǎo)程序中的,所以 Windows 系統(tǒng)和 Linux 系統(tǒng)都可以順利啟動(dòng)。
當(dāng)然,如果真的是后安裝 Windows 系統(tǒng),則也可以通過手工再安裝一次 GRUB 來覆蓋 MBR 中的 Windows 系統(tǒng)的啟動(dòng)引導(dǎo)程序
查看Windows 和 Linux 雙系統(tǒng)并存的 GRUB 的配置文件是什么樣子的。命令如下:
[root@CncLucZK ~]#vi /boot/grub/grub.conf
default:0
timeout=-1
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title WinXp
rootnoverify (hd0,0)
#指定Windows XP的啟動(dòng)分區(qū)。是第一塊硬盤的第一個(gè)分區(qū)
#rootnoverify是不檢測(cè)此分區(qū)的意思
makeactive
#設(shè)定分區(qū)為激活狀態(tài)
chainloader +1
#把啟動(dòng)過程轉(zhuǎn)交給此分區(qū)的第一個(gè)扇區(qū)
title CentOS (2.6.32-279.el6.i686)
root (hd0,5)
#Linux系統(tǒng)的/boot分區(qū)安裝到了第一塊硬盤的第六個(gè)分區(qū)中
kemel/vmlinuz-2.6.32-279.el6.i686 ro
root=UUID=23e5c9d6-77a8-403a-8c0e2bfeffcab5ef rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet
initrd/initramfs-2.6.32-279.el6.i686.img
參考文獻(xiàn):
Linux啟動(dòng)引導(dǎo)程序(GRUB)加載內(nèi)核的過程
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧