個人心情和 Linux / FreeBSD 等技術

2008/10/07

雙系統所遇到的GRUB開機問題

先說明一下我的環境,兩顆硬碟,在BIOS底下的資訊

Primary Master 是 ST380013A 我安裝的是 Windows XP

Professional , 而 Primary Slave 是HDT722516DLAT80,

這個是安裝Debian。


== == == == == == == == == ==我是分隔線 == == =


在Debian安裝過程最後會需要選擇安裝 GRUB , 由於之前安裝

ETCH 的經驗是把GRUB安裝在 Primary Master 之上,也就是寫入

XP 那顆硬碟的 MBR中,這樣子做的好處是方便我辨識硬碟!

因為 GRUB 和 Linux 在裝置檔的辨識上是不一樣的, 先說說大家

熟悉的 Linux,Primary Master 會辨識成 /dev/hda , Primary Slave

則是 /dev/hdb在正常以 Primary Master (xp) 開機的情況底下,

GRUB會將第一個搜尋到的硬碟辨識為 /dev/hd0,這裡會暫時得

到一個結論 /dev/hda 對應到的是 /dev/hd0

ps.{這裡就很容易造成一般User的混亂,以為 /dev/hda就是對應

成/dev/hd0 ,而 /dev/hdb就是對應成 /dev/hd1, 但是實際上

GRUB的開機代號。}
和排線上的Master 、 Slave (Linux上 /dev/hda

、/dev/hdb)沒有任何關



而且我將 GRUB 安裝在 /dev/hda 的 MBR 這麼作有個缺點,就是

1、我一定要在BIOS選擇以 Primary Master 開機;

2、而且 Master和 Slave 兩顆硬碟缺一不可


當我把 Master (Windows) 拔下來時,Slave 會因為 MBR 的消失無

法把開機程序轉交給 GRUB 這個 boot loader造成我的linux無法開機

;反之把 Slave (Linux)拔下來時,GRUB這個 boot loader 的消失也

無法把開機程序轉交給 Windows loader來執行換成我的 XP不能開機。

PS.關於 linux x86 的開機流程可參考此網頁


由於我的主機板可以從 BIOS 調整從 Primary Master 或是 Primary

Slave 開機,所以相較於之前硬碟缺一不可的不便利(我偶而會拆

卸硬碟),這次安裝Lenny 的時候我決定將 MBR 安裝在 Slave 的

MBR 中,以後就用 Slave 上的 GRUB 來決定開進 Linux 還是

Windows。所以我的 Slave 變成 了開機硬碟 。這樣子也

解決了我之前硬碟缺一不可的窘境。



由於 Linux將 Slave 視為 /dev/hdb ,所以在預設情況下安裝的 GRUB 寫入

menu.lst 設定如下
title           Debian GNU/Linux, kernel 2.6.26-1-686
root (hd1,0)
kernel /vmlinuz-2.6.26-1-686 root=/dev/hdb3 ro
initrd /initrd.img-2.6.26-1-686


title Debian GNU/Linux, kernel 2.6.26-1-686 (single-user mode)
root (hd1,0)
kernel /vmlinuz-2.6.26-1-686 root=/dev/hdb3 ro single
initrd /initrd.img-2.6.26-1-686


注意到了 (hd1,0) 在 GRUB的解釋下是第二個找到的硬碟

(開機 Slave 的是第一個找到的,應該是 (hd0,0)才對),

所以Lenny一開始安裝完重開後馬上就會出現錯誤訊息無法開

進系統,當然這個時候只要在錯誤的那行按 「e」編輯成 (hd0,0)

再按 「b」即可正常的開機,再進入 /boot/grub/menu.lst

編輯存檔即可。

os.不知道為什麼會出現這種奇妙的小錯誤。



順便將 Windows 的部份修正如下
title Microsoft Windows XP Professional
root (hd1,0)
savedefault
makeactive
chainloader +1

但光是上面這樣還不足以正常的開入 Windows XP , 在

GRUB的 0.97 Manual提到:

If you have installed DOS (or Windows) on a non-first hard disk, you have to use the

disk swapping technique, because that OS cannot boot from any disks but the first one.

The workaround used in GRUB is the command map (see map), like this:

grub> map (hd0) (hd1)
grub> map (hd1) (hd0)


所以請利用 disk swapping的技術吧! 正確的設定如下

title Microsoft Windows XP Professional
map (hd0) (hd1)
map (hd1) (hd0)
root (hd1,0)
savedefault
makeactive
chainloader +1


這樣子就能以 Slave 當成開機硬碟又能順利開啟 Windows囉。
2008/10/9 update: 以 aptitude 更新至新的 kernel 後也會發生 menu.lst
被修改錯誤的狀況。

參考文件
GRUB 0.97 Manual

沒有留言: