grub

grub 0.x: grub legacy
grub 1.x: grub2

GRUB 引導代碼詳解:http://thestarman.pcministry.com/asm/mbr/GRUB.htm
https://wiki.archlinux.org/index.php/GRUB_Legacy_(簡體中文)
Grub2 GPT 分區相關:https://wiki.archlinux.org/index.php/GRUB_(簡體中文)

GRUB legacy 不支持 GPT 硬盤,Btrfs 文件系統和 UEFI 固件

BIOS boot partition is only necessary on GPT partitioned disks. For MBR partitioned disks, the GRUB 2 core.img goes into the MBR gap, the same as before

1.原理

Grub 共分爲3部分:

• stage 1
開機啓動引導代碼寫入到 MBR 的前446字節中,告知 BIOS 本介質的MBR信息和 stage 1.5引導文件的位置;
如果該部分損壞,則 BIOS 會提示找不到在引導介質中找不到 MBR 分區信息,停止引導;
• stage 1.5
各種文件系統的驅動,BIOS 加載之後就由能力可以在其他BIOS部支持的文件系統中找到 stage 2 部分的文件;
• stage 2
grub的操作系統引導界面以及grub文件列表;

2.引導錯誤修復

Grub錯誤一般都可以通過原理部分來找到對應的解決方法;

只要mbr引導代碼完好,基本上所有的錯誤都可以通過本地解決或者LiveCD兩種方式得到解決;

本地修復:

- "grub rescue> "

此原因是因爲mbr引導代碼完好,但是你的磁盤分區結構發生變化,導致原本寫到引導代碼裏面的程序到其指定的分區
去找grub目錄而沒找到,或者根本就沒有了那個分區,進而只能使用前446字節的引導代碼。

# 察看當前設備
$ grub rescue> ls
# (hd0,1),(hd0,5),(hd0,3),(hd0,2)

# 依次調用如下命令: X表示各個分區號碼
# 如果/boot沒有單獨分區,用以下命令:
$ grub rescue> ls (hd0,X)/boot/grub
# 如果/boot單獨分區,則用下列命令:
$ grub rescue> ls (hd0,X)/grub

正常情況下,會列出來幾百個文件,很多文件的擴展名是.mod和.lst和.img,還有一個文件是grub.cfg。
假設找到(hd0,5)時,顯示了文件夾中的文件,則表示Linux安裝在這個分區。

# 找到了正確的grub目錄,則設法臨時性將grub的兩部分關聯起來,方法如下:
# /boot沒有單獨分區的命令:
$ grub rescue> set root=(hd0,5)
$ grub rescue> set prefix=(hd0,5)/boot/grub
$ grub rescue> insmod /boot/grub/normal.mod

# /boot 單獨分區的命令
$ grub rescue> set root=(hd0,5)
$ grub rescue> set prefix=(hd0,5)/grub
$ grub rescue> insmod /grub/normal.mod

# 然後調用如下命令,就可以顯示出丟失的grub菜單了。
$ grub rescue> normal

看到菜單後,可用的命令就很多了,這時使用方法2引導內核進入到系統。
進入系統後,此時就可以使用修復模式時恢復mbr引導代碼的方法(即方法1),重新寫入新的MBR引導代碼。
此時系統引導修復成功,下次啓動時就會正常。

注:
當使用上面的ls找不到 grub 目錄,則可以嘗試尋找是否有linux核心文件,依次調用如下命令:
# X表示各個分區號碼:
# 如果/boot沒有單獨分區:
$ grub rescue> ls (hd0,X)/boot
# 如果/boot單獨分區,則:
$ grub rescue> ls (hd0,X)

找名字類似與 vmlinuz-3.0.0-12-generic 這樣的文件,這是linux核心文件,如果找到,記下(hd0,X)中的X值。
假設找到(hd0,5)時,顯示了文件夾中的文件。
使用方法1進入到修復模式後,重新寫入新的MBR引導代碼。

- "grub> "

造成該問題的原因在於,要麼 grub.conf 文件丟失,要麼因爲改變的硬盤分區結構而造成 grub.conf 失效
唯一的方法是手動進行內核引導。

# boot 未單獨分區,只有一個根分區sda1
$ grub > root (hd0,0)
# 參數可以使用tab鍵自動補全
# 如果知道根分區的LABEL,可以使用“LABEL=根分區標籤”來代替“root=/dev/sda1”
$ grub > kernel /boot/vmlinuz-2.6.32-358.el6.x86_64 root=/dev/sda1
$ grub > initrd /boot/initramfs-2.6.32-358.el6.x86_64.img
$ grub > boot

# boot 分區爲sda1,根分區爲sda2
$ grub > root (hd0,0)
# 參數可以使用tab鍵自動補全
# 如果知道根分區的LABEL,可以使用“LABEL=根分區標籤”來代替“root=/dev/sda2”
$ grub > kernel /vmlinuz-2.6.32-358.el6.x86_64 root=/dev/sda2
$ grub > initrd /initramfs-2.6.32-358.el6.x86_64.img
$ grub > boot

使用上面符合自己情況的方法進入到系統後,需要做以下兩件事:
1.修正 /etc/fstab 文件,使之符合當前分區結構的實際情況;
2.修正 /boot/grub/grub.conf 文件,使之符合當前分區結構的實際情況;

此時可以正常使用系統,當下次系統重啓時,會正常進入系統。

LiveCD修復:

- RHEL/CentOS

進入修復模式後,如果系統能夠找到硬盤中系統盤所在分區,就會將其自動掛載到/mnt/sysimage
如果系統找不到,可以進入shell手動掛載到/mnt/sysimage上。


• chroot 方式:
# 掛載完成後,使用chroot進入到硬盤系統環境:
$ chroot /mnt/sysimage
# 如果/boot單獨分區,請將其掛載到根分區的/boot下
# 安裝grub引導代碼到sda
$ grub-install /dev/sda

• grub shell 方式:
# 假設boot單獨分區sda1
$ grub> root (hd0,0)
$ grub> setup (hd0)
$ grub> reboot

# 假設只有一個根分區sda1,boot未單獨分區
$ grub> root (hd0,0)
$ grub> setup (hd0)
$ grub> reboot

成功後退出硬盤系統環境,接着重啓系統即可。

- Ubuntu/Debian

3.引導其他介質

- Ubuntu mini.iso

——————————————————————————————————————————————————————————————
find --set-root /mini.iso
map --mem --heads=0 --sectors-per-track=0 /mini.iso (0xff)
map --hook
chainloader (0xff)
boot
——————————————————————————————————————————————————————————————

- Ubuntu ISO 鏡像

——————————————————————————————————————————————————————————————
menuentry "Kubuntu 15.04 ISO" {
set isofile="/home/maketecheasier/TempISOs/kubuntu-15.04-desktop-amd64.iso"
loopback loop (hd0,1)$isofile
echo "Starting $isofile..."
linux (loop)/casper/vmlinuz.efi boot=casper iso-scan/filename=${isofile} quiet splash
initrd (loop)/casper/initrd.lz
}
——————————————————————————————————————————————————————————————
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章