一、Grub簡介
系統啓動引導管理器(bootloader),就是系統啓動時在執行POST加電自檢功能的BIOS程序之後、操作系統內核運行之前這中間所運行的一段程序,一旦把內核掛載,系統引導管理器的任務就算完成退出,系統引導的其它部份,比如系統的初始化及啓動過程則完全由內核來控制完成。所以,它的主要作用是加載內核,並將整個系統的控制權移交給內核。常見的bootloader有Windows的ntloader、Linux的lilo、grub及grub2等。其中,在CentOS 5/6系列上使用的是grub,而在CentOS 7開始則使用grub;lilo則常見於手機,因此lilo是使用者最多的一種bootloader。
二、Grub配置
(1)stage
Linux將Boot Loader的程序運行與配置項加載分成三個階段(stage)來進行:
stage1:運行Boot Loader主程序,就是從一個本地磁盤加載 stage 2 或者 stage1_5,這個程序必須要被安裝在啓動區,即MBR中。stage1 是用於引導 Grub 的一個必須的映象文件。因爲 MBR 空間有限,只有512字節,所以 stage1 也是512字節。因此在MBR當中僅安裝Boot Loader的最小主程序,即 stage1,並沒有安裝 Boot Loader 的相關配置文件。因爲大小的限制,stage1 對 stage2 或者 stage1_5 的位置進行編碼。
stage1_5:在MBR隨後的扇區存放,主要用於與 stage2 的分區的文件系統進行交互,讓stage1中的 Boot Loader 能夠識別stage2所在分區的上的文件系統,通過藉助於stage1.5階段所提供的文件系統驅動,stage1就可以通過加載其中某一種文件系統驅動來識別stage2所在分區的文件系統了。
stage2:(1) 向用戶提供菜單,並提供交互式接口。例如,在啓動時可進入菜單,通過鍵入e鍵進入編輯模式,可以編輯菜單,此時會讀取配置文件;也可以通過鍵入c鍵可以進入命令行模式,即進入交互式接口,可以自己手動指定要啓動的內核而不讀取grub配置文件;
(2) 加載用戶選擇的內核或操作系統。在選擇時允許用戶傳遞參數給內核,也可以隱藏菜單的具體內容;
(3) 爲菜單提供保護機制。可以爲編輯菜單提供認證,用戶需要通過認證方可編輯指定菜單;也可以爲內核或操作系統提供認證,用戶需要通過認證方可啓動指定的內核或操作系統。
device.map:定義 grub 裝在了哪裏 e2fs_stage1_5:ext4文件系統的定義 fat_stage1_5:fat文件系統的定義 ffs_stage1_5:ffs文件系統的定義 grub.conf:grub的配置文件 iso9660_stage1_5:光驅文件系統的定義 jfs_stage1_5:jfs文件系統的定義 menu.lst -> ./grub.conf minix_stage1_5:minix文件系統的定義 reiserfs_stage1_5:reiserfs文件系統的定義 splash.xpm.gz:啓動時在 grub 底下的背景圖示 stage1:tage 1的相關說明 stage2:tage 2的相關說明 ufs2_stage1_5:ufs2文件系統的定義 vstafs_stage1_5:vstafs文件系統的定義 xfs_stage1_5:xfs文件系統的定義
由以上得知在 /boot/grub 目錄下最重要的是grub的配置文件及各種文件系統的定義,當 Boot Loader 讀取了這些文件系統所定義的數據後,就能夠識別文件系統並讀取該文件系統上的內核文件了。
(2)grub的配置文件
配置文件:/boot/grub/grub.conf<--/etc/grub.conf,grub.conf是grub的主配置文件,通過這個配置文件,grub才能找到kernel,系統才能正常啓動。
default=0 表示默認的啓動條目,假如同時裝有多個操作系統,0 表示定義的第一個title系統,1 表示定義的第二個title系統,依次類推。 timeout=5 表示可供選擇的等待時間,如果超過5秒,則使用默認的啓動條目default定義的。 splashimage=(hd0,0)/grub/splash.xpm.gz 定義啓動時的gurb背景圖片信息,一般爲壓縮文件。 hiddenmenu 啓動時是否要顯示菜單,默認情況下是不顯示菜單信息,如果想要顯示菜單,可以將該配置註釋即可; title 定義各個操作系統的名稱或系統內核 root 表示內核文件存放的位置,這裏指定的是分區位置,而非根目錄 (hd0,0) 識別硬盤設備 hd#: 磁盤編號,用數字表示;從0開始編號 #: 分區編號,用數字表示; 從0開始編號 (hd0,0) 第一塊硬盤,第一個分區 kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=e0d35066-8d37-42f2-bdb9-e4416aec281a rhgb quiet 內核的名稱以及一些啓動時的核心參數。由於啓動過程中需要掛載根目錄,因此就需要指定根目錄所在的分區。rhgb表示色彩顯示,quiet表示靜默模式加載內核。 initrd /initramfs-2.6.32-696.el6.x86_64.img 虛擬文件系統,指明用於輔助內核完成系統啓動的ramdisk文件路徑再次在內存緩存
注意: kernel與initrd這兩個設置項中,指定的路徑都是絕對路徑。因爲這兩個文件都存放在/boot目錄。而且/boot所在的分區已經在root (hd[0-n],[0-n])中指定,所以就無需再指明kernel與initrd在哪個分區了。如果boot分區爲獨立分區,那麼前面的/boot省略掉。如果boot分區爲非獨立分區,那麼必須加上/boot。
三、實驗
在Linux系統中,出於安全的考慮,只有一個root用戶,因此若遺忘root用戶的登錄密碼,就可以藉助grub進入單用戶模式進行修改密碼。
實驗1:修改root密碼
(1)重啓系統,在讀秒沒完成之前,按任意鍵進入grub菜單。出現grub菜單時,按↑,↓進行引導,並定位到要進入的操作系統選項,如圖進行操作。
(2)按“↓”進行引導,定位到第二個選項,按“e”進入編輯模式。
(3)輸入1之後回車返回grub模式,按b進入單用戶模式。
(4)進入shell環境,輸入passwd,重新更改root密碼,輸入完成後,使用reboot命令重啓系統。
(5)輸入用戶名和新密碼,啓動系統。
實驗2: 刪除/boot下的所有文件,並恢復
(1)刪除/boot下的所有文件,並重啓系統
(2)在進度條沒完成之前,右手按鼠標左鍵,同時左手按ESC鍵,進入Boot Menu,使用↓進行引導,定位到3. CD-ROM Drive 選項,回車。
(3)使用↓進行引導,定位到選項resuce(救援模式),回車
(4)依次“yes”“yes”“no”“yes”“continue”“OK”......,直至進入shell編輯模式,回車。
(5)切換根目錄,安裝grub.
chroot /mnt/sysimage grub-install /dev/sda
(6)掛載光盤,複製vmlinux到/boot目錄下,創建initrd系統。
mount /dev/cdrom /media cp /media/isolinux/vmlinux /boot mkinitrd /boot/initrd-$(uname -r).img $(uname -r)
(7)進入/boot/grub/目錄下,使用vim命令編輯grub.conf文件,內容如下:
注:腳本里的UUID指的是/boot目錄下的UUID,別搞錯了。
(8)輸入兩次exit命令,退出shell編輯模式,重啓系統,回車。
實驗3:給grub加密
grub也有自己的保護機制,只有通過認證才能修改grub.conf信息。可以通過一些方式來對grub.conf進行保護:
1、在第一個title之上添加 password --md5 ************ 主要用於保護編輯功能; 2、在某個title內添加 password --md5 ************ 主要用於保護內核; 生成密碼的命令:grub-md5-crypt
(1)輸入grub-md5-crypt命令,生成明文密碼
(2)在grub.conf裏添加密碼
(3)重啓系統,在讀秒沒完成之前,按任意鍵進入grub菜單,在下方有下一步提示。
(4)根據提示,輸入p之後提示輸入密碼
(5)輸入密碼完成認證就出現正常編輯grub的配置界面。
grub的界面支持命令行接口,在grub界面可以按照提示輸入e、b、c等命令繼續相應的編輯,在對應的title中輸入c可以進入命令行模式,在命令行中可以輸入一些信息:
help:獲得幫助 find:文件查找,通常用於定位文件,方法find (hd#,#)/ root kernel initrd boot
實驗四:手動在grub命令行接口啓動系統
grub> root (hd0,0) 進入root第一個磁盤,第一個分區 grub> kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=/dev/sda2 掛載內核和root根目錄 grub> initrd /initramfs-2.6.32-696.el6.x86_64.img 掛載虛擬文件系統 grub> boot 啓動系統
在grub界面輸入“c”命令進入grub編輯界面,依次輸入以上命令就可以手動在grub命令行接口啓動系統。