GRUB應用
GRUB:全稱為GNU GRUB,是一個來自GNU項目的啟動引導程式。
GRUB是多啟動規範的實作,它允許使用者可以在計算機内同時擁有多個作業系統,并在計算機系統啟動時選擇希望運作的作業系統。
GRUB可用于選擇作業系統分區上的不同核心,也可用于向這些核心傳遞啟動參數。
GRUB:GRand Unified Bootloader。重要的、标準的啟動加載器;
主要用于類Unix系統;Solaris在X86系統上也采用GNU GRUB作為啟動器;
GRUB特性:
1、GRUB可動态配置;它在啟動時加載配置資訊,并允許在啟動時修改,如選擇不同的核心和initrd。為此目的,GRUB提供了一個簡單的類似Bash的指令行界面,它允許使用者編寫新的啟動順序。
2、GRUB非常輕便。它支援多種可執行格式;它除了可适用于支援多啟動的作業系統外,還通過鍊式啟動功能支援諸如Windows和OS/2之類的不支援多啟動的作業系統。GRUB支援所有的Unix檔案系統,也支援Windows适用的FAT和NTFS檔案系統,還支援LBA模式。GRUB允許使用者檢視它支援的檔案系統裡檔案的内容。
3、GRUB具有多種使用者界面。多數Linux發行版利用GRUB對圖形界面的支援,提供了定制的帶有背景圖案的啟動菜單,有時也支援滑鼠。通過對GRUB的文字界面的設定,可以通過序列槽實作遠端終端啟動。
4、GRUB可以從網絡上下載下傳作業系統鏡像,是以可以支援無盤系統。GRUB支援在啟動作業系統前解壓它的鏡像。
5、與其它啟動器不同,GRUB可以通過GRUB提示符直接與使用者進行互動。載入作業系統前,在GRUB文本模式螢幕下鍵入c鍵可以進入GRUB指令行。在沒有作業系統或者有作業系統而沒有"menu.lst"檔案的系統上,同樣可以進入GRUB提示符。通過類似bash的指令,GRUB提示符允許使用者手工啟動任何作業系統。把合适的指令記錄在"menu.lst"檔案裡,可以自動啟動一個作業系統。
6、GRUB擁有豐富的終端指令,在指令行下使用這些指令,使用者可以檢視硬碟分區的細節,修改分區設定,臨時重新映射磁盤順序,從任何使用者定義的配置檔案啟動,以及檢視GRUB所支援的檔案系統上的其它啟動器的配置。是以,即便不知道一台電腦上安裝了什麼,也可以從外部裝置啟動一個作業系統。
7、GRUB采用滾動螢幕選擇想要啟動的作業系統。通過向"menu.lst"檔案中添加相關資訊,GRUB可以控制150或者更多的啟動選項,在啟動時用方向鍵進行選擇。
8、通過鍊式啟動,一個啟動器可以啟動另一個啟動器。GRUB通過2到3行的指令就可以從DOS、Windows、Linux、BSD和Solaris系統啟動。
9、盡管GRUB為類Unix系統進行了編譯和打包,但也有供DOS和Windows使用的GRUB。GRUB也可以不附帶任何作業系統而作為孤立系統安裝。從CD上啟動時運用GRUB需要1個檔案,而從軟碟、硬碟和USB裝置上啟動時需要2個檔案。這些檔案可以在任何支援GRUB的Linux CD上找到,使用者可以很容易的找到它們。
GRUB是Bootloader程式中的一種,位于硬碟0磁道0扇區MBR記錄中的前446位元組中;
GRUB的版本:
GRUB 第一版本:
GRUB的步驟1包含在MBR中。由于受MBR的大小限制,步驟一所做的幾乎隻是裝載GRUB的下一步驟(存放在硬碟的其它位置)。步驟1既可以直接裝載步驟2,也可以裝載步驟1.5:GRUB的步驟1.5包含在MBR後面的30千位元組中。步驟1.5載入步驟2。
當步驟2啟動後,它将呈現一個界面來讓使用者選擇啟動的作業系統。這步通常采用的是圖形菜單的形式,如果圖形方式不可用或者使用者需要更進階的控制,可以使用GRUB的指令行提示,通過它,使用者可以手工指定啟動參數。GRUB還可以設定逾時後自動從某一個核心啟動。
GRUB第二版本:
一、特性:
GRUB2和grub有很多不同的地方:
1、圖形接口;
2、使用了子產品機制,通過動态加載需要的子產品來擴充功能;
3、支援腳本語言,例如條件判斷、循環、變量和函數;
4、支援rescue模式,可用于系統無法引導的情況;
5、國際化語言。包括支援非ASCII碼的字元集和類似gettext的消息分類,字型,圖形控制台等等;
6、有一個靈活的指令行接口。如果沒有配置檔案存在,GRUB會自動進入指令模式;
7、針對檔案系統、檔案、裝置、驅動、終端、指令、分區表、OS loader的子產品化、階層化、基于對象的架構;
8、支援多種檔案系統格式;
9、可通路已經安裝的裝置上的資料;
10、支援自動解壓;
二、裝置的命名:
grub2同樣以fd表示軟碟,hd表示硬碟(包含IDE和SCSI)。裝置是從0開始編号,分區則是從1開始,主分區從1-4,邏輯分區從5開始,而grub分區編号是從0開始的;
例如:
(fd0):表示整個軟碟;
(hd0,1):表示BIOS中的第一個硬碟的第1個分區;
(hd0,5)/boot/vmlinuz:表示BIOS中的第一個硬碟的第一個邏輯分區下的boot目錄下的vmlinuz檔案;
GRUB啟動後:
一旦選擇了啟動選項,GRUB把選擇的核心載入記憶體并把控制交給核心。在此步驟中,對于Windows之類不支援多啟動标準的作業系統,GRUB也可以通過鍊式啟動把控制傳給其它啟動器。在這種情況下,其它作業系統的啟動程式被GRUB儲存了下來;與核心不同,其它作業系統如同直接自MBR啟動。類似Windows的啟動菜單,也許是另一個啟動管理器,它允許在多個不支援多啟動的作業系統中做進一步的選擇。
GRUB安裝:
GRUB的一個重要的特性是安裝它不需依附一個作業系統;但是,這種安裝需要一個Linux副本。由于單獨工作,GRUB實質上是一個微型系統,通過鍊式啟動的方式,它可以啟動所有安裝的主流作業系統。與LILO不同,修改GRUB的配置檔案後,不必把GRUB重新安裝到MBR或者某個分區中。
在Linux中,"grub-install"指令是用來把GRUB的步驟1安裝到MBR或者分區中的。GRUB的配置檔案、步驟2以及其它檔案必須安裝到某個可用的分區中。如果這些檔案或者分區不可用,步驟1将把使用者留在指令行界面。
1、安裝完系統後,grub預設安裝在第一硬碟(hd0)的MBR,其實就是把引導檔案boot.img寫入硬碟的MBR;使用者也可以選擇不寫入硬碟MBR而是寫入Linux分區的引導扇區。啟動時根據MBR所提供資訊找到啟動分區後,加載分區内的GRUB核心檔案core.img和配置檔案grub.conf,進入選擇菜單頁面;在菜單畫面,按上下鍵選擇要需要的系統菜單項;
2、grub的配置檔案:/boot/grub/grub.conf 《==== /etc/grub.conf
[root@localhost grub]# ls -l grub.conf
-rw-------. 1 root root 815 Jul 27 19:56 grub.conf
[root@localhost grub]# ls -l /etc/grub.conf
lrwxrwxrwx. 1 root root 22 Jul 27 19:56 /etc/grub.conf -> ../boot/grub/grub.conf
stage2及核心等通常放置于一個基本磁盤分區;
功用:
(1) 提供菜單、并提供互動式接口
e: 編輯模式,用于編輯菜單;
c: 指令模式,互動式接口;
(2) 加載使用者選擇的核心或作業系統
允許傳遞參數給核心
可隐藏此菜單
(3) 為菜單提供了保護機制
為編輯菜單進行認證
為啟用核心或作業系統進行認證

grub的指令行接口
help: 擷取幫助清單
help KEYWORD: 詳細幫助資訊
find (hd#,#)/PATH/TO/SOMEFILE:可以查找檔案;
root (hd#,#)指定根;
kernel /PATH/TO/KERNEL_FILE: 設定本次啟動時用到的核心檔案;額外還可以添加許多核心支援使用的cmdline參數;
例如:init=/path/to/init, selinux=0
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.conf後,将原檔案删除;通過編輯模式和指令行模式分别啟動系統;
- 備份檔案:
[root@localhost ~]# cp /boot/grub/grub.conf /root/
[root@localhost ~]# ls /root/grub.conf -l
-rw-------. 1 root root 815 Sep 3 14:44 /root/grub.conf
2、删除檔案;
[root@localhost ~]# rm -f /boot/grub/grub.conf
[root@localhost ~]# ls /boot/grub/grub.conf
ls: cannot access /boot/grub/grub.conf: No such file or directory
- 系統重新開機進入GRUB指令行模式:
GRUB應用
grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE quiet
便可以正常啟動系統;
配置檔案:/boot/grub/grub.conf
配置項:
default=#: 設定預設啟動的菜單項;落單項(title)編号從0開始;
timeout=#:指定菜單項等待選項選擇的時長;
splashp_w_picpath=(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指令為GRUB程式添加菜單編輯認證時的指令和啟動標明的核心時認證的指令;
編輯需要密碼;
啟動也需要密碼;
測試:通過編輯grub菜單進入單使用者模式,進而修改root密碼;
1) 編輯grub菜單(標明要編輯的title,而後使用e指令);
(2) 在標明的kernel後附加
1, s, S或single都可以;
(3) 在kernel所在行,鍵入“b”指令
(4) 無需登入直接進入shell,使用passwd指令修改密碼;
安裝grub:
(1) grub-install
grub-install --root-directory=ROOT /dev/DISK
測試:通過在現有系統上添加一塊硬碟,在其上安裝grub,并通過将本機核心及應用程式複制到新添硬碟的方式使新硬碟能獨立啟動?
1、添加新硬碟并分區;
[root@localhost~]# fdisk -l /dev/sdb
Disk/dev/sdb: 21.5 GB, 21474836480 bytes
255heads, 63 sectors/track, 2610 cylinders
Units =cylinders of 16065 * 512 = 8225280 bytes
Sectorsize (logical/physical): 512 bytes / 512 bytes
I/O size(minimum/optimal): 512 bytes / 512 bytes
Diskidentifier: 0xf4aa5725
DeviceBoot Start End Blocks Id System
/dev/sdb1 1 14 112423+ 83 Linux
/dev/sdb2 15 276 2104515 82 Linux swap / Solaris
/dev/sdb3 277 930 5253255 83 Linux
2、格式化分區,1,3為ext4, 2為swap;
[root@localhost~]# mke2fs -t ext4 /dev/sdb1
[root@localhost~]# mke2fs -t ext4 /dev/sdb3
[root@localhost~]# mkswap /dev/sdb2
3、建立挂載目錄,并挂載sdb1到該目錄下;
[root@localhost~]# mkdir /mnt/boot
[root@localhost~]# mount /dev/sdb1 /mnt/boot/
[root@localhost~]# ls /mnt/boot/
lost+found
[root@localhost ~]#
4、安裝grub至新硬碟的基本檔案系統上,使用grub-install, grub-install會自動尋找boot目錄,指定根目錄時至需指定到boot目錄的上一級目錄即可;
[root@localhost~]# grub-install --root-directory=/mnt /dev/sdb
Probingdevices to guess BIOS drives. This may take a long time.
Installationfinished. No error reported.
This isthe contents of the device map /mnt/boot/grub/device.map.
Check ifthis is correct or not. If any of the lines is incorrect,
fix itand re-run the script `grub-install'.
(fd0) /dev/fd0
(hd0)/dev/sda
(hd1)/dev/sdb
[root@localhost ~]# ls /mnt/boot/
grub lost+found #安裝成功;
安裝不能生成grub.conf配置檔案,需要手工書寫;
5、複制核心、initranfs至新硬碟boot目錄;
[root@localhost~]# cp /boot/vmlinuz-2.6.32-504.el6.i686 /mnt/boot/vmlinuz
[root@localhost~]# cp /boot/initramfs-2.6.32-504.el6.i686.img /mnt/boot/initramfs.img
6、建立配置檔案grub.conf
default=0
timeout=5
titleKaLaguiyin's System(TEST)
root (hd0,0)
kernel /vmlinuz ro root=/dev/sda3 init=/bin/bash
initrd/initramfs.img
7、為新硬碟的根分區建立常用的一級子目錄:
[root@localhost~]# mkdir /mnt/sysroot
[root@localhost~]# mount /dev/sdb3 /mnt/sysroot/
[root@localhost~]# cd /mnt/sysroot/
[root@localhostsysroot]# ls
lost+found
[root@localhostsysroot]# mkdir -pv etc bin sbin lib lib64 dev proc sys tmp var usr home rootmnt media
8、複制bash程式到新硬碟的對應目錄下;
[root@localhostsysroot]# cp /bin/bash /mnt/sysroot/bin/
在複制完bash後也需要将bash所依賴的動态庫複制到對應目錄下;
檢視二進制程式所依賴的動态庫使用ldd指令:
[root@localhost sysroot]# ldd /bin/bash
linux-gate.so.1 => (0x00d19000)
libtinfo.so.5 => /lib/libtinfo.so.5(0x0037d000)
libdl.so.2 => /lib/libdl.so.2 (0x00994000)
libc.so.6 => /lib/libc.so.6 (0x0014e000)
/lib/ld-linux.so.2(0x00fc0000)
複制bash所依賴的動态庫:
[root@localhostsysroot]# cp /lib/libtinfo.so.5 /mnt/sysroot/lib/
[root@localhostsysroot]# cp /lib/libdl.so.2 /mnt/sysroot/lib/
[root@localhostsysroot]# cp /lib/libc.so.6 /mnt/sysroot/lib
[root@localhostsysroot]# cp /lib/ld-linux.so.2 /mnt/sysroot/lib
9、切換根,并測試bash是否可用:
[root@localhostsysroot]# chroot /mnt/sysroot/
bash-4.1#ls
bash:ls: command not found
bash-4.1#cd
bash-4.1#
10、 再次修改grub.conf檔案,在kernel行末加上: init=/bin/bash
11、 找到磁盤檔案,将其作為建立虛拟機的硬碟使用;
12、建立虛拟機,使用已有硬碟!
此時啟動将會失敗,因為核心預設啟用了selinux,故需要通過grub編輯模式在選擇init之前輸入selinux=0,啟動将順利進行,啟動完畢後直接可以使用bash;
13、若想使用其他程式,請按照bash的方式進行;此處不再一一說明;
思路:在使用過程中若不小心破壞了硬碟的前446個位元組,即bootloader的存放位置中的資料,在未重新開機的情況下可以使用以下兩種方式恢複GRUB:
1、grub-install - -root-directory=/ /dev/sda 重新安裝grub,指定根和硬碟;
2、使用grub指令,進入grub指令模式:
grub>setup(hd0) #指定硬碟即可恢複grub;
若grub損毀後已重新開機,且系統無法啟動時,也可以使用Linux啟動媒體進入救援模式,使用上述方法恢複,但在安裝時注意安裝路徑問題!
參考資料:
維基百科:GNU GRUB
https://zh.wikipedia.org/wiki/GNU_GRUB
grub2基礎教程: