從 MBR boot code (440 bytes) 探索 Ubuntu 無法開機的問題 [論壇 - Ubuntu安裝問題]


正在瀏覽:   1 名遊客


 到底部   前一個主題   下一個主題  [無發表權] 請登錄或者註冊

(1) 2 »


從 MBR boot code (440 bytes) 探索 Ubuntu 無法開機的問題
會員一級
註冊日期:
2015/5/2 16:19
所屬群組:
已註冊使用者
等級: 4
HP : 0 / 75
MP : 9 / 1792
EXP: 3
離線
從 MBR boot code (440 bytes) 探索 Ubuntu 無法開機的問題


前提:我是把 Ubuntu 系統,安裝在 MBR 格式的開機碟。
(請注意:不是 GPT 格式的開機碟)

最近在實體電腦及虛擬機器,安裝了很多次的 Ubuntu 14.04.1 系統。

我習慣用 GParted 先分割好硬碟。(或是在 Ubuntu 安裝程式中,直接手動分割硬碟。)
然後安裝 Ubuntu 系統時,選擇把 grub 安裝在 / 分割區(包含/boot)中。

可是我發現有個奇怪的現象:
有的分割區安裝 Ubuntu 系統後,開機可以啟動系統。
有的分割區安裝 Ubuntu 系統後,開機無法啟動系統。

一開始不知道原因,還以為是 Ubuntu 有 Bug 問題。
後來偶然發現,開機能不能成功啟動系統,似乎與分割區的起始位置有關。
(不能開機的分割區,起始的 CHS 值顯示為 0xFEFFFF)

我開始懷疑,是 MBR boot code (440 bytes) 的問題。

於是我到 Wikipedia 爬文(MBR/VBR):
http://zh.wikipedia.org/zh-tw/MBR
http://en.wikipedia.org/wiki/Master_boot_record
http://en.wikipedia.org/wiki/Volume_boot_record

了解到:
1.傳統 CHS 無法表示大於 8032.5MB 的硬碟(分割區)。
2.這種情形,CHS值通常設為 0xFEFFFF,並加以忽略。

使用 parted (或 GParted 或 Ubuntu 安裝程式)分割硬碟,會在 MBR boot code (440 bytes) 寫入一個迷你的啟動程式。

我懷疑這個迷你的啟動程式,好像只能啟動 CHS 可以表示的分割區。
如果分割區的起始位置大於 8032.5MB 的話,可能就無法正常開機。
(無法引導安裝在分割區中的 grub 程式)

後來我發現 Ubuntu 14.04.1 安裝光碟中,有 syslinux 的 MBR boot code (440 bytes) 可以使用。
/usr/lib/syslinux/mbr.bin

於是我把 syslinux 的 mbr.bin 寫入無法開機的系統碟中:
sudo dd if=/usr/lib/syslinux/mbr.bin of=/dev/sda bs=440 count=1

果然就可以正常開機啟動 Ubuntu 系統了。

初步結論:
parted 的 MBR boot code 無法啟動(起始位置大於 8032.5MB 的分割區)。
syslinux 的 MBR boot code 可以啟動。

可能有人會說,如果一開始安裝 Ubuntu 系統時,選擇把 grub 安裝在 MBR 中,就不會遇到這個問題。
可是我認為功能強大的 grub 實在太肥了,遠遠超過 440 bytes,應該安裝在分割區中比較適合。

而且如果有安裝多重系統,例如安裝 Windows 7 時,MBR boot code (440 bytes) 也會被 Windows 覆蓋。
如果 grub 沒有安裝在 MBR 中的話,就不用擔心修復 grub 的問題。
只要把 syslinux 的 boot code 寫回到 MBR,然後把要啟動的分割區的 Flag 設為 boot 就可以了。


備註一:以上結論是我個人實測後的猜測,如果有不正確的地方,請各位指正。
(畢竟我不知道如何去解讀 MBR boot code 的內容)

備註二:如果有人會解讀 parted 或 syslinux 的 boot code 的話,請教教我!
如果 boot code 的原始碼是用 C 語言寫的話,我會一些。
如果 boot code 的原始碼是用 x86 組合語言寫的話,我不會,放棄。

2015/5/13 2:21
應用擴展 工具箱
回覆: 從 MBR boot code (440 bytes) 探索 Ubuntu 無法開機的問題
會員一級
註冊日期:
2015/5/2 16:19
所屬群組:
已註冊使用者
等級: 4
HP : 0 / 75
MP : 9 / 1792
EXP: 3
離線
## parted 的 MBR boot code 無法啟動以下四個主分割區(CHS=0xFEFFFF)
ubuntu@ubuntu:~$ sudo dd if=/dev/sda bs=512 count=1 2> /dev/null | hexdump -Cv -s 446 -n 64
000001be 80 fe ff ff 83 fe ff ff 00 00 00 01 00 00 00 01 |................|
000001ce 00 fe ff ff 83 fe ff ff 00 00 00 02 00 00 00 02 |................|
000001de 00 fe ff ff 83 fe ff ff 00 00 00 04 00 00 00 04 |................|
000001ee 00 fe ff ff 83 fe ff ff 00 00 00 08 00 00 00 08 |................|
000001fe


## parted 的 MBR boot code 如下:很迷你,功能陽春(CHS定址?),開機失敗無訊息提示。
ubuntu@ubuntu:~$ sudo dd if=/dev/sda bs=440 count=1 2> /dev/null | hexdump -Cv
00000000 fa b8 00 10 8e d0 bc 00 b0 b8 00 00 8e d8 8e c0 |................|
00000010 fb be 00 7c bf 00 06 b9 00 02 f3 a4 ea 21 06 00 |...|.........!..|
00000020 00 be be 07 38 04 75 0b 83 c6 10 81 fe fe 07 75 |....8.u........u|
00000030 f3 eb 16 b4 02 b0 01 bb 00 7c b2 80 8a 74 01 8b |.........|...t..|
00000040 4c 02 cd 13 ea 00 7c 00 00 eb fe 00 00 00 00 00 |L.....|.........|
00000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000100 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000110 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000130 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000150 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000160 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000170 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000001a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000001b0 00 00 00 00 00 00 00 00 |........|
000001b8


## syslinux 的 MBR boot code 如下:很好用,功能完整(LBA定址?),開機失敗有訊息提示。
ubuntu@ubuntu:~$ sudo dd if=/dev/sda bs=440 count=1 2> /dev/null | hexdump -Cv
00000000 33 c0 fa 8e d8 8e d0 bc 00 7c 89 e6 06 57 8e c0 |3........|...W..|
00000010 fb fc bf 00 06 b9 00 01 f3 a5 ea 1f 06 00 00 52 |...............R|
00000020 52 b4 41 bb aa 55 31 c9 30 f6 f9 cd 13 72 13 81 |R.A..U1.0....r..|
00000030 fb 55 aa 75 0d d1 e9 73 09 66 c7 06 8d 06 b4 42 |.U.u...s.f.....B|
00000040 eb 15 5a b4 08 cd 13 83 e1 3f 51 0f b6 c6 40 f7 |..Z......?Q...@.|
00000050 e1 52 50 66 31 c0 66 99 e8 66 00 e8 21 01 4d 69 |.RPf1.f..f..!.Mi|
00000060 73 73 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20 |ssing operating |
00000070 73 79 73 74 65 6d 2e 0d 0a 66 60 66 31 d2 bb 00 |system...f`f1...|
00000080 7c 66 52 66 50 06 53 6a 01 6a 10 89 e6 66 f7 36 ||fRfP.Sj.j...f.6|
00000090 f4 7b c0 e4 06 88 e1 88 c5 92 f6 36 f8 7b 88 c6 |.{.........6.{..|
000000a0 08 e1 41 b8 01 02 8a 16 fa 7b cd 13 8d 64 10 66 |..A......{...d.f|
000000b0 61 c3 e8 c4 ff be be 7d bf be 07 b9 20 00 f3 a5 |a......}.... ...|
000000c0 c3 66 60 89 e5 bb be 07 b9 04 00 31 c0 53 51 f6 |.f`........1.SQ.|
000000d0 07 80 74 03 40 89 de 83 c3 10 e2 f3 48 74 5b 79 |..t.@.......Ht[y|
000000e0 39 59 5b 8a 47 04 3c 0f 74 06 24 7f 3c 05 75 22 |9Y[.G.<.t.$.<.u"|
000000f0 66 8b 47 08 66 8b 56 14 66 01 d0 66 21 d2 75 03 |f.G.f.V.f..f!.u.|
00000100 66 89 c2 e8 ac ff 72 03 e8 b6 ff 66 8b 46 1c e8 |f.....r....f.F..|
00000110 a0 ff 83 c3 10 e2 cc 66 61 c3 e8 62 00 4d 75 6c |.......fa..b.Mul|
00000120 74 69 70 6c 65 20 61 63 74 69 76 65 20 70 61 72 |tiple active par|
00000130 74 69 74 69 6f 6e 73 2e 0d 0a 66 8b 44 08 66 03 |titions...f.D.f.|
00000140 46 1c 66 89 44 08 e8 30 ff 72 13 81 3e fe 7d 55 |F.f.D..0.r..>.}U|
00000150 aa 0f 85 06 ff bc fa 7b 5a 5f 07 fa ff e4 e8 1e |.......{Z_......|
00000160 00 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 |.Operating syste|
00000170 6d 20 6c 6f 61 64 20 65 72 72 6f 72 2e 0d 0a 5e |m load error...^|
00000180 ac b4 0e 8a 3e 62 04 b3 07 cd 10 3c 0a 75 f1 cd |....>b.....<.u..|
00000190 18 f4 eb fd 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000001a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000001b0 00 00 00 00 00 00 00 00 |........|
000001b8

2015/5/13 2:22
應用擴展 工具箱
回覆: 從 MBR boot code (440 bytes) 探索 Ubuntu 無法開機的問題
會員三級
註冊日期:
2012/4/26 9:45
所屬群組:
已註冊使用者
等級: 12
HP : 0 / 293
MP : 62 / 9516
EXP: 72
離線
你可能需要硬碟分割規格的歷史資料,也許可以幫助你釐清CHS的問題。內有CHS、LBA與GPT的容量限制簡介。這跟資料存取範圍上限有關。
如何突破硬碟2.1TB的容量限制

如果你安裝的電腦是屬於舊電腦的話,可能需要檢查BIOS裡硬碟的設定參數,看是設定為CHS mode,還是設定成LBA mode,這有可能有差別。

舊電腦BIOS設定硬碟模式發問範例:
請問電腦BIOS的設定~ - Yahoo!奇摩知識+

設錯了,格式化出來的格式會略有不同 - - 也就是,如果BIOS設CHS mode,而硬碟之前是用LBA mode格式化的,是會出現怪現象的。

2015/5/13 12:05
應用擴展 工具箱
回覆: 從 MBR boot code (440 bytes) 探索 Ubuntu 無法開機的問題
會員五級
註冊日期:
2012/4/22 10:50
所屬群組:
已註冊使用者
等級: 37
HP : 0 / 901
MP : 671 / 29303
EXP: 6
離線
tmpfs 寫到:
可能有人會說,如果一開始安裝 Ubuntu 系統時,選擇把 grub 安裝在 MBR 中,就不會遇到這個問題。
可是我認為功能強大的 grub 實在太肥了,遠遠超過 440 bytes,應該安裝在分割區中比較適合。

而且如果有安裝多重系統,例如安裝 Windows 7 時,MBR boot code (440 bytes) 也會被 Windows 覆蓋。
如果 grub 沒有安裝在 MBR 中的話,就不用擔心修復 grub 的問題。
只要把 syslinux 的 boot code 寫回到 MBR,然後把要啟動的分割區的 Flag 設為 boot 就可以了。



我對上面這段話比較有興趣

尤其下面這一句「grub 實在太肥了,遠遠超過 440 bytes」

tmpfs 寫到:
...略...

可是我認為功能強大的 grub 實在太肥了,遠遠超過 440 bytes,應該安裝在分割區中比較適合。

...略...


我對這部份不懂,所以查了一下「grub 440 byte」,「grub 440 byte wiki

查了幾篇文章

* Arch Wiki (中文) / GRUB / 安裝到440位元組MBR啟動區(Install to 440-byte MBR boot code region)
* Arch Wiki / GRUB / 2.3.1.1 Install to disk
* Community Help Wiki / RestoreUbuntu/XP/Vista/7Bootloader

另外也找了Wikipedia

* Wikipedia (中文) / GNU_GRUB <--這裡面有圖可以參考
* Wikipedia / GNU_GRUB
* Wikipedia/ Master_boot_record

* OS Dev / MRR (x86)



還在閱讀,先貼上來,盼大家來討論,把這個議題的一些概念釐清。
或是對這個議題有深入研究的人,希望可以來解惑一下。

因為這個討論區,我個人感覺,最常問到的兩個問題,
一個就是雙系統開機的問題(跟GRUB有關),
另一個是顯示卡的驅動。

之前討論的「索引」,裡面都是 紀錄一些基本的grub操作,並沒比較去做深入的探討。
剛好趁這個機會,大家來討論釐清一些觀念吧。

另外想到最近「這篇」和「這篇」討論。



## 對照

* Community Help Wiki / RestoreUbuntu/XP/Vista/7Bootloader

這一篇,有你提到的指令「sudo dd if=/usr/lib/syslinux/mbr.bin of=/dev/sda」,在最下方

tmpfs 寫到:

後來我發現 Ubuntu 14.04.1 安裝光碟中,有 syslinux 的 MBR boot code (440 bytes) 可以使用。
/usr/lib/syslinux/mbr.bin

於是我把 syslinux 的 mbr.bin 寫入無法開機的系統碟中:
sudo dd if=/usr/lib/syslinux/mbr.bin of=/dev/sda bs=440 count=1

果然就可以正常開機啟動 Ubuntu 系統了。




以下這段感覺要搭配下面這兩篇來看

* Wikipedia (中文) / GNU_GRUB <--這裡面有圖可以參考
* Community Help Wiki / RestoreUbuntu/XP/Vista/7Bootloader

tmpfs 寫到:

使用 parted (或 GParted 或 Ubuntu 安裝程式)分割硬碟,會在 MBR boot code (440 bytes) 寫入一個迷你的啟動程式。

我懷疑這個迷你的啟動程式,好像只能啟動 CHS 可以表示的分割區。
如果分割區的起始位置大於 8032.5MB 的話,可能就無法正常開機。
(無法引導安裝在分割區中的 grub 程式)

後來我發現 Ubuntu 14.04.1 安裝光碟中,有 syslinux 的 MBR boot code (440 bytes) 可以使用。
/usr/lib/syslinux/mbr.bin

於是我把 syslinux 的 mbr.bin 寫入無法開機的系統碟中:
sudo dd if=/usr/lib/syslinux/mbr.bin of=/dev/sda bs=440 count=1

果然就可以正常開機啟動 Ubuntu 系統了。

初步結論:
parted 的 MBR boot code 無法啟動(起始位置大於 8032.5MB 的分割區)。
syslinux 的 MBR boot code 可以啟動。

可能有人會說,如果一開始安裝 Ubuntu 系統時,選擇把 grub 安裝在 MBR 中,就不會遇到這個問題。
可是我認為功能強大的 grub 實在太肥了,遠遠超過 440 bytes,應該安裝在分割區中比較適合。

而且如果有安裝多重系統,例如安裝 Windows 7 時,MBR boot code (440 bytes) 也會被 Windows 覆蓋。
如果 grub 沒有安裝在 MBR 中的話,就不用擔心修復 grub 的問題。
只要把 syslinux 的 boot code 寫回到 MBR,然後把要啟動的分割區的 Flag 設為 boot 就可以了。




另外針對下面這一段(擷取上面的),也查了一下「parted」,「parted wiki

* Wikipedia / GNU_Parted
* Wikipedia 中文 / GNU_Parted
* Arch Wiki / GNU_Parted
* 使用 parted處理磁碟分割
* 鳥哥的 Linux 私房菜 / 第八章、Linux 磁碟與檔案系統管理 / 利用 GNU 的 parted 進行分割行為

tmpfs 寫到:

...略...

使用 parted (或 GParted 或 Ubuntu 安裝程式)分割硬碟,會在 MBR boot code (440 bytes) 寫入一個迷你的啟動程式。

...略...

初步結論:
parted 的 MBR boot code 無法啟動(起始位置大於 8032.5MB 的分割區)。
syslinux 的 MBR boot code 可以啟動。

...略...



加上你二樓的測試

tmpfs 寫到:
## parted 的 MBR boot code 無法啟動以下四個主分割區(CHS=0xFEFFFF)
ubuntu@ubuntu:~$ sudo dd if=/dev/sda bs=512 count=1 2> /dev/null | hexdump -Cv -s 446 -n 64
000001be 80 fe ff ff 83 fe ff ff 00 00 00 01 00 00 00 01 |................|
000001ce 00 fe ff ff 83 fe ff ff 00 00 00 02 00 00 00 02 |................|
000001de 00 fe ff ff 83 fe ff ff 00 00 00 04 00 00 00 04 |................|
000001ee 00 fe ff ff 83 fe ff ff 00 00 00 08 00 00 00 08 |................|
000001fe


## parted 的 MBR boot code 如下:很迷你,功能陽春(CHS定址?),開機失敗無訊息提示。
ubuntu@ubuntu:~$ sudo dd if=/dev/sda bs=440 count=1 2> /dev/null | hexdump -Cv
00000000 fa b8 00 10 8e d0 bc 00 b0 b8 00 00 8e d8 8e c0 |................|
00000010 fb be 00 7c bf 00 06 b9 00 02 f3 a4 ea 21 06 00 |...|.........!..|
00000020 00 be be 07 38 04 75 0b 83 c6 10 81 fe fe 07 75 |....8.u........u|
00000030 f3 eb 16 b4 02 b0 01 bb 00 7c b2 80 8a 74 01 8b |.........|...t..|
00000040 4c 02 cd 13 ea 00 7c 00 00 eb fe 00 00 00 00 00 |L.....|.........|
00000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000100 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000110 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000130 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000150 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000160 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000170 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000001a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000001b0 00 00 00 00 00 00 00 00 |........|
000001b8


## syslinux 的 MBR boot code 如下:很好用,功能完整(LBA定址?),開機失敗有訊息提示。
ubuntu@ubuntu:~$ sudo dd if=/dev/sda bs=440 count=1 2> /dev/null | hexdump -Cv
00000000 33 c0 fa 8e d8 8e d0 bc 00 7c 89 e6 06 57 8e c0 |3........|...W..|
00000010 fb fc bf 00 06 b9 00 01 f3 a5 ea 1f 06 00 00 52 |...............R|
00000020 52 b4 41 bb aa 55 31 c9 30 f6 f9 cd 13 72 13 81 |R.A..U1.0....r..|
00000030 fb 55 aa 75 0d d1 e9 73 09 66 c7 06 8d 06 b4 42 |.U.u...s.f.....B|
00000040 eb 15 5a b4 08 cd 13 83 e1 3f 51 0f b6 c6 40 f7 |..Z......?Q...@.|
00000050 e1 52 50 66 31 c0 66 99 e8 66 00 e8 21 01 4d 69 |.RPf1.f..f..!.Mi|
00000060 73 73 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20 |ssing operating |
00000070 73 79 73 74 65 6d 2e 0d 0a 66 60 66 31 d2 bb 00 |system...f`f1...|
00000080 7c 66 52 66 50 06 53 6a 01 6a 10 89 e6 66 f7 36 ||fRfP.Sj.j...f.6|
00000090 f4 7b c0 e4 06 88 e1 88 c5 92 f6 36 f8 7b 88 c6 |.{.........6.{..|
000000a0 08 e1 41 b8 01 02 8a 16 fa 7b cd 13 8d 64 10 66 |..A......{...d.f|
000000b0 61 c3 e8 c4 ff be be 7d bf be 07 b9 20 00 f3 a5 |a......}.... ...|
000000c0 c3 66 60 89 e5 bb be 07 b9 04 00 31 c0 53 51 f6 |.f`........1.SQ.|
000000d0 07 80 74 03 40 89 de 83 c3 10 e2 f3 48 74 5b 79 |..t.@.......Ht[y|
000000e0 39 59 5b 8a 47 04 3c 0f 74 06 24 7f 3c 05 75 22 |9Y[.G.<.t.$.<.u"|
000000f0 66 8b 47 08 66 8b 56 14 66 01 d0 66 21 d2 75 03 |f.G.f.V.f..f!.u.|
00000100 66 89 c2 e8 ac ff 72 03 e8 b6 ff 66 8b 46 1c e8 |f.....r....f.F..|
00000110 a0 ff 83 c3 10 e2 cc 66 61 c3 e8 62 00 4d 75 6c |.......fa..b.Mul|
00000120 74 69 70 6c 65 20 61 63 74 69 76 65 20 70 61 72 |tiple active par|
00000130 74 69 74 69 6f 6e 73 2e 0d 0a 66 8b 44 08 66 03 |titions...f.D.f.|
00000140 46 1c 66 89 44 08 e8 30 ff 72 13 81 3e fe 7d 55 |F.f.D..0.r..>.}U|
00000150 aa 0f 85 06 ff bc fa 7b 5a 5f 07 fa ff e4 e8 1e |.......{Z_......|
00000160 00 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 |.Operating syste|
00000170 6d 20 6c 6f 61 64 20 65 72 72 6f 72 2e 0d 0a 5e |m load error...^|
00000180 ac b4 0e 8a 3e 62 04 b3 07 cd 10 3c 0a 75 f1 cd |....>b.....<.u..|
00000190 18 f4 eb fd 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000001a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000001b0 00 00 00 00 00 00 00 00 |........|
000001b8






以下是你一樓的原POST!





tmpfs 寫到:
從 MBR boot code (440 bytes) 探索 Ubuntu 無法開機的問題


前提:我是把 Ubuntu 系統,安裝在 MBR 格式的開機碟。
(請注意:不是 GPT 格式的開機碟)

最近在實體電腦及虛擬機器,安裝了很多次的 Ubuntu 14.04.1 系統。

我習慣用 GParted 先分割好硬碟。(或是在 Ubuntu 安裝程式中,直接手動分割硬碟。)
然後安裝 Ubuntu 系統時,選擇把 grub 安裝在 / 分割區(包含/boot)中。

可是我發現有個奇怪的現象:
有的分割區安裝 Ubuntu 系統後,開機可以啟動系統。
有的分割區安裝 Ubuntu 系統後,開機無法啟動系統。

一開始不知道原因,還以為是 Ubuntu 有 Bug 問題。
後來偶然發現,開機能不能成功啟動系統,似乎與分割區的起始位置有關。
(不能開機的分割區,起始的 CHS 值顯示為 0xFEFFFF)

我開始懷疑,是 MBR boot code (440 bytes) 的問題。

於是我到 Wikipedia 爬文(MBR/VBR):
http://zh.wikipedia.org/zh-tw/MBR
http://en.wikipedia.org/wiki/Master_boot_record
http://en.wikipedia.org/wiki/Volume_boot_record

了解到:
1.傳統 CHS 無法表示大於 8032.5MB 的硬碟(分割區)。
2.這種情形,CHS值通常設為 0xFEFFFF,並加以忽略。

使用 parted (或 GParted 或 Ubuntu 安裝程式)分割硬碟,會在 MBR boot code (440 bytes) 寫入一個迷你的啟動程式。

我懷疑這個迷你的啟動程式,好像只能啟動 CHS 可以表示的分割區。
如果分割區的起始位置大於 8032.5MB 的話,可能就無法正常開機。
(無法引導安裝在分割區中的 grub 程式)

後來我發現 Ubuntu 14.04.1 安裝光碟中,有 syslinux 的 MBR boot code (440 bytes) 可以使用。
/usr/lib/syslinux/mbr.bin

於是我把 syslinux 的 mbr.bin 寫入無法開機的系統碟中:
sudo dd if=/usr/lib/syslinux/mbr.bin of=/dev/sda bs=440 count=1

果然就可以正常開機啟動 Ubuntu 系統了。

初步結論:
parted 的 MBR boot code 無法啟動(起始位置大於 8032.5MB 的分割區)。
syslinux 的 MBR boot code 可以啟動。

可能有人會說,如果一開始安裝 Ubuntu 系統時,選擇把 grub 安裝在 MBR 中,就不會遇到這個問題。
可是我認為功能強大的 grub 實在太肥了,遠遠超過 440 bytes,應該安裝在分割區中比較適合。

而且如果有安裝多重系統,例如安裝 Windows 7 時,MBR boot code (440 bytes) 也會被 Windows 覆蓋。
如果 grub 沒有安裝在 MBR 中的話,就不用擔心修復 grub 的問題。
只要把 syslinux 的 boot code 寫回到 MBR,然後把要啟動的分割區的 Flag 設為 boot 就可以了。


備註一:以上結論是我個人實測後的猜測,如果有不正確的地方,請各位指正。
(畢竟我不知道如何去解讀 MBR boot code 的內容)

備註二:如果有人會解讀 parted 或 syslinux 的 boot code 的話,請教教我!
如果 boot code 的原始碼是用 C 語言寫的話,我會一些。
如果 boot code 的原始碼是用 x86 組合語言寫的話,我不會,放棄。

2015/5/13 13:01
應用擴展 工具箱
回覆: 從 MBR boot code (440 bytes) 探索 Ubuntu 無法開機的問題
會員五級
註冊日期:
2012/4/22 10:50
所屬群組:
已註冊使用者
等級: 37
HP : 0 / 901
MP : 671 / 29303
EXP: 6
離線
tmpfs 寫到:

...略...

後來我發現 Ubuntu 14.04.1 安裝光碟中,有 syslinux 的 MBR boot code (440 bytes) 可以使用。
/usr/lib/syslinux/mbr.bin

於是我把 syslinux 的 mbr.bin 寫入無法開機的系統碟中:
sudo dd if=/usr/lib/syslinux/mbr.bin of=/dev/sda bs=440 count=1

果然就可以正常開機啟動 Ubuntu 系統了。

...略...




tmpfs 寫到:
## parted 的 MBR boot code 無法啟動以下四個主分割區(CHS=0xFEFFFF)
ubuntu@ubuntu:~$ sudo dd if=/dev/sda bs=512 count=1 2> /dev/null | hexdump -Cv -s 446 -n 64
000001be 80 fe ff ff 83 fe ff ff 00 00 00 01 00 00 00 01 |................|
000001ce 00 fe ff ff 83 fe ff ff 00 00 00 02 00 00 00 02 |................|
000001de 00 fe ff ff 83 fe ff ff 00 00 00 04 00 00 00 04 |................|
000001ee 00 fe ff ff 83 fe ff ff 00 00 00 08 00 00 00 08 |................|
000001fe


## parted 的 MBR boot code 如下:很迷你,功能陽春(CHS定址?),開機失敗無訊息提示。
ubuntu@ubuntu:~$ sudo dd if=/dev/sda bs=440 count=1 2> /dev/null | hexdump -Cv
00000000 fa b8 00 10 8e d0 bc 00 b0 b8 00 00 8e d8 8e c0 |................|
00000010 fb be 00 7c bf 00 06 b9 00 02 f3 a4 ea 21 06 00 |...|.........!..|
00000020 00 be be 07 38 04 75 0b 83 c6 10 81 fe fe 07 75 |....8.u........u|
00000030 f3 eb 16 b4 02 b0 01 bb 00 7c b2 80 8a 74 01 8b |.........|...t..|
00000040 4c 02 cd 13 ea 00 7c 00 00 eb fe 00 00 00 00 00 |L.....|.........|
00000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000100 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000110 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000130 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000150 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000160 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000170 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000001a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000001b0 00 00 00 00 00 00 00 00 |........|
000001b8


## syslinux 的 MBR boot code 如下:很好用,功能完整(LBA定址?),開機失敗有訊息提示。
ubuntu@ubuntu:~$ sudo dd if=/dev/sda bs=440 count=1 2> /dev/null | hexdump -Cv
00000000 33 c0 fa 8e d8 8e d0 bc 00 7c 89 e6 06 57 8e c0 |3........|...W..|
00000010 fb fc bf 00 06 b9 00 01 f3 a5 ea 1f 06 00 00 52 |...............R|
00000020 52 b4 41 bb aa 55 31 c9 30 f6 f9 cd 13 72 13 81 |R.A..U1.0....r..|
00000030 fb 55 aa 75 0d d1 e9 73 09 66 c7 06 8d 06 b4 42 |.U.u...s.f.....B|
00000040 eb 15 5a b4 08 cd 13 83 e1 3f 51 0f b6 c6 40 f7 |..Z......?Q...@.|
00000050 e1 52 50 66 31 c0 66 99 e8 66 00 e8 21 01 4d 69 |.RPf1.f..f..!.Mi|
00000060 73 73 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20 |ssing operating |
00000070 73 79 73 74 65 6d 2e 0d 0a 66 60 66 31 d2 bb 00 |system...f`f1...|
00000080 7c 66 52 66 50 06 53 6a 01 6a 10 89 e6 66 f7 36 ||fRfP.Sj.j...f.6|
00000090 f4 7b c0 e4 06 88 e1 88 c5 92 f6 36 f8 7b 88 c6 |.{.........6.{..|
000000a0 08 e1 41 b8 01 02 8a 16 fa 7b cd 13 8d 64 10 66 |..A......{...d.f|
000000b0 61 c3 e8 c4 ff be be 7d bf be 07 b9 20 00 f3 a5 |a......}.... ...|
000000c0 c3 66 60 89 e5 bb be 07 b9 04 00 31 c0 53 51 f6 |.f`........1.SQ.|
000000d0 07 80 74 03 40 89 de 83 c3 10 e2 f3 48 74 5b 79 |..t.@.......Ht[y|
000000e0 39 59 5b 8a 47 04 3c 0f 74 06 24 7f 3c 05 75 22 |9Y[.G.<.t.$.<.u"|
000000f0 66 8b 47 08 66 8b 56 14 66 01 d0 66 21 d2 75 03 |f.G.f.V.f..f!.u.|
00000100 66 89 c2 e8 ac ff 72 03 e8 b6 ff 66 8b 46 1c e8 |f.....r....f.F..|
00000110 a0 ff 83 c3 10 e2 cc 66 61 c3 e8 62 00 4d 75 6c |.......fa..b.Mul|
00000120 74 69 70 6c 65 20 61 63 74 69 76 65 20 70 61 72 |tiple active par|
00000130 74 69 74 69 6f 6e 73 2e 0d 0a 66 8b 44 08 66 03 |titions...f.D.f.|
00000140 46 1c 66 89 44 08 e8 30 ff 72 13 81 3e fe 7d 55 |F.f.D..0.r..>.}U|
00000150 aa 0f 85 06 ff bc fa 7b 5a 5f 07 fa ff e4 e8 1e |.......{Z_......|
00000160 00 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 |.Operating syste|
00000170 6d 20 6c 6f 61 64 20 65 72 72 6f 72 2e 0d 0a 5e |m load error...^|
00000180 ac b4 0e 8a 3e 62 04 b3 07 cd 10 3c 0a 75 f1 cd |....>b.....<.u..|
00000190 18 f4 eb fd 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000001a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000001b0 00 00 00 00 00 00 00 00 |........|
000001b8


* Community Help Wiki / RestoreUbuntu/XP/Vista/7Bootloader
* Wikipedia / SYSLINUX

#「syslinux」套件初步探索

## 查詢資訊

查詢「syslinux」這個套件的「Source Package」相關資訊


$ apt-cache showsrc syslinux



顯示


Package: syslinux
Binary: syslinux, syslinux-udeb, extlinux, syslinux-common
Version: 3:4.05+dfsg-6+deb8u1
Priority: optional
Section: utils
Maintainer: Daniel Baumann <mail@daniel-baumann.ch>
Build-Depends: debhelper (>= 9), e2fslibs-dev, gcc-multilib [amd64], libc6-dev-i386 [amd64], nasm, python, uuid-dev
Architecture: amd64 i386 all
Standards-Version: 3.9.3
Format: 3.0 (quilt)
Directory: pool/main/s/syslinux
Files:
e1a9418400efa612b1bfba013047c051 1375 syslinux_4.05+dfsg-6+deb8u1.dsc
7a1ef95ba82804dec3cd99e80aab0201 4483608 syslinux_4.05+dfsg.orig.tar.xz
a3a399937ee7df92f30fbd9234e43d55 32532 syslinux_4.05+dfsg-6+deb8u1.debian.tar.xz
Homepage: http://syslinux.zytor.com/
Package-List:
extlinux deb utils optional
syslinux deb utils optional
syslinux-common deb utils optional
syslinux-udeb udeb debian-installer optional
Checksums-Sha1:
70e26d4fadd21ee95fcf4f01ef659e0a413b6dcb 1375 syslinux_4.05+dfsg-6+deb8u1.dsc
bdf58c9d11a246b3cb9db7d0af07f5e4097d5b5f 4483608 syslinux_4.05+dfsg.orig.tar.xz
74dfeeae43a0650333e61dd1a8efd2cfc71d3352 32532 syslinux_4.05+dfsg-6+deb8u1.debian.tar.xz
Checksums-Sha256:
a787cf26fb33b4c89c93a64094edf718741411b9b383cb90ddeccc3ca7a9f833 1375 syslinux_4.05+dfsg-6+deb8u1.dsc
91f57a24dafd950ff137d2a1378c9db30fda57e82c58ecf09fe6e558ca1b5056 4483608 syslinux_4.05+dfsg.orig.tar.xz
9630b355f7ef20c3842dbcb32c7d9d082cc00d04f914c51dea253cf87a451f6b 32532 syslinux_4.05+dfsg-6+deb8u1.debian.tar.xz



查詢「syslinux」包含哪些「Binary Package (Debian Package)」。

可以執行


$ apt-cache showsrc syslinux | grep 'Binary:'



顯示


Binary: syslinux, syslinux-udeb, extlinux, syslinux-common




或是執行


$ apt-cache showsrc syslinux | grep 'Package-List:' -A 4



顯示


Package-List:
extlinux deb utils optional
syslinux deb utils optional
syslinux-common deb utils optional
syslinux-udeb udeb debian-installer optional




## 探索「syslinux-common」這個套件

下載「syslinux-common」這個套件


$ apt-get download syslinux-common



解開「syslinux-common」這個套件


$ dpkg -x syslinux-common_3%3a4.05+dfsg-6+deb8u1_all.deb syslinux-common



執行


$ ls syslinux-common/usr/lib/syslinux/*.bin -1



顯示



syslinux-common/usr/lib/syslinux/altmbr.bin
syslinux-common/usr/lib/syslinux/altmbr_c.bin
syslinux-common/usr/lib/syslinux/altmbr_f.bin
syslinux-common/usr/lib/syslinux/gptmbr.bin
syslinux-common/usr/lib/syslinux/gptmbr_c.bin
syslinux-common/usr/lib/syslinux/gptmbr_f.bin
syslinux-common/usr/lib/syslinux/isohdpfx.bin
syslinux-common/usr/lib/syslinux/isohdpfx_c.bin
syslinux-common/usr/lib/syslinux/isohdpfx_f.bin
syslinux-common/usr/lib/syslinux/isohdppx.bin
syslinux-common/usr/lib/syslinux/isohdppx_c.bin
syslinux-common/usr/lib/syslinux/isohdppx_f.bin
syslinux-common/usr/lib/syslinux/isolinux.bin
syslinux-common/usr/lib/syslinux/isolinux-debug.bin
syslinux-common/usr/lib/syslinux/mbr.bin
syslinux-common/usr/lib/syslinux/mbr_c.bin
syslinux-common/usr/lib/syslinux/mbr_f.bin




執行


$ hexdump -Cv syslinux-common/usr/lib/syslinux/mbr.bin



執行


$ hexdump -Cv syslinux-common/usr/lib/syslinux/gptmbr.bin




## 探索「syslinux」這個「Source Package」


下載「syslinux」這個「Source Package」


$ apt-get source syslinux




執行


$ ls syslinux-4.05+dfsg/mbr/*.bin -1




顯示


syslinux-4.05+dfsg/mbr/altmbr.bin
syslinux-4.05+dfsg/mbr/altmbr_c.bin
syslinux-4.05+dfsg/mbr/altmbr_f.bin
syslinux-4.05+dfsg/mbr/gptmbr.bin
syslinux-4.05+dfsg/mbr/gptmbr_c.bin
syslinux-4.05+dfsg/mbr/gptmbr_f.bin
syslinux-4.05+dfsg/mbr/isohdpfx.bin
syslinux-4.05+dfsg/mbr/isohdpfx_c.bin
syslinux-4.05+dfsg/mbr/isohdpfx_f.bin
syslinux-4.05+dfsg/mbr/isohdppx.bin
syslinux-4.05+dfsg/mbr/isohdppx_c.bin
syslinux-4.05+dfsg/mbr/isohdppx_f.bin
syslinux-4.05+dfsg/mbr/mbr.bin
syslinux-4.05+dfsg/mbr/mbr_c.bin
syslinux-4.05+dfsg/mbr/mbr_f.bin




執行


$ ls syslinux-4.05+dfsg/mbr/*.S -1



顯示


syslinux-4.05+dfsg/mbr/altmbr.S
syslinux-4.05+dfsg/mbr/gptmbr.S
syslinux-4.05+dfsg/mbr/isohdpfx.S
syslinux-4.05+dfsg/mbr/isohdppx.S
syslinux-4.05+dfsg/mbr/mbr.S




## 資料查詢

查詢「syslinux mbr.bin」,

查到

* Syslinux Wiki / Mbr
* Syslinux Wiki / Master_Boot_Record

2015/5/13 17:12
應用擴展 工具箱
回覆: 從 MBR boot code (440 bytes) 探索 Ubuntu 無法開機的問題
會員五級
註冊日期:
2012/4/22 10:50
所屬群組:
已註冊使用者
等級: 37
HP : 0 / 901
MP : 671 / 29303
EXP: 6
離線
* Wikipedia (中文) / GNU_GRUB

根據上面這篇提到的「boot.img」和「core.img」,還有「grub-install」

## 「boot.img」初步探索


$ ls /boot/grub/i386-pc/*.img -1



顯示


/boot/grub/i386-pc/boot.img
/boot/grub/i386-pc/core.img



執行


$ ls /boot/grub/i386-pc/boot.img -l


顯示


-rw-r--r-- 1 root root 512 Feb 7 15:42 /boot/grub/i386-pc/boot.img




執行

$ hexdump -Cv /boot/grub/i386-pc/boot.img



對照執行


$ sudo dd if=/dev/sda bs=512 count=1 2> /dev/null | hexdump -Cv





## 「grub-install」初步探索


查詢「grub-install」放在哪個位置


$ whereis grub-install



顯示


grub-install: /usr/sbin/grub-install /usr/share/man/man8/grub-install.8.gz




查詢「/usr/sbin/grub-install」屬於哪個套件


$ dpkg -S /usr/sbin/grub-install



顯示


grub2-common: /usr/sbin/grub-install



查詢「grub2-common」屬於哪個「Source Package」。



$ apt-cache showsrc grub2-common | grep 'Package:'



顯示


Package: grub2
Package: grub2




可以執行下面的指令下載「grub2」的「Source Package」


$ apt-get source grub2-common



或是


$ apt-get source grub2




探索「grub-install.c」


$ vi grub2-2.02\~beta2/util/grub-install.c



查詢「boot.img」和「core.img」相關的程式碼。





$ vi grub2-2.02\~beta2/util/setup.c





...暫時紀錄到此...


2015/5/13 18:35
應用擴展 工具箱
回覆: 從 MBR boot code (440 bytes) 探索 Ubuntu 無法開機的問題
會員一級
註冊日期:
2015/5/2 16:19
所屬群組:
已註冊使用者
等級: 4
HP : 0 / 75
MP : 9 / 1792
EXP: 3
離線
感謝 "redhung" 的回覆。

謝謝您提供的參考資料。

我的電腦不算太舊,所以應該不是「實體電腦」或「虛擬機器」的設定問題。
我的實體電腦: Intel Ivy Bridge Desktop (22nm)
我的虛擬機器: VirtualBox 4.3.26

應該是 MBR boot code (440 bytes) 的問題。
因為我把 syslinux 的 boot code 寫入 MBR 後,開機就可以正常啟動 Ubuntu 系統了。

2015/5/14 1:10
應用擴展 工具箱
回覆: 從 MBR boot code (440 bytes) 探索 Ubuntu 無法開機的問題
會員一級
註冊日期:
2015/5/2 16:19
所屬群組:
已註冊使用者
等級: 4
HP : 0 / 75
MP : 9 / 1792
EXP: 3
離線
感謝 "samwhelp" 的回覆。

謝謝您提供非常豐富的參考資料。

我參考您的提示,
下載了 syslinux 套件的原始碼,
查看 syslinux-4.05+dfsg/mbr/mbr.S 的內容,
好像是用 GAS (GNU Assembler) 組譯器指令寫的。

可惜,我完全看不懂 GAS 組譯器原始碼,哈哈。

2015/5/14 1:35
應用擴展 工具箱
回覆: 從 MBR boot code (440 bytes) 探索 Ubuntu 無法開機的問題
會員五級
註冊日期:
2012/4/22 10:50
所屬群組:
已註冊使用者
等級: 37
HP : 0 / 901
MP : 671 / 29303
EXP: 6
離線
tmpfs 寫到:
感謝 "samwhelp" 的回覆。

謝謝您提供非常豐富的參考資料。

我參考您的提示,
下載了 syslinux 套件的原始碼,
查看 syslinux-4.05+dfsg/mbr/mbr.S 的內容,
好像是用 GAS (GNU Assembler) 組譯器指令寫的。

可惜,我完全看不懂 GAS 組譯器原始碼,哈哈。


我個人是覺得那個「mbr.S」暫時可以不用弄懂拉(看你其他篇的發問,你還有重要任務需要先做,所以我個人認為你的系統暫時只要能開機就行了,這部份可以慢慢再研究)。

而下面則是一些概念性的東西,應該可以先閱讀消化和吸收的。

我建議你把我的回覆再多讀幾遍。

另外把下面兩篇的內容多讀幾遍。

* Wikipedia (中文) / GNU_GRUB <--這裡面有圖可以參考
* Community Help Wiki / RestoreUbuntu/XP/Vista/7Bootloader

尤其Grub的兩段流程的概念,兩段流程的第一段和第二篇的dd mbr.bin那部份,再對照你的結論和測試結果。

還有你可以釐清和確認一下parted,是只有硬碟分割的功能,還是它也包含了bootloader的功能。
這部份我尚未確認,有待你去研究了解,因為這跟你的結論和測試有關。

以上我也還在摸索,還沒有看到全貌,所以我暫時也無法給你結論。
但你認真讀我的回覆和我給你的參考文章,你應該會發現一些概念,也許是跟你的認知是有出入的。
但也許是我的認知有出入,這就有待大家來討論和研究了。



2015/5/14 4:23
應用擴展 工具箱
回覆: 從 MBR boot code (440 bytes) 探索 Ubuntu 無法開機的問題
會員三級
註冊日期:
2012/4/26 9:45
所屬群組:
已註冊使用者
等級: 12
HP : 0 / 293
MP : 62 / 9516
EXP: 72
離線
tmpfs 寫到:
## parted 的 MBR boot code 無法啟動以下四個主分割區(CHS=0xFEFFFF)
ubuntu@ubuntu:~$ sudo dd if=/dev/sda bs=512 count=1 2> /dev/null | hexdump -Cv -s 446 -n 64
000001be 80 fe ff ff 83 fe ff ff 00 00 00 01 00 00 00 01 |................|
000001ce 00 fe ff ff 83 fe ff ff 00 00 00 02 00 00 00 02 |................|
000001de 00 fe ff ff 83 fe ff ff 00 00 00 04 00 00 00 04 |................|
000001ee 00 fe ff ff 83 fe ff ff 00 00 00 08 00 00 00 08 |................|
000001fe


## parted 的 MBR boot code 如下:很迷你,功能陽春(CHS定址?),開機失敗無訊息提示。
...(略)


根據主開機紀錄 - 維基百科,自由的百科全書裡有關硬碟分割表的部分如下:
硬碟分割表
硬碟分割結構資訊
偏移 長度(位元組) 意義
00H 1 分割狀態:00-->非活動分割;80--> 活動分割;其它數值沒有意義
01H 1 分割起始磁頭號(HEAD),用到全部8位元
02H 2 分割起始磁區號(SECTOR),占據02H的位0-5;該分割的起始磁柱號(CYLINDER),占據02H的位6-7和03H的全部8位元
04H 1 檔案系統標誌位
05H 1 分割結束磁頭號(HEAD),用到全部8位元
06H 2 分割結束磁區號(SECTOR),占據06H的位0-5;該分割的結束磁柱號(CYLINDER),占據06H的位6-7和07H的全部8位元
08H 4 分割起始相對磁區號
0CH 4 分割總的磁區數

硬碟分割表占據主啟動磁區的64個位元組(偏移01BEH--偏移01FDH),可以對四個分割的資訊進行描述,其中每個分割的資訊占據16個位元組。具體每個位元組的定義可以參見硬碟分割結構資訊。下面是一個例子:

如果某一分割在硬碟分割表的資訊如下

80 01 01 00 0B FE BF FC 3F 00 00 00 7E 86 BB 00

則我們可以看到,最前面的"80"是一個分割的啟用標誌,表示系統可啟動[1];"01 01 00"表示分割開始的磁頭號為1,開始的磁區號為1,開始的柱面號為0;"0B"表示分割的系統類型是FAT32,其他比較常用的有04(FAT16)、07(NTFS);"FE BF FC"表示分割結束的磁頭號為254,分割結束的磁區號為63、分割結束的柱面號為764;"3F 00 00 00"表示首磁區的相對磁區號為63;"7E 86 BB 00"表示總磁區數為12289662。

對於大於8.4G的現代硬碟,CHS已經無法表示, BIOS使用LBA模式,對於超出的部分,CHS值通常設為 0xFEFFFF, 並加以忽略,直接使用Offset 0x08-0x0c的4位元組相對值,再進行內部轉換.



而從你的配置表數值可以看到,四個分割區皆以LBA模式分割,而
"00 00 00 01"的相對磁區號之總磁區數為"00 00 00 01"
"00 00 00 02"的相對磁區號之總磁區數為"00 00 00 02"
"00 00 00 04"的相對磁區號之總磁區數為"00 00 00 04"
"00 00 00 08"的相對磁區號之總磁區數為"00 00 00 08"
看起來很怪!一個硬碟不管怎麼分割,它隨便一個分割區的"總磁區數"都不太可能是"01"、"02"、"04"、"08"。



邏輯區塊位址 - 維基百科,自由的百科全書裡的
CHS與LBA互換

CHS位址可用以下公式轉成LBA,

#lba=(#c*H+#h)*S+#s-1

其中,

#c、#h、#s分別是磁柱、磁頭、磁區的編號
#lba是邏輯區塊編號
H=heads per cylinder,每個磁柱的磁頭數
S=sectors per track,每磁軌的磁區數

LBA可用以下公式對應到CHS:

#c=#lba/(S*H)
#h=(#lba/S)%H
#s=(#lba%S)+1

其中,

/ 是整數除法
% 是取整數除法中的餘數
請注意,當今的磁碟使用ZBR(Zone Bit Recording, 等密度記錄)方式,實際的每軌磁區數得根據它是哪一軌。不過磁碟還是會提供這個參數來符合公式,內部再自動調整。

其它公式:

#lba/S=q 餘 r
#s=1+r
q/H=#c 餘 #h

例如:

CHS總數=[600, 10, 84],求#lba=1234所對應的CHS編號:
1234/84=14 餘 58
#s=1+58=59
14/10=1 餘 4
#c=1
#h=4
#chs=(1, 4, 59)
驗算: (1*10+4)*84+59-1=14*84+58=1234



而"00 00 00 01"、"00 00 00 02"、"00 00 00 04"、"00 00 00 08",怎麼看都不太像是可以轉換出LBA的數值的數字。

而如果把數字以反序排列的話,可以得到"01 00 00 00"、"02 00 00 00"、"04 00 00 00"、"08 00 00 00",從二進位轉換成十進位後,剛好各是"64"、"128"、"256"、"512";而換算出來的結果如下:
chs=(0,0,65)
chs=(0,1,45)
chs=(0,3,5)
chs=(0,6,9)

只能到這邊了,接下來的對錯驗證,只有你有東西可以驗證了。

2015/5/14 5:31
應用擴展 工具箱

(1) 2 »

 [無發表權] 請登錄或者註冊


可以查看帖子.
不可發帖.
不可回覆.
不可編輯自己的帖子.
不可刪除自己的帖子.
不可發起投票調查.
不可在投票調查中投票.
不可上傳附件.
不可不經審核直接發帖.