grub教學

看板Linux作者 (zxvc)時間18年前 (2006/07/25 23:25), 編輯推噓5(500)
留言5則, 5人參與, 最新討論串1/1
如果有多台硬碟,我通常會建議把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
文章代碼(AID): #14nZVkcS (Linux)
文章代碼(AID): #14nZVkcS (Linux)