如果有多台硬碟,我通常會建議把grub優先灌在IDE硬碟上的MBR。為什麼?
先解釋一些東西。『MBR』是什麼?
MBR就是每台硬碟第一個磁區(Sector,它的大小是512bytes)。
當我們一啟動電腦,BIOS作完一些基本的測試、初始化之後,
就會查詢你之前所設定的開機順序,
從開機順序決定要去哪個裝置讀取程式來載入作業系統。
比如說今天設定從一台硬碟機啟動,那麼BIOS就會去讀取這台硬碟上的第一個磁區,
也就是所謂的MBR。MBR裡通常存放者一些多重開機程式,例如grub、SPFdisk。
這些多重開機程式可以去硬碟上『裝有作業系統』的
『不同的分割區』上的第一個磁區(稱作boot sector,不要與MBR搞混)
啟動作業系統核心loader(例如:Windows XP的NT kernel loader)。
作業系統核心被成功啟動後,就可以使用作業系統了。
至於Linux的核心的loader就是grub。grub不能啟動Windows的kernel,
所以必須要去分割區上的第一個磁區找到Windows kernel的loader。
所以grub中會有一個指令叫作『chainloader +1』
就是去讀取一個Partition(分割區)的boot sector,
那個『+1』代表該Partiton的第一個Sector,『+2』代表第二個Sector、...依此類推。
但grub是一個功能強大的多重開機程式,
根本不可能把那麼多功能塞在一個512bytes的MBR上。
所以這個程式被切割成幾個部份:Stage 1、Stage 1.5、Stage 2。
這三個檔案可以在/boot/grub/底下找到。
Stage1大小為512bytes,所以剛好可以存在MBR上。
當電腦一開機,BIOS啟動MBR上的grub Stage1,Stage 1會去啟動硬碟上的Stage 1.5。
可是有一個問題出現了,Stage 1是如何找到Stage 1.5的?
Stage 1只有區區的512bytes,是沒有多餘的能力可以操縱分割區上的檔案系統,
所以沒有辦法用這個方法找到Stage 1.5。
而Stage 1其實是用一個方法找到Stage 1.5的檔案,就是當初在安裝grub到MBR時
Stage 1.5所在硬碟上的那一個磁區的位置會被紀錄到MBR中,
所以Stage 1就會去指定的磁區位置找到Stage 1.5執行它。
那麼Stage 1.5是作什麼用的呢?Stage 1.5有很多個檔案,
分別是用來處理檔案系統(File System)用的。
像『fat_stage1_5』就是用來處理FAT Partition上面的檔案用的、
『e2fs_stage1_5』是用來處理Ext2、3的檔案系統用的。
所以grub到了Stage 1.5就可以由File System處理許多Partition上的檔案。
那麼接下來Stage 1.5會去啟動Stage 2。
Stage 2就是grub的主要核心,幾乎大部分的功能都在裡面。
可是又有一個問題出現了,Stage 1.5是如何找到Stage 2的?
答案是:因為Stage 1.5已經可以辨識Partition上的File System,
所以自然有辦法找到Stage 2的檔案。
Stage 2啟動後會去讀取menu.lst,然後grub的開機選單就呈獻在我們眼前。
還有一件事要注意的,就是我們開機啟動grub後,
grub會對電腦上的每一台硬碟機命名。
BIOS一開機時會在主記憶體初使化BIOS中斷服務(BIOS interrupts)。
grub似乎是從BIOS的中斷服務得知電腦上的硬碟數量。
可是BIOS對每台硬碟機給的排序有一個特色(這一句話我不是很肯定),
就是可以用來開機的那一個硬碟機比較特殊,都是『第一個』硬碟機。
不管是用SATA、IDE、USB或SCSI硬碟開機,那一台硬碟就是『第一個』硬碟機。
其餘的硬碟機分別會依
Primary IDE Master→Primary IDE Slave→Secondary IDE Master→
Secondary IDE Slave→SCSI、USB或SATA
作排序。如果該插槽的硬碟機不存在就跳過排序。(光碟機不算在內)
然後grub會依照BIOS所給定的排序,分別給每一台硬碟機一個名稱--BIOS drive。
這個名稱的命名是從數字『0』開始
(據說grub 2會改成從『1』開始。Partition的命名也是從『0』開始。),
第一台硬碟機就命名為『hd0』、第二台硬碟機就命名為『hd1』、
第三台『hd2』、...依此類推。
例如以下組合:
[1] (『Primary IDE Slave HDD with grub』 + 『SATA HDD』),
從『Primary IDE Slave HDD with grub』開機
→ 『Primary IDE Slave HDD with grub=hd0』,『SATA HDD=hd1』
[2] (『Primary IDE Master HDD』 + 『SATA HDD with grub』),
從『SATA HDD with grub』開機
→ 『Primary IDE Slave HDD=hd1』,『SATA HDD with grub=hd0』
[3] (『Primary IDE Master HDD』 + 『Secondary IDE Master CDROM』 +
『Secondary IDE Slave HDD with grub』),
從『Secondary IDE Slave HDD with grub』開機 → 『Primary IDE Master HDD=hd1』
,『Secondary IDE Slave HDD with grub=hd0』
現在大概清楚grub的命名原理了吧。
那為什麼我會建議把grub灌到IDE硬碟上呢?
舉個例子:假設我們把Linux、grub灌在一台電腦的IDE HDD上的第3個分割區,
這台電腦還有一台SATA HDD。如果說今天改變主意,我們從IDE HDD啟動Linux,
然後我們在Linux中想把grub灌在SATA HDD上。
我們會執行以下指令:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# grub
>> root (hd0,2)
>> setup (hd1)
>> quit
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
這樣grub Stage1是會被灌到SATA HDD上的MBR沒錯,
可是我們個Stage 1.5與Stage 2卻是在『(hd0)』的硬碟上,
也就是說『Stage 1.5』所在的硬碟hd0上某個磁區的位置會被紀錄到MBR中,
這樣才可以給Stage 1找到。被紀錄到MBR的不是只有Stage 1.5所在的磁區位置,
還有所在的硬碟代號--hd0。
如果現在就重新開機,並調整BIOS為從SATA HDD開機,就會出現失敗。
為什麼?因為之前說過,用來啟動grub的那一台硬碟是第一台硬碟,
本來我們從IDE HDD開機進Linux,那個時候的hd0指的是IDE HDD。
可是灌好grub到SATA HDD後,重新開機、調整BIOS開機順序後,
hd0變為SATA HDD那一台。在開機的時候,
SATA HDD上grub會去找hd0上某一處磁區的Stage 1.5。
可是我們知道Stage 1.5應該是在IDE HDD上才是,
並不存在SATA HDD上,所以會產生錯誤。
諸如此類的問題還有不少,所以我是建議把grub灌在IDE硬碟上。
如果沒有IDE硬碟,就不用擔心這個問題,就把它灌在SATA、SCSI、USB硬碟上。
其實上面的講法不夠好,更一般的說法是:
請按照
Primary IDE Master→Primary IDE Slave→Secondary IDE Master→
Secondary IDE Slave→SATA 1→SATA 2→....
的順序安裝在以上第一個出現的硬碟機上。
不過上面那個失敗的範例也是有解決的方法,
就是手動指定裝置檔對應到BIOS drive。可以使用grub的『device』指令。
指令如下,請自行意會:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# grub
>> device (hd1) /dev/hda
>> device (hd0) /dev/sda
>> root (hd1,2)
>> setup (hd0)
>> quit
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
還有一個grub的問題就是裝置檔的問題。現在許多Linux Distribution使用
udev來管理裝置檔(也就是/dev底下的那些檔案)。
可是udev在Linux核心開機後才會動態製作那些裝置檔,例如/dev/hda、/dev/sda。
我們常用Live CD去救援的時候,在chroot到我們要被救援的Linux partition後,
會發現grub抓不到任何硬碟。這是為什麼?
這是因為似乎grub在作業系統中執行的時候(就是不是在開機的時候執行),
是去/dev底下搜尋硬碟機的。
可是那個被救援的Linux partition的Linux核心並沒有被啟動,udev也沒有正常執行,
所以在chroot後的/dev底下沒有任何有關硬碟的裝置檔,
所以此時grub會找不到任何硬碟機。
解決的方法是用『mknod』這個指令手動創造裝置檔。
例如:
# mknod /dev/hdc b 22 0
是用來創造hdc這個裝置檔到/dev底下。
那個『22』不是亂打的,它可以在Linux kernel Document查到
/usr/src/linux/Documentation/devices.txt
而那個『0』指的就是/dev/hdc本身。
如果要創造/dev/hdc4這個裝置檔,可以用這個指令。
# mknod /dev/hdc4 b 22 4
以下是一些常用的代號:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3 block First MFM, RLL and IDE hard disk/CD-ROM interface
0 = /dev/hda Master: whole disk (or CD-ROM)
64 = /dev/hdb Slave: whole disk (or CD-ROM)
22 block Second IDE hard disk/CD-ROM interface
0 = /dev/hdc Master: whole disk (or CD-ROM)
64 = /dev/hdd Slave: whole disk (or CD-ROM)
8 block SCSI disk devices (0-15)
0 = /dev/sda First SCSI disk whole disk
16 = /dev/sdb Second SCSI disk whole disk
32 = /dev/sdc Third SCSI disk whole disk
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
製作好裝置檔後,再執行grub就可以找到硬碟了。
記得裝完grub後要把手動製作的裝置檔rm掉,讓udev來管理裝置檔。
(不刪掉應該也不會有什麼問題)
(如有錯誤,歡迎指正)
--
《金剛經》
又念過去於五百世,作忍辱仙人,於爾所世,無我相、無人相、無眾生相、無壽者相。
http://web.cc.ncu.edu.tw/~93501025/jg.doc
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.115.218.133
推
07/26 09:00, , 1F
07/26 09:00, 1F
推
07/26 11:03, , 2F
07/26 11:03, 2F
推
07/26 12:43, , 3F
07/26 12:43, 3F
推
07/26 14:33, , 4F
07/26 14:33, 4F
推
01/18 10:01, , 5F
01/18 10:01, 5F
Linux 近期熱門文章
23
129
PTT數位生活區 即時熱門文章