NoName Team 電腦資訊討論區

 找回密碼
 我要註冊
搜索
查看: 20073|回復: 9

突破盲點? bios 開機載入 GPT 中的 win 7 u sp1 x86 ?

[複製鏈接]
發表於 2013-11-19 02:56:53 | 顯示全部樓層 |閱讀模式
本帖最後由 阿達金田一 於 2020-6-12 00:58 編輯

*** 2013 /12/09 補充 ***
工具 BiosGPTWin
隨著新版的工具發佈...此篇的一些錯誤...順便的修正一下
其實主要只是 MSR 的部份說錯了(被 windows 的安裝介面誤導)
主文中...都已修改為 Boot (啟動用的分割區)
MSR 不管在 BIOS MBR 或 UEFI GPT ...作用都是給動態磁碟用的
以下是各開機分割區
UEFI GPT ... ESP分割區(EFI分割區)...FS其實還是 FAT
UEFI MBR ... FAT分割區 ( 只是 分割區 的名稱叫 ESP )
BIOS MBR ... NTFS分割區 ( 只是 分割區 的名稱叫 系統保留 )
( 我就是被這誤導...因為 MSR 分割區名稱 也叫 系統保留 )

所以這裡主文修正 開機分割區 都叫 Boot Partition (簡稱 Boot)

目前透過工具...只要3個動作就可以搞定...
所以這篇文章就是紀念和研究原理用的


*** 文首補充 ***
它媽的大概是有史以來我打最長的一篇文章
主要是純 原理 理論 概念...實作只佔一部份

這篇老實說..研究和興趣 大於 實用
除了大於 2T 的 3T HD ... 不然 2T HD 以下 MBR 就 ok 了 (我還在 160G)
就算 3T HD 想當系統碟...灌完 windows 在安裝各廠商的相對程式
一樣可以把 2T 後面的空間用掉...反正也不會比這還麻煩
所以這篇實用性不太...只有純粹的 意義 上的 突破盲點 和 技術上的探討
bios 是不支援 GPT 開機 (應該說目前 MBP 不支援)
但不代表 bios 不能進 GPT 中的系統 (這要看 系統 本身的支援)
如果 系統 本身支援 GPT 並且其 開機程序 也支援 GPT (指系統的啟動階段...不是指進系統後的支援)
那還是可以用 bios 進去 (雖然 開機時 還是會受限 bios 的定址 2T)

這裡我唯一不能測的是...3T HD(沒實機)
如果不另外分 資料分割區
單純 Boot(Win7) 或 Boot + Basic(Win7)
那 Win7 分割區 後半一定就會超過 2T

Boot+Basic(win7) 還好...因為開機是在 Boot
除非你 Boot 分割 起啟LBA 定址到 2T 以上 (= =|||)

僅 Boot 的情況 由於 Boot 後半定址超過 2T 不知道會不會影響
理論上推測...應該不會
只要你 Boot 起始LBA位址 別超過 2T 定址
而且 開機檔 的位址也不超過 2T 定址...應該不會影響
(基本上不可能...除了惡搞...Basic在前面...Boot放最後)


***** 以下主文 *****
因為網路上我是爬不到相關的文章
也不知道有沒有別人成功過...我是自己亂搞的
先貼個圖
win7BiosGPT.jpg

測試環境: Vbox 4.3 ... 沒開 uefi ... 1CPU  RAM512M
(我本尊PC就不打詳細了...RAM 2G , 雙核CPU 爛爛的)

工具程式:
win7安裝光碟
自製 XPE
Acronis True Image 9.1 UR.WIM (沒看錯..就是 NonXPE 中的那個...多古老啊)
WinIMA
DiskGenius_4.30 專業版
DiskGenius_4.40 免費版 DOS ISO
SPFDISK

工具都很陽春...DiskGenius 我還是第1次用

由於我測試時很亂...所以一些順序我就不照我測試的情況順序
而是造大概要怎麼做的順序
不過在此之前
先說一下 概念 原理 思路

網路上大多都看的到 GPT 要用 uefi 啟動如何如何
然後就有人說...bios 不能用 GPT 啟動

照正常來說...這此說的都沒錯啦
但實際上...這也只是針對 windows 來說
因為像 linux 是可以 bios 啟動 GPT (好像啦...linux 沒摸過)

那 bios uefi  mbr gpt 之間是啥關係咧
在不清楚...關係原理時...像下面這文章
http://www.iruanmi.com/what-is-gpt-and-what-is-uefi/
說到
"因为BIOS无法识别GPT分区,所以BIOS下GPT磁盘不能用于启动操作系统"

後半句先保留...前面半句...就有點誤導
首先 bios 基本上...啥都不會識別...在我 "淺談 bios uefi" 一文中有提過
bios 是用 位址 在存取...
(好像啦...我不是專業電腦硬體工程師...只是一個普通使用者..不過在 bios 中 位址 概念很重要...)
所謂的支援都是 程式 在跑
因此 linux 的程式 才能支援 bios 去啟動 GPT (人家 linux 程式寫的就比較好)

老實說 MBR GPT 就只是 分割表
而 bios uefi 只是基礎的 硬體 管理 控制 I/O 系統
bios 和 uefi 簡單的差異在...在開機啟動上...bios 比較麻煩而以

由於 uefi 是以直接載入 PT(分割表) 中的 FS (FileSystem 檔案系統) 中的檔案來啟動的
所以管理處理上簡單很多
所以只要 uefi 有支援的 PT 和 FS 就可以開機

而 bios ...因為啥 FS 都不能識別...只會 存取 位址
在 HD 開機流程中...就只是去讀 HD 的第1個磁區 (開機引導磁區 簡稱 BR 好了)
在最早期..連 PT 都還沒有時...那時只有 FS(就像 FD軟碟一樣...只有FS)
那時的 開機引導磁區 就是拿來載入 FS 中的 開機檔(開機程式)

而後 PT 概念 ...只是建築在 FS 的上面...也就是 FS 的前導
在 HD 的第1個磁區 ... 開機引導磁區 ... 加入了 PT引導程序 和 PT
( 為了區別 GPT 和 MBR 的 PT .. MBR PT 就簡稱 MPT )
MPT引導程序 + MPT 也就是所謂的 MBR (主開機磁區)
MBR = MBP(主開機程序...也就 MPT引導程序) + MPT


關於 MBR  這個可以google 一下 MBR ... 維基 就有詳細說明了

基本的 MBR (MBP) 的做用就只是處理 MBR 中的 PT
載入 啟動分割區 中的 第1個磁區 (BR) ...分割區的BR 簡稱 PBR 好了
也就是上面剛說的 FS 開機的概念

bios 開機
HD -> MBR -> PBR -> 開機程序檔案

所以在 bios 開機 中 ... 初期的 引導 很重要 (也很麻煩)

基礎先說到這


而以 bios 開機來說...引導 或 程序 能不能支援到 GPT 咧
我就搞的情況來說...我的結論是 "目前很難"
原因在目前 ... 沒有 GPT 用的 MBP(我找不到)

前面說了 bios 開機..初期都在 "引導"
而 引導磁區 就只有 512Bytes ...
也是說 512Bytes 的程式 就要支援 GPT
這難不難...我不會寫開機引導程序所以我不清楚...

MBR 就只是處理 MPT (MPT才64bytes)
PBR 則是支援(讀取)該 FS 的檔案
我覺的就 PBR 來說 FS 結構 應該不會比 GPT結構 簡單吧
PBR 可以支援載入 FS 中的 開機檔
那 MBR 只是支援一下 GPT結構 去載入 GPT 的 PBR 應該還是可以做到

能不能做到...先不管...反正目前我是不知道那有 支援 GPT 的 MBR 可以用
即然沒有 MBR 可以直接支援 GPT ... 那透過其它的程序...能支援 GPT 嗎
答案當然是可以
像 grub4dos 目前也能支援識別 GPT
更別提 分割表處理程式 像 DiskGenius (這個有 DOS ISO) 之類的

話雖如此...實際上真要用...又有其它問題

首先 grub4dos 是如何載入的...
這裡不說 dos grub.exe 的情況...只說一般常用方式

1. grub4dos MBR -> 載入支援的 PT FS 中的 GRLDR
2. 一般 MBR -> 一般 PBR -> 用GRLDR 取代原本的 開機檔

註: grub4dos 的MBR 有沒有支援 GPT 我不清楚...
上面說的 grub4dos 支援 僅是指 grub4dos本身(GRLDR)... grub4dos MBR  也只是前導而以

2種方式要支援 GPT 都有各自的問題

首先 grub4dos MBR 需要 16-18個磁區(512bytes)...即 8-9KB (這要看 grub4dos mbr 不同版各有差異)
前面說了 MBR 只有 1磁區 512B(0.5K)
那 grub4dos MBR 是怎麼運作的
這裡以磁區為單位...512bytes 為 1個 磁區
MBR 是 1個磁區 .. grub4dos 的 MBR 是 16-18 個(或更多)
實際運作上...grub4dos MBR 的第1個 磁區 還是單純的 MBR
只是其中 MBP 的做用是...去載入後面的磁區(2-xx)

而問題在於... GPT 的結構 ...不知道的可以去維基
簡單說 GPT 剛好是儲存在 第2-34 的磁區
而 grub4dos 是儲存在 第1-16 的磁區
所以...2者就有衝突了...用 GPT...grub4dos MBR 就不能用
用 grub4dos MBR ..  GPT 就損壞了

但其實 以我測試的情況來說...依 MBR 中的 GPT 資料
其實應該可以避免和解決...
主要是 MS 不肯去搞吧...而且也沒比較方便的工作程序來搞

雖然我不是用這個 思路 去解決的 (因為還不知道 grub4dos mbr 能不能支援 GPT)
但這裡還是提一下
首先提一下 GPT 的結構 ..雖然主要是  2 - 34 磁區
但在 MBR 中...實際上還是會建立一個 MPT 用來給程式判斷...是用 MBR 還是 GPT
(算是給 MBR 的一種相容方式...和 GPT HD 在不支援 GPT 的 OS 中的保護方式)
這就要扯到 MPT 的儲存...不過還是簡單說就好...詳細請 維基
原本的 MPT 主要就是 起始位址 和 終止位址 的計算
另外還有使用哪種 檔案系統
在使用 GPT 時...MPT 一樣會建一個 主分割
一樣有 起始 和 終止位址 ... 檔案系統碼是  0xEE
當然 MPT 的定位只到 2TB...而 GPT 可以大於 2TB
所以 終止CHS 和 分割區磁區數 比較不重要 ( 正常他是滿值 0xFF FF FF 和 0xFF FF FF FF)
而 起始CHS 通常是 2 (0x02)

起始LBA位址 是第2個磁區(0x01)...(第1個磁區是 0x00...也就是 MBR 本身)

( 注: 在這裡 CHS 比較不重要
因為 MBR 中的 CHS 是早期HD採用的計算方式 ...現在都是用 LBA
而 MBR 只能 2T 是因為 MBR 的 LBA 定址...只有 4bytes = 32bit= 2^32 = 4294967296 個磁區
1個磁區=512bytes=0.5KB ... 所以 4294967296 個磁區 = 2147483648KB = 2TB
但實際上...依 MBR LBA 定址和容量計算方式...MBR 最多是可以近 2T+2T
第1個分割 起始LBA 0x00 00 00 00 = 0 , 總磁區數 0xFE FF FF FF = 4294967295
第2個分割 起始LBA 0xFF FF FF FF = 4294967296, 總磁區數 0xFF FF FF FF = 4294967296
只是 windows 內建的分割管理比較 GY...只能用前 2T )


在我測試時...如果改動 起始LBA位址...就會認不到 GPT (推測是找不到 GPT)
這種情況...讓我覺的好像是....
MBR 的 分割...有一種 擴充分割 (或叫 延伸分割)
做用是把一個 主分割 ...拿來 再分割

在 使用概念 上...雖然不一樣
擴充分割 是為了能有更多分割
而 MBR 中的 GPT 分割資料...只是用來判斷是用 MPT 還是 GPT

但在 分割結構 的上....根本好像
一樣都一個 主分割...然後該 分割區 中...還有一個 分割表

貼一下 用 GPT 時 MPT 中的唯一主分割資料...大概長這樣
00 00 02 00- EE FF FF FF- 01 00 00 00- FF FF FF FF


所以實際上...我覺的 MBR 和 GPT 的 相容 ...是可以彈性的
像在 MPT 中...指定 起始位址 等於是 GPT結構 所在的 位址
那就可以透過 MPT 找到 GPT ( 當然...位址不能超過 2T )
其實這就是 擴充分割 的方式 ...只是其定址還是和 MPT 一樣而且也受限於 MPT (起/終位址)

所以如果要用 grub4dos mbr 來玩...那 GPT 就要放在 17-49 (或更後面)
因為要玩的要搬 GPT ...所以我懶的玩...等那天有空在玩
而且這只是想法...也不知道 MS GPT 有沒有那麼 彈性 ... 萬一它打死只認 2-34 就沒折了


發現已經說了一堆...但我用的方式還沒說到
grub4dos MBR 先不搞
那就剩 一般 MBR 來載入 grub4dos 了

一般 MBR -> 一般 PBR 或 grub4dos  PBR -> GRLDR 或 "用 GRLDR 取代原本的開機檔"

前面說了 MBR 初期都在 引導
也就是 讀這個 位址 的磁區...然後...跑去 讀那個 位址 的磁區
那問題又來了...它媽的現在的 MBP 不認識 GPT 啊  (看來要看有沒有神人寫一個 GPT 專用 MBR)

不認識...好吧...那只能手動在 MPT 動手腳...直接和 MBP 說去哪裡讀取磁區 (PBR)

在使用 GPT 的 HD 中
我前面說了...其 MBR 只有一個 主分割...是用來讓程式判斷該 HD 是用 MBR 還是 GPT
我試過...手動加入其它的 主分割......基本上...這要看程序 怎麼判斷 GPT 的
在 DiskGen 和 Windows 中....好像只要不是 唯一個主分割...都會當成 MBR ...而不會當成 GPT
因此 MBR/GPT 混合分割...在 DiskGen 和 Windows 中都會視為 MBR
(MBR/GPT 混合分割是指...同時存在 MBR 和 GPT 2個種分割表...)

好吧...本來這樣我都快放棄
其實我個人測試時...已經可以由 光碟grub4dos 載入 GPT 中的 win7
因為我是先測 bootmgr 可不可以載入 GPT 中的 windows...(這後面在談)
然後才測試如何在 GPT 的情況下 從 HD 去載入到 grub4dos

本來真的快放棄...不小心...又被我搞出來
GPT 在 MBR 中 只能一個主分割...
嗯... 那我就搞 半個 分割資料...只寫入  起始位址 讓 MBP 去讀取
在 spfdisk 中...成功的...只看到 唯一個主分割
另外 半個分割資料 大概不全所以當沒有
然後用 DiskGen DOS ISO 去看...原本2個分割會當成 MBR ... 1個半....就當成 GPT 了
(注: 後期測試結果...只要 FS碼 為 0x00...大多數的程式會視為無該分割...)

好吧...雖然可以用 半個 來搞...但那也要 MBP 真的會去讀才行
真不知道要哭還是笑...
不知道是不是因為 MBP 最多只能有 446b  (因為要減去 MPT 64b 還要結尾碼 2b)
所以程序上都很簡易...(嗯...才446b...也很難去加入什麼複雜的除錯程序)
不管是 spfdisk 刷的MBR 還是 win7 bootsect 刷的 MBR ...都可以讀那 半個
DiskGen MBR ?
DiskGen 在 GPT 情況下...不能刷 MBR
而換到 MBR...好像它媽的就沒 GPT分割結構了

DiskGen 我主要是配合 SPFDISK 找出 MPT 的 16進位碼 (後面在詳說)

到此...這樣就可以直接讓 MBP 跑去載入 GPT 中某個 分割區 的 PBR

其實我之前說了 MPT 和 GPT 都只是分割表
2個都是要 定址...只是差異在大小和結構不同而以
例如
某 分割區 其定址是  HD 第 0x1000 磁區 到 0x2000 磁區
MPT 和 GPT 只是 定址 的大小 和 存放的位址 及 結構 不同
( MPT 在 MBR 中...而且只有 64b...1個主分割才16b ... GPT 整整有 1+32個磁區 )
但...分割區 的 起 終 磁區 還是不變
只要在 MBR 的定址 範圍那就還是可以用 MBR 去讀到


那...接下來是實做方面了
考量到是跑 windows 7 ...所以一拼連帶 windows 7 一起說

前面說了...我是先測能不能用 grub4dos 啟動 GPT 中的 win7 u sp1 x86
這是因為....
uefi 開機的 bootia32.efi(bootmgr.efi) ... 肯定是可以支援 GPT
那 bios 的 BOOTMGR 咧

這裡在回顧一下 bios 開機流程
MBR -> PBR -> 開機檔

正常情況下 MBR 當然支援 MPT ...所以讀的到 PBR
而一般情況下 PBR 放的當然是支援該 FS 的 引導程序
最後就是 開機程序檔 了...
當然 "正常情況" 下...OS 當然要逆向支援前面
不過 windows 7 問題在 有 uefi 和 bios
(好吧 x86 不能 uefi...不過 x64 可以吧)

而 windows 7 本身支援 GPT
也就是 OS 來說...是可以在 GPT 中啟動
(好吧 x86 是應該可以吧...但至少 win 8.1 x86 有 uefi 也可以 UEFI GPT 啟動...如果 win7 x86 真不行我大概會拿 win8.1 的 bootmgr 來搞)

但這都有前題 bootmgr 能支援才行...因為 uefi 那是 bootmgr.efi

而實際上...好吧..果然是遇到問題
BOOTMGR "表面上" 不支援 GPT (快無言了)
這也是當時先測 BOOTMGR 的原因...要是 BOOTMGR 就死了...前面引導搞的在好都沒用

"表面上" 嗯..真的是表面上
在實測用 光碟grub4dos 載入 bootmgr 時...他媽的他讀不到 GPT 中的 BCD
當時我一開始覺的...這裡應該沒問題...讀個 BCD 而以...主要是要載入 winload.exe 能不能的問題
如果 BCD 都讀不到...那後面的還能嗎
然後我又無言了...真的讀不到...這也就算了...那還不至於無言
看最上面的圖片也知道我最後功成了...也就是說
它媽的載入 GPT 中的 winload.exe 是可以的 (我無言的是這個...BCD 為啥不行)

還好讀不到 BCD 時我沒放棄...讀不到...就想辦法讓你讀到
BOOTMGR 不能讀 GPT 分割區 中的 BCD
那反正都用 grub4dos 就用 grub4dos 虛擬個非GPT的 磁碟 ...把 bootmgr boot目錄 都放到 img 中
( 打到這才想到 bootmgr 其實不用放到 img 反正 grub4dos 可以 chainloader 到  GPT 中的  bootmgr )
下面是我的實做
bootmgr.ima (5M) 放入
/bootmgr
/boot/bcd
/boot/memtest.exe (這個應該也不用去讀 GPT 中的就好)
/boot/zh-tw 中的檔案
/boot/fonts/cht_boot.ttf
/boot/fonts/wgl4_boot.ttf
(中文開機 有這2個文字檔就夠了)

BCD 要事先用 bcdedit 搞過才行(這是重點)
由於我只是測 win7 開機
BCD 中一部份的項目我有砍掉 不然要一個一個重新設定
(一部份是因為有些設定我沒留原始資料...在改成 GPT 時變 unknown..所以懶的再去查就砍了)


以上只是 整體 的 開機流程 和 解決概念
綜合以上...比較重要的地方是
1. GPT 分割區 的 位址 和 MBR 分割區 的 位址
2. BCD 的修正
3. bootmgr.ima 的建立

上面說一堆..結論就這 3點 ?  .... 是滴
其實最麻煩的...是第1點
2 3 和...只要有 PE 就很好搞

第1點難是因為 沒用好...GPT結構 沒了...就要重建 GPT  還有就是 位址 的取得
(當然主要是那時還搞不太清楚...現在比較清楚就還好一點)

首先...先正常安裝 win7 吧
建議是把 win7 安裝到 Boot 搞在一起
win7 在 bios 安裝是用 MBR
HD 是 GPT 不能安裝...如果遇到 HD 是 GPT 的
可以先把 分割區 全砍光...全都變回 未配置空間...在重新建立 分割
這樣 win7 會自動改成 MBR...才建立分割

手動 建立 時會自動生出 1個 系統(Boot) + 1個分割區 (基本資料分割區 basic data partition)

Win7 的安裝判斷大概是...一定要用1個 Boot ( 用來處理開機檔 bootmgr 那些的 )
和 1個 大於 快8G 的分割區...
這個 分割區 不一定要是 基本資料區...也可以是 Boot
不過 Win7 自動生成的 Boot 只有 100M

這裡建議
1. 手動 建立 分割區 (不要用 下一步 自動建立)
2. 生出 1 系統(Boot) + 1
主要(Basic)
3. 留著 系統 把 主要 砍了
4. 選 系統 ...按下面的 延伸 ..就可以把 系統(Boot) 拉大

這樣就可以把 win7 裝在 Boot (這樣等下用 ATI 備份 或 處理 bootmgr 比較方便)
當然造正常安裝方式 1 Boot + 1 Basic 也是可以

基本上 10G 就可以裝下 Win7 不用太大
除非打算直接 MBR 轉 GPT 一次搞定
因為後面還要在改成 GPT 後然 建立 分割區...所以到時可以在改大小

我在 PE 中用 DiskGen 4.3 要轉 GPT 都會有問題...最後放棄 MBR直接轉GPT

不管要 直接轉GPT 還是 重新建立GPT 那是後面的事
這裡先安裝完 Win7 然後要 Loader 激活啟動的...也裝一裝
因為我測試後發現 Loader 不是改 MBR 而是改 PBR...所以 MBR 沒差
而且因為 Loader 是依 MBR 去找到 分割區 和 PBR
然後 修改 PBR 和 產生一個破解用檔案(檔名隨機)
修改的 PBR引導 是因為要先讀 破解用檔 然後在去載入 bootmgr
總之 Loader 可以先搞好
我測試時就是沒先搞..後面才搞
結果一下要改 GPT裝成 MBR , Loader 完後又改回 GPT (總之很煩)

win7+loader完...
把 GRLDR 先放到 Boot 根目錄下
(因為 Loader 應該都改 Boot ... BOOTMGR 那些也在 Boot)
把 BOOTMGR 改名成 BOOTMGR.7
把 GRLDR 改名成 BOOTMGR

建立 menu.lst
1. bootmgr.ima 不打算放 bootmgr 的話

find --set-root /bootmgr.ima
map --mem /bootmgr.ima (fd0)
map --hook
chainloader /bootmgr.7
root (fd0)

2. bootimg.ima 放 bootmgr 的話

find --set-root /bootmgr.ima
map --mem /bootmgr.ima (fd0)
map --hook
root (fd0)
chainloader /bootmgr

最後 BCD 可以先查看一下 原始資料 記下來...方便後面要改才有依據

前置動作搞好後
就用 PE 把 分割區 備份起來吧

要直接轉 GPT...如果不怕失敗...可以不備份...記得要抄 MBR 中的資料
備份時別傻傻的備份在同一個 HD 啊
不能直轉又沒有別的 HD...好吧...那就要多花些功夫了...

考慮這3種不同情況...後面處理有差異
(主要是MBR GPT 位址的取得...因為 MBR GPT 2個要一致)
所以分開說好了

而且正常情況 grub4dos 都應該在 Boot
因為 Loader 應該都改 Boot...grub4dos 也應該放到 Boot 才正確
所以不管是 1 Boot 還是 Boot + Basic ... 都以 Boot 為主


下面要說重點的 位址 相關部份
以下都以 win7 安裝在只有 1個 Boot 的情況為主

直接 MBR 轉 GPT
1.
用 SPFDISK 或其它工具
記下 MBR 資料 主要是 Grub4dos(Boot) 所在的那個 分割資料

例如
80 19 15 05 - 07 FE FF FF - 00 40 01 00 - 00 C0 3E 01
可以配合看維基MBR的說明...其實我就是看 維基 的 MBR 在搞的
這裡順便說一下
80 是 啟動分割區 的標記
19 15 05 起始的 磁頭 磁區 磁柱 (起始CHS)
07 是 檔案系統碼(FS碼...07 是 NTFS)
FE FF FF 是 終止的 磁頭 磁區 磁柱 (終止CHS)
00 40 01 00 是 分割起始相對磁區號 (起始LBA位址)
00 C0 3E 01 是 分割總的磁區數

2.
然後直接 MBR 轉 GPT 吧 (別問我...反正我 XPE + DiskGen 不能這樣玩會出現錯誤)

3.
轉完後在用 SPFDISK 或其它工具 查看 MBR
大概會是長這樣 (不同 HD 可能有差異)
00 00 02 00- EE FF FF FF- 01 00 00 00- FF FF FF FF
這是 MBR 中 GPT的資料 最好記一下...以備失誤時可以救一下
接著上面那串資料...輸入前面記的 Boot MBR 資料
這裡我們只要 一半 就好
只要 起始 資料就好 其它都打 00 最前面要 80

例如
00 00 02 00 - EE FF FF FF - 01 00 00 00 - FF FF FF FF
80 19 15 05 - 00 00 00 00 - 00 40 01 00 - 00 00 00 00

如果轉的時候 MBP 被清掉 可以用 SPFDISK或其它工具 重建一下 MBP
(後面不打其它工具了...大家知道就好)

到這裡 用 DiskGen 看...應該是 GPT...而不會變 MBR (失敗就變 MBR 了)

--- 直接 MBR 轉 GPT 改位址...到此 END ---


備份 Win7 + 重建 GPT
接著前面 前置動作 搞好...要備份Win7
1.
我是用 ATI 9...備份 分割區
用 WIM 的方式也可以...反正只是要備份 Win7 的檔案
其它備份工具用 分割區 備份就好
( boot + Basic 就2個都備份吧)
2.
用 DiskGen 4.4 DOS ISO(我用這個) 刪除所有 MBR 分割
這樣就可以把 MBR 轉 GPT

3.
然後 建立 GPT 分區...依個人需要的使用情況去建立
我一樣接著用 DiskGen 4.4 DOS ISO
建立時...一定要記下各 分割區 的 起始 磁頭 磁區 磁柱
後面會用到

4.
GPT 分割區 建好後...到 PE 用 DiskGen 4.3 Pro 直接轉 MBR
(拷 MBR to GPT 就給我出包  GPT to MBR 就沒事)
轉 MBR 好後用 SPFDISK 查看 MBR 並記錄下資料

5.
回到 DiskGen 4.4 DOS ISO
刪除 MBR 分割區再重建一次 GPT吧
注意...要和上次 "一模一樣"
所以之前才要記錄下 各 分割區 的 起始 磁頭 磁區 磁柱

主要是 Boot 起始位址 一定要一樣...這是要用來開機的

6.
GPT 搞好後
用 SPFDISK  在 MBR 的 GPT 資料後
接上 記錄的 Boot 起始資料
只要 起始 資料就好 其它都打 00 最前面要 80
例如
00 00 02 00 - EE FF FF FF - 01 00 00 00 - FF FF FF FF
80 19 15 05 - 00 00 00 00 - 00 40 01 00 - 00 00 00 00

7.
最後把 Boot Win7 還原回到相對的 分割區


--- 備份 Win7 + 重建 GPT  位址 處理 END ---



接下來是

"可憐的 不能直接 MBR 轉 GPT...又沒別的 HD 儲 備份 的情況"

如果看了上面2種...第3種...大概也猜的出來
就是全部都用 位址 記錄 和 修改
而且一失敗..可能就要重來 (甚至再重灌一次 Win7 吧...)
除了非常克難的環境 或 想練技術的
其它人還是別用第3種方式了

其實說起來 和 第2種 也差不多...只是 沒備份 沒保障
還有就是...安裝 Win7 時就要先想好要怎麼分割
因為後面 分割 位址 上都不能動...所以要先想好
最重要的是...
位址 記錄 不管是 磁頭 磁區 磁柱
還是 boot 中的16進制碼...都要記清楚
不然一搞錯...Win7 可能就回不來了

1.
Win7 前置動作搞完
先用  DiskGen 和  SPFDISK 記錄下
各 分割區 的 磁頭 磁區 磁柱 和  MBR 資料

2.
用 DiskGen DOS ISO
刪除 MBR分割區 然後 轉 GPT
接著建立 GPT 分區...用之前記錄下來的 磁頭 磁區 磁柱 建立
各分割區一定要 "一模一樣"
至少 Boot Win7 ... 2個不能錯
至於後面用來放A片的資料分割區...位址錯了重建就是比較沒差

這時在  DiskGen 套用/儲存 分割資料時
應該會跳出...有 殘留的 引導...要不要 "保留"

請 "全都保留"
沒保留的話...那分割區的 引導 就沒了...而且也不知道會不會損壞到 FS

3.
用 SPFDISK  在 MBR 的 GPT 資料後
接上 步驟1 所記錄的 Boot 起始資料
只要 起始 資料就好 其它都打 00 最前面要 80
例如
00 00 02 00 - EE FF FF FF - 01 00 00 00 - FF FF FF FF
80 19 15 05 - 00 00 00 00 - 00 40 01 00 - 00 00 00 00


--- 到此 位址 處理  END ---





接下來是 bootmgr 和 bcd 的處理了
到此 3種位址處理方式 完... HD 都已經是 GPT 了 (如果被 DiskGen 辨識為 MBR 那就失敗了)

1.
到 PE 中用 bcdedit 對 Boot 中的 \boot\bcd 做修正
這裡請參考之前的 原始資料
因為 MBR 改 GPT 後..有些資料會變 unknown ...看不出原來寫啥

其實主要資料是 device 和 osdevice 2個
這裡指定了各項目的 裝置來源 ... 非常重要

bcdedit 指令我就不說了

依項目別分指定其 device 和 osdevice 到 boot 或 Win7 的磁碟槽
例如
假設在 PE 中 boot win7 在一起 都是 C:

那就是
bcdedit  /store c:\boot\bcd /set {default} device partition=c:

除了 {bootmgr} device 設為 boot
bcdedit  /store c:\boot\bcd /set {default} device boot

boot Win7 在一起的好處..是不會搞不清楚要指定那一個
像 記憶體測試...{memdiag} 是要指定到 Boot 所在
當然如果要把 memtest.exe 也放到 bootmgr.ima 的話
也可以指定到 boot

要注意 指定到 boot 是用

device boot
osdevice boot
而指定磁碟槽...前面要加上 partition=
例如
device partition=c:
osdevice partition=d:

bcd 都改完 ( bcdedit /store x:\boot\bcd /enum all 可以看到所有項目 )
檢查還有沒有 unknown ...沒有就改完了
有...但不會改...如果該功能你覺的用不到...可以砍了
但要注意..{default} ( win7 的啟動項 )
有一部份是關聯到其它項目...所以其它項目不正常 或 被砍了
會影響 win7 啟動...會跳出錯誤
當然不會修正可以把 {default} 中...那些引發錯誤的項目值都砍了
用參數 /deletevalue

2.
BCD改好後
用 winima 或其它程式..建立一個 5M 的 IMA
把面檔案放進去
/bootmgr (可以不要)
/boot/bcd (必要)
/boot/memtest.exe (可以不要 BCD有指定好到 GPT 中就好)
/boot/zh-tw 中的檔案 (可以不要...介面不是中文而以)
/boot/fonts/cht_boot.ttf (要顯示中文就留著)
/boot/fonts/wgl4_boot.ttf (要顯示中文就留著)

前面如果沒把 menu.lst 和 grldr 處理好
在這裡處理也是可以

把 GRLDR 先放到 boot 根目錄下
把 BOOTMGR 改名成 BOOTMGR.7
把 GRLDR 改名成 BOOTMGR

建立 menu.lst
1. bootmgr.ima 不打算放 bootmgr 的話

find --set-root /bootmgr.ima
map --mem /bootmgr.ima (fd0)
map --hook
chainloader /bootmgr.7
root (fd0)

2. bootimg.ima 放 bootmgr 的話

find --set-root /bootmgr.ima
map --mem /bootmgr.ima (fd0)
map --hook
root (fd0)
chainloader /bootmgr

到此就 完全結束 ...無誤的話 可以用 HD 開機 進 win7
其流程就是

一般 MBR -> GPT boot 分割區 PBR -> BOOTMGR(GRLDR) -> 載人 bootmgr.ima 和 win7 的 bootmgr

這裡要注意...因為是用 bootmgr.ima 的 bcd 來開機的..所以原本 Boot 下的 BCD 就沒啥用
所以如果要修改開機啥的...改 Boot 沒用...要改 bootmgr.ima 才有用

發表於 2013-11-19 03:33:02 | 顯示全部樓層
GPT 好像有另外的啟動工具
 樓主| 發表於 2013-11-19 04:08:23 | 顯示全部樓層
GPT 是不是另外的工具我是不知道啦...不過 啟動 我也功成了
不過沒有做太多測試
主題部份我會慢慢的完補
發表於 2013-11-19 12:20:48 | 顯示全部樓層
本帖最後由 2567288 於 2013-11-19 20:46 編輯

真的太精彩了,需要找個時間來實做與消化。

最近有點忙 , 先一步一步試試看
先用DiskGenius把空硬碟 , mbr 轉 gpt , 直接分割一個 msr 分割區 , 把win7x86先放到 msr 分區
發表於 2015-5-14 16:00:55 | 顯示全部樓層
说的很详细,但是很乱,所以我看的不是很懂。原理大概知道了,就是缺少你的工具,自己不会制作。
發表於 2015-5-14 16:04:11 | 顯示全部樓層
说的很详细,但是很乱,所以我看的不是很懂。原理大概知道了,就是缺少你的工具,自己不会制作。
 樓主| 發表於 2015-5-14 20:29:04 | 顯示全部樓層
或者你可以看另一篇...這篇是純手動...沒用自製工具
http://nonameteam.cc/thread-1630-1-2.html


Bios + GPT 啟動...其實就是
在轉成 GPT 後
1. MBR 用一般的 MBP ( MBR 的引導程序 ) ...我的工具是刷 win7 的MBP
2. 在 MBR 分割表 中 第1個 EE(GPT) 分割資料後...
設定 第2分割 為啟動(80)分割 ...並且把 起始LBA 設為 GPT其中一個分割的起始LBA (通常是 GPT 第1個分割...)
但實際上沒有第2分割 (即檔案系統ID 為要 00)
簡單一點就是除了 啟動標記 80 和 起始LBA 這5個 bytes 有資料外...其它 11bytes 都為 00

這樣 Legacy Bios 載入 MBR 時...就會去用 80 分割...的 起始LBA 開機
而 起始LBA 被設定為 GPT某一分割的起始LBA ... 所以等於用 GPT 該分割做開機

之後 windows 開機...就還要用 grub4dos 做開機處理
map  bcd 所在分割(或做成img) 到 (fd0)
讓 bootmgr 可以載入 bcd

bcd 修正....可以改用 bcdboot 不一定要用 bcdedit
發表於 2015-5-15 11:37:04 | 顯示全部樓層
感恩版主的分享...

Toshiba Satellite L40-B PSKQET-00H002
製造年份: 2014

原出廠時裝的是 WIN8.1 UEFI+GPT HDD:1Tb
開機後單見系統C: 九百多gb

以工具軟體查看另含前三後一,共5個分割
任務是要加 Win7 成雙系統,當然也要切出資料儲存區
這樣的情況,直接就領受到 GPT 分割的方便性了!

卡點是這台 NB 只能 UEFI or CSM 各別運作
即在切換 CSM 後 非是 UEFI 取 interrupt 10 的支援,而是純 CSM 模式在運作
缺 interrupt 10 的支援, WIN7 的啟動就卡在 disk.sys ...
這意謂著不能在 UEFI 模式下 Run Win7,要 Win7 就得捨棄 UEFI,
可是原為GPT分割的資料怎麼辦???
那有沒有 UEFI 啟動又可有 interrupt 10 的支援的引導呢?
可惜沒找著,有的是 BIOS 下模擬 UEFI 的引導,比如 CLOVER...
由於記憶體只配置了4Gb,放棄了虛擬機的模式,只好在 CSM 模式下奮戰!

基於版主的分享,嘗試多日後終於可以運作了...
再次的感恩!
發表於 2015-5-24 23:12:26 | 顯示全部樓層
又看了一遍。
發表於 2016-12-20 13:55:49 | 顯示全部樓層
積分不夠  !  no tools !
您需要登錄後才可以回帖 登錄 | 我要註冊

本版積分規則

小黑屋|手機版|NoName Team 電腦資訊討論區 |網站地圖

GMT+8, 2024-11-28 00:30 , Processed in 1.310531 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回復 返回頂部 返回列表