2021-05-12 14:32:11
GRUB應用詳解
bootloader及grub概述
啟動引導裝載程式(bootloader),就是系統啟動時在執行POST加電自檢功能的BIOS程式之後、作業系統核心執行之前這中間所執行的一段程式,bootloader的主要作用是載入核心,並將整個系統的控制權移交給核心。常見的bootloader有Windows的ntloader、Linux的lilo、grub及grub2等。其中,在CentOS 5/6系列上使用的是grub,而在CentOS 7開始則使用grub;lilo則常見於手機,因此lilo是使用者最多的一種bootloader。
Windows:
ntloader
Linux:
LILO:LInux LOader
GRUB:Grand Unified Bootloader
GRUB 0.X:Grub Legacy
GRUB 1.X:Grub2
就MBR分割區方法而言,大多數Bootloader都分為多個階段來引導,其中第一階段存放於MBR中,用於引導裝載第二階段。而grub作為Bootloader的一種也不例外,它是分為stage1,stage2,stage1.5這三個階段來引導的:stage1的主要工作是載入stage1.5,stage1.5的主要工作是載入檔案系統驅動,讓stage1中的bootloader能夠識別stage2所在分割區的上的檔案系統,stage1.5會提供多種檔案系統的驅動,如下:
[root@localhost grub]
# ls -1F
device.map
e2fs_stage1_5
fat_stage1_5
ffs_stage1_5
grub.conf
iso9660_stage1_5
jfs_stage1_5
menu.lst@
minix_stage1_5
reiserfs_stage1_5
splash.xpm.gz
stage1
stage2
ufs2_stage1_5
vstafs_stage1_5
xfs_stage1_5
[root@localhost grub]
#
可以看見,每個stage1.5檔案對應一種檔案系統,而借助於stage1.5階段所提供的檔案系統驅動,stage1就可以通過載入其中某一種檔案系統驅動來識別stage2所在分割區的檔案系統了。舉個例子,如果stage2所在分割區上的檔案系統是ext4,那麼stage1就會通過stage1.5提供的e2fs_stage1_5來識別stage2。完成對stage2的識別和載入之後,stage2就能夠載入stage2所在分割區上(即/boot所在分割區)的核心檔案和ramdis檔案(注意:ramdisk檔案並非必須)至記憶體中了。此外,grub的功能主要是通過stage2來實現的,在系統啟動時,stage2可以向使用者提供選單,並提供互動式介面,允許使用者通過選單選擇要載入的核心或作業系統,另外,如果使用者有需要,stage2還可以為選單提供保護機制,而保護機制有兩種,一種是為編輯選單提供認證,另外一種是為啟動的核心或作業系統提供認證。以下總結grub(stage2)的主要功能:
grub(stage2)的功用:
(1)向使用者提供選單,並提供互動式介面。例如,在啟動時可進入選單,通過鍵入e鍵進入編輯模式,可以編輯選單,此時會讀取組態檔;也可以通過鍵入c鍵可以進入命令列模式,即進入互動式介面,可以自己手動指定要啟動的核心而不讀取grub組態檔;
(2)載入使用者選擇的核心或作業系統。在選擇時允許使用者傳遞引數給核心,也可以隱藏選單的具體內容;
(3)為選單提供保護機制。可以為編輯選單提供認證,使用者需要通過認證方可編輯指定選單;也可以為核心或作業系統提供認證,使用者需要通過認證方可啟動指定的核心或作業系統;
演示:
啟動時進入編輯選單:
鍵入e鍵可以編輯選單,如下所示,再此時再鍵入一次e鍵就可以編輯選定的引數了。
按下Esc鍵可以返回第一個選單介面,再鍵入c鍵可以直接進入命令列模式(互動式介面):
通過'help'可檢視幫助,而'help KEYWORD'則可以檢視指定項的詳細幫助:
可以通過find命令查詢檔案,例如查詢/boot分割區下的核心檔案:
使用者可以通過這個互動式介面指定要載入的核心及ramdisk檔案,但在此之前要先指定grub的根分割區(注意:stage2所在分割區即為grub的根分割區,這裡grub的根不一定是檔案系統的根),而要指定grub的根分割區則必須採用grub識別裝置的方式來指定,grub識別裝置是通過命令'root (hd#,#)'來指定的,各部分解釋如下:
root:用於切換grub所在分割區;
hd
#:磁碟編號,用數位表示;從0開始編號;
#:分割區編號,用數位表示;從0開始編號;
需要注意的是,使用者在指定要載入的核心或作業系統時,通常需要指定grub的根(root (hd#,#)),並且指定Kernel及initrd所在路徑,必要時傳遞一些引數給Kernel。但是,Kernel及initrd是以grub的“根”作為起始目錄的,也就是說如果/boot作為基本磁碟分割區獨立出來時,那麼Kernel及initrd在指定路徑時的起始目錄為'/';如果/boot不作為基本磁碟分割區,而是根分割區('/')之下的一個目錄時,那麼此時grub的“根”即為檔案系統的根,Kernel及initrd的起始目錄為/boot/。
使用者可在互動式介面下手動指定要載入的Kernel及initrd。在進入選單時和剛才一樣,鍵入c鍵進入grub命令列模式(互動式介面),而當/boot為獨立分割區時,分別指定kernel及initrd的在grub的“根”下的檔案路徑,如下所示:
這裡在Kernel指定路徑之後至少還要傳遞兩個引數,一個是'ro',指明是以唯讀方式掛載根檔案系統,'root=xxx'這一樣則指明根檔案系統所在分割區,這裡實驗環境的根檔案系統所在分割區是一個LVM邏輯卷。最後鍵入'boot'即可載入指定的核心或作業系統並完成啟動。
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2017-03/141971p2.htm
相關文章