GRUB (Grand Unified Bootloader)
位于系統引導盤的MBR中的Boot Loader。
GRUB是一個來自GNU項目的啟動引導程序。GRUB是多啟動規范的實現,它允許用戶可以在計算機內同時擁有多個操作系統,并在計算機啟動時選擇希望運行的操作系統。GRUB可用于選擇操作系統分區上的不同內核,也可用于向這些內核傳遞啟動參數。
Grub分為2個版本:
grub 0版本:也叫grub legacy。CentOS6、CentOS5采用此版本
grub 1版本:也叫grub2。CentOS7采用此版本
一、grub legacy:
stage1:mbr
stage1_5:mbr之后的扇區,讓stage1中的bootloader能識別stage2所在的分區上的文件系統。
功能:為grub提供文件系統驅動。從而能訪問2階段內核所在的分區。
stage2:磁盤分區(/boot/grub)
stage2及內核通常放置于一個基本磁盤分區。
stage2的功用:
(1)提供菜單、并提供交互式接口
e:編輯模式,用于編輯菜單
c:命令模式。交互式接口。
(2)加載用戶選擇的內核或操作系統
運行傳遞參數給內核
可隱藏菜單
(3)為菜單提供了保護機制
為編輯菜單進行認證
為啟用內核或操作系統進行認證
二、配置文件:/boot/grub/grub.conf,有一鏈接文件/etc/grub.conf
2.1、grub配置文件:
/boot/grub/grub.conf 配置項: default=#:設定默認啟動的菜單項,菜單項編號從0開始 timeout=#:指定菜單項等待選項選擇的時長 splashimage=(hd#,#)/path/to/xpm_pic_file:指明菜單背景圖片文件路徑。 hiddenmenu:隱藏菜單 passwd [--md5] String:菜單編輯認證 title TITLE:定義菜單項“標題”,可出現多次 root (hd#,#):grub查找stage2及kernel文件所在的設備分區。為grub的根。 kernel /path/to/vmlinuz ro root=/dev/mapper/some_path:啟動的內核 initrd /path/to/initramfs_file:內核匹配的ramfs文件。 passwd [--md5] String:啟動選定的內核或操作系統時進行認證。
2.2、如何生成加密密碼串:
1)openssl生成加密密碼串
~]#openssl passwd -1 -salt "123456"
-1 指定加密方式為md5
-salt 在生成加密密碼時,注入“鹽質”
2)grub-md5-crypt命令:生成要保護密鑰的密碼串
三、grub中如何識別設備
(1)boot目錄單獨分區,并掛載于/目錄。
這個時候,由于內核還未加載,所以不存在真正意義上的根,那么存放于/boot上的內核文件以及ramdisk文件和grub配置文件如何能夠被識別呢?
stage1會將/boot選舉為boot的根,在grub階段查找/boot上的文件時, 是以boot為跟查找。比如,查找磁盤上的/boot/vmlinuz在grub階段表現為查找/vmlinuz;查找/boot/grub/grub.conf表現為查找/grub/grub.conf。
(2)boot目錄沒有單獨分區,而是位于/所在的分區。
這種情況下,grub階段查找boot下的vmlinuz文件表現為查找/boot/vmlinuz;查找boot下grub目錄下的grub.conf文件表現為查找/boot/grub/grub.conf文件。
(3)什么樣的情形下boot單獨分區,而不是位于/所在的分區?
grub訪問的分區只能是基本磁盤分區,LVM&RAID等都不支持。當要使用LVM按需擴展/時,boot要單獨分區。
(4)如何在grub中指定boot的根
grub中的root指令用于指定系統啟動處于grub階段時,文件系統的跟。若boot單獨分區,則以boot分區為根;若boot未單獨分區,則以文件的絕對路徑查找文件。
root (hd#,#)
hd#:磁盤編號,用數字表示;從0開始編號
#:分區編號,用數字表示;從0開始編號
四、grub的命令行接口
4.1、在命令行中可使用的命令
help:獲取幫助立標 help Command:獲取對應命令的幫助信息 find (hd#,#) /path/to/some_file root (hd#,#) :設置在grub階段的/ kernel /path/to/kernel_file:設定本次啟動時用到的內核文件;額外還可以添加許多內核支持使用的cmdline參數 如:init=/path/to/init,selinux=0 initrd /path/to/initframfs_file:設定為選定的內核提供額外文件的ramdisk,其版本號必需與內核的版本號完全一致。 boot:引導啟動選定的內核
4.1、如何手動在grub命令行接口啟動系統:
grub>root (hd#,#) grub>kernel /vmlinuz-Version-Release ro root=/dev/Device grub>initrd /initramfs-Version-Release.imggrub>boot
五、GRUB Trouble Shooting:
5.1 如何進入單用戶模式
(1)開機,進入系統,在grub菜單選擇要使用的內核,摁“e”鍵,進入grub菜單,選定要編輯的title,而后使用e進行編輯
(2)選定kernel項,摁“e”進行編輯,在選定的kernel后附加:1、s、S或single都可進入單用戶模式,輸入完成,回車
(3)在kernel所在行,摁"b"鍵引導系統。
5.2 如何進入救援模式
選擇通過光盤引導
選擇進入救援模式
選擇語言
選擇鍵盤類型
根據需要選擇是否開啟網絡功能
選擇繼續
選擇shell,進入命令行模式
之后,可在命令行進行修復操作.
5.3 安裝grub
grub-install命令:完整安裝stage1、stage1_5、stage2
grub-install –root-directory=Root /dev/Disk
–root-directory=/ #指定/
/dev/Disk #指定/所在的硬盤,注:不是/所在的硬盤分區
5.4 grub被破壞或配置文件丟失。
如何為本機修復GRUB:
破壞stage,無法看見grub啟動菜單,若退出,只能進入救援模式修復。若未退出,使用下面第一種、第二種方式進行修復。
模擬破壞:破壞之前先備份,也可以對虛擬機做備份。
dd if=/dev/sda of=/src/mbr.bak bs=1 count=512dd if=/dev/zero of=/dev/sda bs=1 count=200 sync
修復
第一種方式
grub-install --root-directory=Root /dev/Disksync
第二種方式
grub#進入grub提示符 grub >root (hd#,#) #指定/分區 grub >setup (hd#) #指定在那塊磁盤上安裝stage1 sync
注意:第二種方式僅限于/目錄下必須事先存在boot目錄,且stage1、stage1_5、stage2等文件必須存在,否則安裝失敗
第三種方式:破壞之后重啟,進入救援模式修復
如何進入救援模式:
(1)載入系統光盤
(2)敲esc鍵,進入命令行模式,鍵入“linux rescue”命令;或者通過啟動菜單中的rescue選項進入救援模式。
(3)chroot /mnt/sysimage #切換至原有系統的/目錄下
(4)grub-install –root-directory=Root /dev/Disk
(5)exit
(6)reboot
1) 破壞stage1
在命令行模式進行修復
模擬破壞stage1,即MBR的前446字節
查看,發現前446字節已被破壞
~]#grub-install --root-directory=/ /dev/sda
再次查看MBR
重啟系統可以正常進入系統
2) 破壞stage1.5
~]#dd if=/dev/zero of=/dev/sda bs=1 count=1024 seek=512
seek=n:跳過of指定的文件的前n個字節
不退出系統,使用grub命令進行修復
之后,重啟系統,啟動正常
3) 破壞stage2
stage2是加載內核及偽根文件系統initramfs的,要破壞stage2,刪掉/boot下的vmlinuz文件和initramfs文件即可。
進入救援模式,恢復丟失的2個文件
a、系統上掛載有安裝光盤,可以通過拷貝安裝光盤上isolinux目錄下的vmlinuz文件到/boot目錄下,并使用mkinitrd命令生成initramfs文件,之后修改grub/grub.conf文件,修改kernel、initrd對應的文件。
chroot /mnt/sysimage cp /mnt/iso/isolinux/vmlinuz /boot/ mkinitrd /boot/initramfs-`uname -r`.img `uname -r`
修改grub/grub.conf文件
exit退出救援模式,選擇reboot Reboot選項,重啟系統
b、若系統不能掛載安裝光盤,則可以選擇通過網絡來拷貝vmlinuz文件。在進入救援模式時,選擇啟用網絡功能。之后使用scp 命令來拷貝遠程文件??截恦mlinuz文件之后,使用mkinitrd命令生成initramfs文件,修改grub.conf文件,重啟系統即可。
注:在這一過程中,損壞的系統必須與拷貝的目標主機在同一個局域網中。且目標主機應允許遠程拷貝文件。
選擇啟用網絡功能
選中要使用的網卡,摁"tab"鍵切換至ok選項,回車
若局域網中有dhcp服務器,可選擇通過dhcp獲取ip地址。沒有dhcp服務器可選擇手動添加ip地址。這里選擇dhcp獲取,ok確認
之后操作不再贅述。
4)破壞grub配置文件
要恢復grub.conf配置文件較簡單,若未退出系統,手動編輯一份配置文件即可;若退出系統重啟,進入救援模式編譯grub.conf配置文件即可。修復過程不再贅述。
5)破壞/etc/fstab
刪除/etc/fstab文件。重啟不能正常啟動。
啟動報錯
不能進入系統
重啟進入救援模式
進入救援模式,能看到沒有發現linux分區的錯誤,摁"ok"繼續進入救援模式修復。
進入到命令行之后,使用fdisk -l查看磁盤分區情況,可以查看到,/dev/sda1為boot分區。但是無法確認/分區。
怎么確認/分區是那塊磁盤呢,通過fdisk可以看到,除了boot分區之外,共有4個分區。為每個分區建立一個掛載點,分別掛載各分區,之后,進入掛載目錄,查看目錄結構,/分區的目錄結構還是很好區分的。這里,掛載/dev/sda2報錯,查看,發現sda2是LVM。
如果/是普通文件系統,可以直接掛載;若果是LVM,則需先激活,才能掛載。、
使用vgchange -ay 激活LVM
之后,掛載分區,進入分區查看。
其實通過lvscan直接就看出/dev/vg0/root是根分區了。如果/是普通分區的話,需要一一查看。
使用blkid可以查看到分區的文件系統。
查找到/之后,切換/
chroot /mnt/sda2(/dev/vg0/root的掛載點)
若在其他目錄,有fstab文件的備份,可以拷貝該備份;若沒有備份,則編輯/etc/fstab文件。注:若/usr單獨分區,則/usr也應該掛載
保存,退出。重啟系統。啟動正常。
系統是能夠正常啟動,但是,若fstab文件沒有備份,又不知道具體的每個分區掛載情況,有可能導致某些數據或功能或業務不能正常使用。所以,關鍵數據的備份是非常重要的,當系統出現錯誤時,我們能夠通過備份快速恢復系統,并能保障業務的正常運行。
6) 破壞/boot
刪除/boot下的所有文件,并umount /boot
進入救援模式修復
若/etc/fstab文件沒被破壞,則直接切換根至/mnt/sysimage;若/etc/fstab文件被破壞,則先修復fstab文件,之后重啟系統,再次進入救援模式,修復/boot。
chroot /mnt/sysimange
掛載安裝光盤
安裝光盤中的kernel-Version包。安裝時使用–force選項。
kernel包安裝完成之后,會生成vmlinuz文件及initramfs文件,但是grub目錄及目錄下的文件并沒有生成,使用grub-install命令,生成grub目錄及文件。
grub-install執行完成之后,生成grub目錄及相關文件,但是grub.conf文件并沒有生成,需要我們手動配置。重寫grub.conf配置文件不再是個難題啦。
配置完成之后,重啟系統,在grub菜單欄可以查看到我們填寫的配置,回車選擇,等待系統修復。
啟動正常
7) /sbin/init文件被刪除
刪除/sbin/init文件
重啟進入系統,無法正常工作。
進入救援模式,若有文件備份,直接拷貝使用,也可以重其他機器上拷貝使用;若沒有備份,則需安裝upstart的rpm包。
退出,重啟,系統啟動正常。
總結:系統重要文件應該備份,在出錯時能及時得到恢復。在對配置文件做修改時,應先備份再修改,當配置出現錯誤時能得到還原。熟悉系統啟動流程對于系統排故非常重要。熟練掌握在救援模式下修復系統非常重要。
原創文章,作者:M20-1鐘明波,如若轉載,請注明出處:http://www.www58058.com/46042