什么是GRUB
GRUB(boot loader):grub:GRand Unified Bootloader
有兩個版本:grub 0.x:grub legacy經典版;grub 2.x
grub legacy:主要運行分三個階段
stage1(第一階段):安裝在mbr中
stage1.5(第1.5階段):存放在mbr之后的扇區中,讓stage1中的bootloader能識別stage2所在的分區上的文件系統(否則他是沒辦法加載第二階段的)
stage2(第2階段):這個就是我們開機能看到提供菜單,讓我們能夠編輯時的加載界面的那個階段,第二階段是存放在磁盤分區上的,一般都在/boot/grub/目錄下
=============================以上就是grub的組織格式=============================
因此當我們系統啟動的時候如果要加載grub所在的磁盤時,會讀取這個磁盤上的MBR,從此能加載到stage1,stage1加載完以后會嘗試去加載stage1.5,stage1.5階段讀到以后,從而就能夠驅動stage2所在的磁盤分區;其實這個磁盤分區上不但有第二階段,還有內核文件和ramdisk等等,都在這個分區上放置著,這就是為什么grub能夠加載內核文件的原因。注意:主板bios必須能夠識別硬盤。然后bios才能去加載硬盤上的boot loader,磁盤上boot loader加載完以后就能夠直接識別當前主機能識別到的硬盤設備了,但是,硬盤設備能夠識別,并不以為著能夠識別硬盤中的文件系統,因為文件系統是額外附加的一層軟件組織的文件結構。所有要想能夠對接某種文件系統,必須要用到文件系統驅動。所謂的stage1.5階段也就是給grub提供了文件系統驅動,從而grub就能夠訪問對應的stage2和內核所在的分區了,這通常應該是一個基本磁盤分區,畢竟stage1.5不可能做的過于復雜。所以grub的第二階段,以及內核還有ramdisk文件通常都會放在一個基本磁盤分區。
stage2及內核等通常放置于一個基本磁盤分區(就是一般的磁盤分區,不是lvm和軟raid;因為grub根本就驅動不了邏輯卷)
grub的功用:
(1)提供菜單,并提供交互式接口
e:編輯模式,用于編輯菜單;
c:命令模式,交互式接口(對于grub來講他不用讀取配置文件,就能夠打開其內置的命令行提示符,在我們鍵入的命令的支持下,完成某些操作)
(2)加載用戶選擇的內核或操作系統
加載內核的同時允許用戶通過編輯菜單傳遞參數給內核,還可隱藏此菜單
(3)為菜單提供了保護機制
為編輯菜單進行認證
為啟用內核或操作系統進行認證
grub如何去識別設備:
(hd#,#)
hd#:磁盤編號,用數字表示
#:分區編號用數字表示;從0開始編號
grub的命令行接口
help:獲取幫助列表
helo KEYWORD:獲取詳細幫助信息
find (hd#,#)/PATH/TO/SOMEFILE:
root (hd#,#):表示把哪一個磁盤分區識別為根設備
kernel /PATH/TO/KERNEL_FILE;設定本次啟動時用到的內核文件;額外還可以添加許多內核支持使用的命令行參數
例如:
init=/path/to/init :表示我使用這個文件做init程序都可以
selinux=0:表示禁用內核中的selinux功能
initrd /PATH/TO/INITRAMFS_FILE:設定為選定的內核提供額外文件的ramdisk
boot:引導啟動選定的內核
如何手動在grub命令行接口啟動系統
grub> root (hd#,#)
grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE
grub> initrd /initramfs-VERSION-RELEASE.img
grub> boot
grub也有配置文件:/boot/grub.conf通常有個符號連接文件在/etc/grub.conf(/boot/grub/grub.conf <– /etc/grub.conf)
配置文件:/boot/grub/grub.conf
配置項:
default=#:設定默認啟動的菜單項:菜單項(title)編號從0開始;
timeout=#:指定菜單項等待用戶選擇的時長;
splashimage=(hd#,#)/PATH/TO/XPM_PIC_FILE:指明菜單背景圖片文件路徑;
hiddenmenu:隱藏菜單;
password [–md5] STRING:設定認證方式:菜單編輯認證
title TITLE:定義菜單項“標題”,可出現多次;用來引導不同的內核或操作系統
root (hd#,#):grub查找stage2及kernel文件所在的設備分區;為grubd的“根”;
kernel /PATH/TO/VMLINUZ_FOLE [PARAMETERS]:啟動的內核
initrd /PATH/TO/INITRAMFS_FILE:內核匹配的ramfs文件
password [–md5] STRING:啟動選定的內核或操作系統時進行認證;
grub的保護機制;
在配置文件中的主配置行加上password [–md5] STRING:設定認證方式:菜單編輯認證
在配置文件中的菜單配置行加上password [–md5] STRING::啟動選定的內核或操作系統時進行認證;
加密密碼串的命令
openssl可以生成密碼串
grub-md5-crypt命令
如何進入單用戶模式:
(1)編輯grub菜單(選定要編輯的title,而后使用e命令:先選定tatle(菜單)再敲e鍵);
(2)在選定的kernel后按鍵
1,s,S或single都可以;
(3) 在kernel所在行,鍵入“b”命令:
如何安裝grub;兩種方法
(1)grub-install
grub-install –root-directory=ROOT(boot目錄的父目錄) /dev/DISK
注意:此種方法不要求當前指定的根下有boot目錄
(2)grub
grub> root (hd#,#)
grub> setup (hd#)
注意:此種方法要求指定的root設備上必須事先存在有一個grub目錄以及grub目錄里的各種stage1,1.5,2文件都得存在才行。
實驗啟動流程排錯
為GRUB菜單項和內核加上啟動密碼
在grub.conf配置文件中每個菜單項和內核項加上加密項(密文加密)
]# grub-md5-crypt 使用此命令生成密文,然后將密文添加進配置文件中相對應的菜單和內核,添加完以后下次重啟必須輸入密碼才能進入。
使用菜單項編輯模式修復配置文件kernel配置項
先在配置文件中對kernel文件進行破壞
在菜單項選定內核然后敲e鍵進入編輯模式,可看到kernel一欄為空
選定kernel欄敲擊e鍵鍵入以下內容保存敲擊b鍵啟動(/vmlinuz-2.6*表示內核核心文件,root=/dev/sda2表示操作系統的根,而且只是臨時生效)
啟動后在需要在配置文件中恢復配置。
手動破壞grub.conf配置文件
刪除后啟動會直接進入grub命令行界面,這就時需要手動執行命令進行配置內容。
啟動之后手段編輯/boot/grub/grub.conf配置文件
給菜單加上背景圖片
先準備一張640*480大小的圖片,并將圖片放至家目錄(這里圖片名稱問shan.jpg)。在centos下載圖片處理工具]# yum -y install ImageMagick
]# yum -y install ImageMagick ]# convert -resize 640x480 -colors 14 shan.png shan.xpm 將圖片格式轉化為xpm ]# file shan.xpm 確認圖片格式 ]# more shan.xpm 確認圖片大小 ]# gzip shan.xpm 壓縮圖片 ]# cp shan.xpm.gz /boot/grub/ 拷貝圖片至grub目錄 ]# vim /boot/grub/grub.conf 編輯grub配置文件添加圖片路徑,然后重啟
確認圖片格式大小
在配置文件中添加背景圖片路徑
重啟成功
手動破壞grub第一階段
]# dd if=/dev/zero of=/dev/sda bs=1 count=446 grub第一階段是安裝在mbr中的,所有破壞mbr的前446個字節即可,然后重啟進入救援模式; 注意:不要破壞分區表,grub修復不了分區表
進入救援模式之后先切根,因為grub這個工具并不在救援模式中存放,進入模式后系統會把根掛載至/mnt/sysimage,要重建grub第一階段必須擁有grub這個工具才行,切根就是為了如此。
注意:如果/etc/fstab文件損壞的話。救援模式就不會自動把根掛載至/mnt/sysimage目錄下。
切根
安裝grub 指明安裝位置為/dev/sda,mbr是在磁盤的0磁道1扇區的,grub第一階段就是在mbr中。與分區無關
重啟,注意:重啟時系統會進行修復動作,略耗時間
手動破壞grub第1.5階段,使用grub命令進行修復
]# dd if=/dev/zero of=/dev/sda bs=512 count=2 seek=1 注意:不要破壞分區表,grub修復不了分區表
破壞以后重啟系統會直接黑屏,因此需要再次進入救援模式,就如救援模式以后指明grub命令進入grub命令行;
在grub命令行執行root (hd0,0)和setup(hd0)命令
然后退出grub
重啟
注:重啟過程系統會執行修復動作,略耗時間。而且使用進入救援模式以后直接切根執行grub-install /dev/sda命令也可修復,
修復第二階段的前提是1和1.5階段沒有損壞,而且grub命令行的修復是基于/boot/grub/目錄下的各個文件的,如果沒有這些文件將無法修復。但是grub-install不依賴與那些個文件。
破壞整個grub目錄,用grub-install進行修復
]# rm -rf /boot/grub 刪除grub目錄 chroot /mnt/sysimage 進入救援模式切根 grub-install /dev/sda 救援模式下安裝grub到/dev/sda (/dev/sda相當于 --root-dircetory=/) vim /boot/grub/grub.comf 編輯grub配置文件
退出救援模式重啟
手動刪除整個/boot目錄,利用救援模式修復
]# rm -rf /boot/ 刪除整個boot目錄,命令執行完畢后會有一個報錯,不予理會,實際boot下的所有文件都已經刪除干凈
光盤啟動進入救援模式
chroot /mnt/sysimage 切根 mkdir /mnt/cdrom 創建掛載點 mount /dev/cdrom /mnt/cdrom/ 將光盤掛載至掛載點 rpm -ivh /mnt/cdrom/kernel-2*.rpm --replacepkgs|force 安裝內核
grub-install /dev/sda 安裝grub
vim /boot/grub/grub.conf 編輯grub配置文件
退出救援模式重啟
手動破壞/boot/vmlinuz核心文件和/boot/initramfs偽根文件,利用開啟網絡服務的救援模式進行修復
]# rm -rf /boot/initramfs-2.6.32-642.el6.x86_64.img vmlinuz-2.6.32-642.el6.x86_64 破壞
在救援模式選擇開啟網絡
選擇網絡設備
配置網絡地址,如有dhcp服務可選dhcp,如沒有就需要自己配置,這里選擇dhcp
等待獲取ip地址
獲取成功Continue繼續
兩次ok進入shell start shell
進入以后依次執行如下命令
chroot /mnt/sysimage/ 切根 scp 10.1.252.189:/boot/vmlinuz* /boot/ 從網絡主機拷貝核心文件 需要知道目標主機ip地址和登錄密碼,而且要拷貝的核心文件必須與當前 主機版本號相同 scp 10.1.249.189:/boot/initramfs* /boot/ 從網絡主機拷貝偽根文件 需要知道目標主機ip地址和登錄密碼,同樣版本號需要相同 vim /boot/grub/grub.conf 檢查配置文件中核心文件與偽根文件版本號是否和復制的版本號相同,如相同則重啟,不同則修改后重啟
手動破壞/boot/目錄和/etc/fstab文件,利用救援模式修復
]# rm -rf /boot/ /etc/fstab 破壞
光盤進入救援模式,因為刪除了/etc/fstab所以體系無法自動根據/etc/fstab進行掛載(若/etc/fstab存在我們可以使用chroot /mnt/sysimage,現在無法使用此命令),會出現下列提示;表示找不到系統分區情況,這是因為沒有/etc/fstab文件,所以找不到掛載關系了,這個時候的修復工作就麻煩一些。
fdisk -l 先查看分區情況
得知/dev/sda1為boot引導分區,但是不知道哪個是根
mkdir /mnt/sda1 mkdir /mnt/sda2 mkdir /mnt/sda3 分別創建各分區的掛載點 mount /dev/sda1 /mnt/dev/sda1 mount /dev/sda2 /mnt/dev/sda2 mount /dev/sda3 /mnt/dev/sda3 依次掛載并查看內容
可看到根文件系統在sda2中
vi /mnt/sda2/etc/fstab 編輯自動掛載配置文件 也可以echo 進去
保存退出,在救援模式重啟,重新進入救援模式,讓系統自動掛載/mnt/sysimage
重啟
如果掛載成功就執行如下命令:如果掛載失敗有可能是邏輯卷問題,邏輯卷問題后續解決
chroot /mnt/sysimage/ mount /dev/cdrom /mnt/ rpm -ivh /mnt/Packages/kernel-* --foace 安裝內核 grub-install /dev/sda 安裝grub
vim /boot/grub/grub.conf 編輯grub配置文件 default=0 timeout=3 title ali root (hd0,0) kernel /vmlinux* root=/dev/sda2 initrd /initramfs*
最后重啟;恢復完成
邏輯卷情況下,刪除/boot 和/etc/fstab,救援模式恢復
rm -rf /boot/ /etc/fstab dd if=/dev/zero of=/dev/sda bs=446 count=1 破壞
重啟進入救援模式,出現掛載/mnt/sysimage失敗
執行lvscan 掃描可看到邏輯卷是無效的
執行vgchange -ay 激活邏輯卷
激活后再lvscan可看到邏輯卷生效
將/dev/vh0/root 掛載至 /mnt/sysimage
編輯自動掛載配置文件/etc/fstab
退出重啟
再次光盤進入救援模式,讓系統自動掛載/mnt/sysimage,掛載成功雙ok選定shell
然后以次執行如下命令
chroot /mnt/sysimage mkdir /mnt/cdrom mount /dev/cdrom /mnt/cdrom rpm -ivh /mnt/cdrom/kernel-* --force 安裝內核
grub-install /dev/sda 安裝grub vim /boot/grub/grub.conf 編輯配置文件
最后退出救援模式重啟系統 恢復成功
原創文章,作者:M20-1馬星,如若轉載,請注明出處:http://www.www58058.com/45884
文章對CentOS開機啟動中grub啟動程序解析的很透徹,同時給出的示例也很實用,贊一個。