[轉貼] GRUB 運作原理

: 如果有多台硬碟,我通常會建議把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
: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
: 這樣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
: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
: 還有一個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來管理裝置檔。
: (不刪掉應該也不會有什麼問題)
: (如有錯誤,歡迎指正)
推 好文一個
看我這篇文章的時候請先把上面的好文看玩
GRUB視一套開機管理程式
在此並不針對GRUB做詳細說明 因為上面講解的比我還要詳細許多

來說說今天發生的一件慘事
就是某位RD把GRUB安裝在/dev/hda1
(經由確認 電腦的XP是安裝在hda1 且為NTFS磁區 )
正常的情況下GRUB 都是裝在/dev/hda 即所謂MBR 或者是LINUX的BOOT磁區的第一軌
又或者是BOOT硬碟的第一個主要分割區

但是今天 他卻把GRUB裝在NTFS分割磁區的第一軌 而且那個磁區已經要資料在

這就發生了慘事 不但XP開不了機 連NFFS分割區上面的資料全毀

這個時候就會有人說 找硬碟救援軟體 如 FINALDATA EASYRECOVERY R-STUDIO
去救資料 這也行 因為它是刞ㄧ個SECTOR一個SECTOR去做掃描 來讀取 有人會問了
既然是把第一軌毀掉 那總可以重建八
是的 MFT可以重建 因為當初在設計NTFS 這個檔案系統的時候
就想過分割區的第一軌有可能會被病毒修改 而開不了機或者是
下面先列出位於 http://www.ntfs.com/ 的 一段話

How can we fix NTFS boot sector using standard Windows NT/2000/XP tools?

On NTFS copy of boot sector is stored at the middle or at the end of the Volume.

You can boot from startup floppy disks or CD-ROM, choose repair option during
setup, and run Recovery Console. When you are logged on, you can run FIXBOOT
command to try to fix boot sector

翻譯就是NTFS磁區的 Boot Sector 也放了一份複本在中間鬼與最後一軌
所以只需要把XP或是2000的安裝光碟放入 然後選擇修復主控台模式 打入FIXBOOT即可修復

哈 都是GRUB惹的禍

虹光大成就-密教灌頂(一)