GRUB是一個多操作系統啓動管理器。GRUB全稱爲GRand Unified Bootloader。他是系統啓動後運行的第一個程序,他是用來負載加載,傳輸控制到操作系統的內核,一旦他把內核掛載,系統引導管理器的任務也就完成。其他部分,比如設定默認啓動級別,系統初始化,關閉啓動相應的服務等都內核去完成。
1. grub legacy整個運行分爲了三個階段;
第一階段,stage1,它是直接被寫入到MBR中去的,這樣機器一啓動檢測完硬件後,就將控制權交給了GRUB的代碼。也就是上上圖所看到的前446個字節空間中存放的是stage1的代碼。BIOS將stage1載入內存中0x7c00處並跳轉執行。stage1(/stage1/start.S)的任務非常單純,僅僅是將硬盤0頭0道2扇區讀入內存。此時,stage1是沒有識別文件系統的能力的。
stage1主要負責BIOS和GRUB之間的交接,載入存放於各個分區中的開機文件。例如Linux下/boot/grub/..下面的一些文件。這部分纔是真正放在MBR中的bootloader。
stage1文件的大小正好是512字節,事實上stage1文件其實就是MBR中bootloader的備份,而之所以是bootloader而不是MBR, 是因爲這個文件的前446字節纔是和MBR是一樣的
第二階段,1.5階段,其存放在mbr之後的扇區,讓stage1中的bootloader能識別stage2所在的分區上的文件系統;給grub提供了文件系統的驅動;
解析:GRUB開始沒有OS,也沒有文件系統的概念。那麼GRUB是從何時開始有文件系統的功能的呢。這就是stage1.5乾的事情,stage1.5過後,GRUB就能識別文件系統了,就能在磁盤上識別加載文件了怎麼做到的?start.S加載的磁盤上的那些扇區的內容,就是文件系統的代碼,(即start.S的彙編代碼,有興趣的筒子可以去了解一下),將其(大概14個扇區)加載到內存,就具備了操作啓動設備上面文件的功能了,我們有了文件系統,我們可以直接操作文件了。那麼/boot/grub/stage2這樣的比較大的文件可以直接操作了。此後grub纔有能力去訪問/boot分區/boot/grub目錄下的 stage2文件,將stage2載入內存並執行。
第三階段,stage2:他存放磁盤分區上(/boot/grub/)。
解析:讓用戶以選項的方式將操作系統加載、修改選項以及新增參數,平時開機啓動的時候看到的Grub選項、信息,還有修改GRUB背景等功能都是stage2提供的,stage2會去讀入/boot/grub/grub.conf配置文件。
總結:
1) BIOS將控制權交給硬盤的主引導區,即MBR。
2) MBR中的bootloader(stage1)通過內置的地址加載stage1_5;
3)bootloader通過stage1_5的內容,將分區中的stage2加載;
4)stage2此時就可以在文件系統中將grub.conf文件加載,讓用戶看到選項界面。
grub的配置文件存放在/boot/grub/grub.conf,他還有一個鏈接文件,爲/etc/grub.conf,stage2及內核等通常放置於一個基本磁盤分區。
grub界面通過開機按C進入,如圖:
2.整個grub的功能主要有以下幾方面:
(1) 提供菜單、並提供交互式接口
e: 編輯模式,用於編輯菜單;
c: 命令模式,交互式接口;
(2) 加載用戶選擇的內核或操作系統
允許傳遞參數給內核
可隱藏此菜單
(3)爲菜單提供了保護機制
爲編輯菜單進行認證
爲啓用內核或操作系統進行認證
3.grub如何識別設備:grub在boot目錄下,要看boot的目錄所在處。
格式:(hd#,#)第幾個磁盤的第幾個分區;
hd#: 磁盤編號,用數字表示;從0開始編號
#: 分區編號,用數字表示; 從0開始編號
一般情況爲(hd0,0):第一個磁盤的第一個主分區
4.grub有自己的命令行接口,選項如下:
help: 獲取幫助列表
help KEYWORD: 詳細幫助信息
find (hd#,#)/PATH/TO/SOMEFILE:定位某文件是否存在
root (hd#,#)把哪一個磁盤分區設爲根設備
kernel /PATH/TO/KERNEL_FILE: 設定本次啓動時用到的內核文件;額外還可以添加許多內核支持使用的cmdline參數;指明內核文件的路徑;z表示壓縮格式
例如:init=/path/to/init, selinux=0
initrd /PATH/TO/INITRAMFS_FILE: 設定爲選定的內核提供額外文件的ramdisk;
boot: 引導啓動選定的內核;
如圖:
上面的一些命令可以幫助我們在開機查詢有關grub相關信息。
我們可以假設以下幾種情況:
1)假設一個系統的grub設置出現問題(原因:不正確地修改grub 配置文件,安裝另一個操作系統,硬件上或 BIOS內的改動引致設置的排序不相同),導致grub不能找到它的配置文件,你可能會面對 grub 的開機提示符而無從着手。一般來說,第一步是要找出grub配置文件的位置。
grub的 find 指令可以爲你效勞。
grub> find /grub/grub.conf find /grub/grub.conf (hd0,2) (hd1,2)
這裏告訴我們我們有兩個boot分區,有可能源自不同的操作系統。頭一個位於第一個硬盤的第三個分區,另一個位於第二個硬盤的第三個分區,假若要將第一個項目的grub設置重新安裝到MBR;方法如下:
grub> root (hd0,2) grub> setup (hd0)
2)或者直接去查找stage1所在也可,如圖所示:
grub> find /boot/grub/stage1 (hd0,5) grub> root (hd0,5) grub> kernel /boot/vmlinuz-2.6.18-238.19.1.el5.centos.plusPAE ro root=/dev/sda6 grub> initrd /boot/initrd-2.6.18-238.19.1.el5.centos.plusPAE.img grub> boot
3)如果你安裝了其它 Linux 版本,比如說Ubuntu,它只有 menu.lst配置而沒有grub.conf,但由於 CentOS利用連結把 menu.lst指向 grub.conf,因此在這兩個系統上尋找 menu.lst也是可以的:
grub> find /grub/grub.conf find /grub/grub.conf (hd0,0) grub> find /grub/menu.lst find /grub/menu.lst (hd0,0) (hd0,1)
由此可見,這裏有兩個/boot分區,第一位於硬盤的第一個分區,很可能是centos,而另一個linux的唯一第一個硬盤的的第二個分區;
這時候要查看grub.conf及menu.1st的內容,可以使用cat,
grub> cat (hd0,0)/grub/grub.conf ... 顯示文件內容 ... grub> cat (hd0,1)/grub/menu.lst ... 顯示文件內容 ...
4)要是第一次嘗試找不到文件,很可能/boot 分區並不存在,而grub被安裝在主目錄內。可以嘗試:
grub> find /boot/grub/grub.conf (hd0,0) (hd1,4)
如上所示,這個例子裏有兩個grub。第一個在第一個硬盤的第一個分區,而另一個在第二個硬盤的第五個分區 —— 亦即首個擴展分區。
如果要撤消第二個項目並將GRUB的開機程序安裝在第一個硬盤的 MBR 上:
grub> root (hd1,4) grub> setup (hd0
4)如果不清楚主目錄的位置時,可以嘗試尋找 /etc 內的一個文件。例如:
grub> find /etc/fstab (hd0,1)
由此我們得知 / 位於第一個硬盤的第二個分區上 —— 採用 SCSI 或 SATA 等於 /dev/sda2,而採用 PATA 等於/dev/hda2。
手動在grub命令行接口啓動系統:
grub> root (hd#,#)
grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE
grub> initrd /initramfs-VERSION-RELEASE.img
grub> boot
以上幾個完成grub的配置。
如下圖:
如上圖:內核與init的路徑指定與/boot目錄是否被單獨分區有關;
1)如boot單獨分區,同時安裝在第一塊硬盤,那麼可以入上圖填寫;
2)如boot不是單獨分區,前面需要指定boot路徑, 如/boot/...等;
3)如不是第一塊硬盤,或許是(hd#,#);
4)因centos6,7版本 /默認被安裝爲LVM格式,建議boot單獨分區。
舉例:/boot 的分區是 /dev/sda1,或 hd(0,0)。/ 的分區是 /dev/sda2,或hd(0,1),那麼/boot/grub/grub.conf必須如下設置:
title CentOS 6.7 i686 root (hd0,0) kernel /vmlinuz-2.6.32-573.el6.x86_64 ro root=/dev/sda2 initrd /initramfs-2.6.32-573.el6.x86_64.img
5.再看看grub的配置文件/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文件所在設備分區;爲grub的“根”;
kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:啓動的內核
initrd /PATH/TO/INITRAMFS_FILE: 內核匹配的ramfs文件;
password [--md5] STRING: 啓動選定的內核或操作系統時進行認證;
可以使用grub-md5-crypt命令創建密碼。示例:
[root@mageedu ~]# grub-md5-crypt Password: Retype password: $1$LduMa$b.xr5xXjzmcTWx/cpqCXa.
然後將密碼寫在配置文件裏
password --md5$1$LduMa$b.xr5xXjzmcTWx/cpqCXa. 縮進寫入配置文件。
可以對菜單進行編輯認證或者對啓動的內核進行認證設置。
6. 進入grub的單用戶模式可以幫我們修改忘記root之後的密碼,進入的單用戶模式的方法:
(1) 編輯grub菜單(選定要編輯的title,而後使用e命令);
(2) 在選定的kernel後附加,1, s, S或single都可以;
(3) 在kernel所在行,鍵入“b”命令;
7.如果bootloader文件損壞,那麼就只能進入救援模式;或者把硬盤拆下來,放到其他的主機上修復。 如果grub損壞,如何重新安裝grub?
1)尚未關機
模擬破壞情況:
#dd if=/dev/zero of=/dev/sda bs=200 coun1=1
方法1:grub-install直接修復安裝,可以安裝grub的三個階段,如圖:
注意:此種方式不要求指定的根下有boot目錄,或者有grub目錄,會自動創建
方法2:使用grub命令提示符進行修復
注意:此種要求必須要指定的root的設備上必要有一個grub目錄。stage1,stage1.5 stage2都必須存在纔可以,不然無法安裝成功。
2)第二種情況,bootloader損壞,並且已經重啓主機,主機無法啓動,此時需要進入救援模式進行修復。
如下圖,重啓之後,界面無法引導,
一)此時需要使用光盤鏡像引導。
二)選擇救援模式:
1)使用圖像界面,上下移動選擇Rescue install sysytem,進入救援模式
二)按Esc鍵,命令行模式下,看到boot 輸入:linux rescue 回車
三)通過救援模式bash切換到根文件系統,通過grub-install進行修復
各種設置
#####選擇語言設置:
##### 鍵盤設置:
#####是否啓用網絡(不需要,則No,如果選擇了Yes將要求選擇獲取IP地址的方式)
##### 正式進入救援模式,並且嘗試原有的環境,並將其根掛到在/mnt/sysimage目錄下
##### 如何切換到原系統:
##### 開啓一個shell:
(四)救援模式下的操作
##### 進入shell,切換至磁盤上的文件系統根目錄
##### 切換到已經找到的根文件系統上,使用grub-install 修復grub
####reboot重啓系統,檢測修復情況
可見修復成功!
8.關於新版grub2
新版的grub-install命令指定安裝目錄時不再使用--root-directory選項,改爲 --boot-directory選項,安裝文件不是安裝在指定目錄的/boot/grub下,而是安裝在指定目錄的/grub下,具體用法爲:
grub-install --boot-directory=DIR Install-Device
舉個例子說明,如果 /boot分區爲 sda7,/ 分區爲sda8,在使用救援模式修復grub2到mbr時使用的命令爲:
# 如果是以前的grub2,必須先掛載系統的 / 分區,再把系統的 /boot分區掛載到系統 / 分區下 mount /sda8 /mnt mount /sda7 /mnt/boot grub-install --boot-directory=/mnt/boot /dev/sda # 而對於只有 / 分區(假設爲 /dev/sda7) ,沒有 /boot單獨分區的,使用命令爲 mount /dev/sda7 /mnt grub-install --boot-directory=/mnt/boot /dev/sda