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> root (hd#,#)
grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE quiet
grub> initrd /initramfs-VERSION-RELEASE.img
grub> boot
便可以正常啓動系統;
配置文件:/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
http://xstarcd.github.io/wiki/files/grub2_BasicTutorial.pdf
PS:小弟現在也是正在學習階段,所以請各位大神勿噴!Thanks!