本帖最後由 阿達金田一 於 2021-7-21 08:41 編輯
有啊...之前就成功啊...不過之前是用 map iso
剛直接把 iso 解出來丟到根目錄下
chainloader /efi/boot/bootx64.efi
進 bootmgrfw.efi ... 載入 boot.wim ...一樣 ok
建議不管是 grub4dos 或 grub4efi ...有問題就 指令逐行測試
自己看不懂...問人也方便給個問題訊息什麼的
不然也不知道你問題出在哪裡
grub4efi 就只是引導而以...如果是 iso 啟動...
難度還比較高因為 iso 還要 虛擬+掛載光碟 ...有可能失敗
( 原因之前討論過...雖然我在 vbox 上測都 ok )
find 儲存
單行儲存 ...只會儲第1個 find 到的...存到變數 xxx 中
使用時用 %xxx%
例如
find /efi/boot/bootx64.efi | set bootx64=
其實一般不過這樣用
因為一般 find 是為了要 chainloader
而 chainloader 一般就要 設定 root
所以大多直接 find --set-root 就好...
只有 find 但不是為了 chainloader 時...可能才會用到
如果 find 要多行結果會比較麻煩
一般是先把結果丟到 (md) 記憶體 中
再去逐行處理
這裡我貼個大概的例子...(如果看不懂就放棄好了...這有一定難度)
目的是為啟動 非usb 的 hdd 中的 bootmgr (這個例子是用 grub4dos )
usb 中有 /flag.usb
find --ignore-floppies --ignore-cd /flag.usb | set usb=
先找出 usb 的磁碟位置 儲存到 usb
用 --ignore-floppies --ignore-cd 的原因是這才不會找出 hdd 之外的
2是只找出 hdd 就表示回應的一定是 (hdx,x)
set list=(md)0x60500+0x100
find --ignore-floppies --ignore-cd /bootmgr > %list%
找出 hdd 上的 /bootmgr 儲存記憶體
因為是找 /bootmgr ...所以可能會有多個回應結果
然後逐行處理
cat --length=10 --skip=0 %list% | set p=
if exist p if "%p%"=="%usb%" set p=
if exist p root %p% && chainloader /bootmgr && boot
cat --length=10 --skip=10 %list% | set p=
if exist p if "%p%"=="%usb%" set p=
if exist p root %p% && chainloader /bootmgr && boot
cat --length=10 --skip=20 %list% | set p=
if exist p if "%p%"=="%usb%" set p=
if exist p root %p% && chainloader /bootmgr && boot 這裡前面用 find --ignore-floppies --ignore-cd 的 效果就出來了
因為回應結果一定是 (hdx,x)
所以每行是 10字元長度 (加上每行的 開頭空白字元 和 行尾換行字元)
以上是逐行讀取 儲存 p
如果 %p% 等於 %usb% , 清除掉 p , set p=
然後如果 p 存在 , root %p% , chaindloader /bootmgr , boot
簡單說就是 %p% 等於 %usb% 不會 root %p% , chaindloader /bootmgr , boot
簡單說就是 %p% 不等於 %usb% 會 root %p% , chaindloader /bootmgr , boot
這的用意在
usb 開機時...很多就是把 usb 放到 (hd0,0)
如果為做如果為做 hdd 開機...一般是直接做 (hd1) 開機
但這是一般情況下...
因為 usb 未必一定是 (hd0,0) 雖然一般都是...
(不過在 uefi 可能未必...因為bios 處理上有不同)
另外 hdd 的開機也未必就在 hd1 雖然一般也都是
(同樣在 uefi 中也未必)
hdd 開機和 windows 安裝有關...雖然一般都是安裝在 hd0 (沒 usb 情況下)
然後 pe 和一般 windows 開機是一樣的...拿 legacy 來說就是 /bootmgr
所以如果 usb 在 (hd0,0)
直接 find --set-root /bootmgr 然後 chainloader
就只會找到 usb 的 /bootmgr ... usb 只會重覆啟動
所以以上指令最終就是找出
非USB 的 hdd 中的 /bootmgr
(當然主要還是找出第1個...然後 chainloder + boot )
而以上只處理了 3次 是因為 一般其實 2次 就夠了...
因為 usb 要嘛在 (hd0) 要嘛不在 (hd0)
所以 usb 要嘛在 find 回應第1行...要嘛不在第1行
也就是反過來說 hdd 中的 /bootmgr 要嘛不在第1行 , 要嘛在第1行
當然如果 usb 分割了好幾個分區...每個分區下還都放 /bootmgr...那我沒話說
那只能用 grub4dos 的 BAT ... 會一直找到 非USB 的 /bootmgr 或 沒資料為止
!BAT
find --ignore-floppies --ignore-cd /flag.usb | set usb=
set list=(md)0x60500+0x100
find --ignore-floppies --ignore-cd %1 > %%list%%
echo find %1
cat %%list%%
set /a sk=0
:find
cat --length=10 --skip=%%sk%% %%list%% | set p=
set /a sk=%%sk%%+10
echo %%p%%
if not exist p exit
if "%%p%%"=="%%usb%%" goto :find
root %%p%%
chainloader %1
boot
PS:
所以其實我個人對 legacy 的情況下
如果要用 grub4dos 更喜歡把 pe 的 /bootmgr 改成別的 檔名 例如 /peldr
反正 legacy 的 mgr pbr 都是可以修改的...不一定要用 /bootmgr 就可以和一般 hdd 分別開來
|