請選擇 進入手機版 | 繼續訪問電腦版

NoName Team 電腦資訊討論區

 找回密碼
 我要註冊
搜索
樓主: ss9696

[討論] grub4dos-for_UEFI 設定討論

[複製鏈接]
 樓主| 發表於 2021-4-2 08:26:03 | 顯示全部樓層
pinko 發表於 2021-4-2 03:57
我猜...
uefi 就不支援16bit系統了吧
要跑dos就只能開Legacy了

我也想過這個問題~  但如果這樣有支援UEFI的memtest86+ 與 Acronis 的掛載應該要成功才對

但 也是跳上面訊息不給我掛載

不過 難得弄UEFI應該也不會用掛載的方式去開memtest86+ 跟 Acronis,會想辦法讓這兩個直接讀EFI掛載,但還只是測試階段碰壁中 ..........
發表於 2021-4-3 00:40:48 | 顯示全部樓層
ss9696 發表於 2021-4-1 15:32
確實用金田一大的方式 能順利將磁區分割成功了

不過 後續測試其他項目的時候有發現問題

我沒用過 hddreg 如果這是 dos img ...
UEFI 當然不能用

但是...依據你貼的圖...
問題不是發生在啟動 dos
而是 虛擬磁碟 就有問題

不過如果是 dos hddreg 其實也不用測了
就算 虛擬磁碟 map 成功...也啟動不了 dos 進不到 hddreg
發表於 2021-4-3 01:03:10 | 顯示全部樓層
本帖最後由 阿達金田一 於 2021-4-3 01:21 編輯

我剛試了...我 map img 是正常的...
不會出現
failed to install virtual disk
Fasiled to install vdisk
這2行...應該是 map 有問題

只會出現最後2行...
Failed to Load .....
這是 chinaloader 有問題

其實 grub4dos uefi 的 chainloader
大概只是加載 /efi/boot/bootx64.efi 而以

我是用以前自製的 biosgpt iso ...裡面有 diskgenius dos img ( 而且是壓成 .LZ )
map 是正常的

你可以測別的 img ...如果一樣不行
那可能是
1. grub4dos uefi 版本 ???

2. UEFI BIOS 問題 ??? ... UEFI 是有分版本的
我測試是用 vbox ... 是模擬 uefi bios 2.70
就我所知 uefi 要支援 ramdisk 要 2.6 版後才能
https://www.lab-z.com/utrad/
我測試時 map --mem 是正常的
你可以測試不要用 --mem
如果 不用就可以 map
表示 g4d uefi 用 --mem 會用到這個 uefi 的功能

3. img 本身就有問題

測試圖



另外 grub4dos uefi 目前有的指令可能比較死
簡單說別拿 G4D Legacy 的 習慣 或 情況 來判斷

如果是 dos img 之類的 partition img (分區映像...簡單說就是沒 分割表 只有 檔案系統 )
可能只能掛到 (fdx)
因為我有測試用 map /xxxx (hd) 會失敗...
iso 基本也只能掛到 (0xff)
大概只有 hdd img ( 磁碟映像 ...簡單說就是包含 分割表)
才能用 (hd) ... 這個我還沒測試

其實就目前來說 grub4dos uefi ...大概最會用到的是 map iso
因為 uefi 目前的工具程式不多...很多 dos 工具...都還沒出 uefi 版
而有些工具都出 PE(Win) 版 或 Linux 版...
大多直接用 iso 進 PE 或 Linux 再進工具程式
像 diskgenius 有 Win版
Acronis 則是有 Linux Boot ISO

不過如果單純啟動 iso ... ventoy 比較好用

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號?我要註冊

x
 樓主| 發表於 2021-4-9 14:07:00 | 顯示全部樓層
確實 我也猜版本的問題,因為我拿去實機上測試連選單都不能進去 (Dell主機)

在實機測試會直接跳檢修系統,沒辦法進選單

所以我就在想是不是現在推行的版本跟現在現有的BIOS版本 有差距

所以 這項目也只能先暫停看之後更新的版本是否能正常開啟

原本還挺期待終於可以代入選單做更多事情了  沒想到瘋狂打臉 ,只能先暫緩先處理python的專案了
 樓主| 發表於 2021-4-21 16:18:24 | 顯示全部樓層
阿達金田一 發表於 2021-3-31 18:39
原生的 UEFI 本來就只支援 FAT
可能是廠商另外加 NTFS EFI Driver
( 簡單說就是 BIOS 已經內崁 NTFS EFI Dr ...

想問一下 grub4dos  會去找NTFS的檔案,那windows的 uefi的開機會不會自己去 NTFS尋找 /efi/boot/BCD

還是要自己另外設定才能讓其他軟體的efi自己去尋找檔案
發表於 2021-4-22 15:13:03 | 顯示全部樓層
本帖最後由 阿達金田一 於 2021-4-22 15:16 編輯
ss9696 發表於 2021-4-21 16:18
想問一下 grub4dos  會去找NTFS的檔案,那windows的 uefi的開機會不會自己去 NTFS尋找 /efi/boot/BCD

還 ...

不會 ..win 的 uefi 其實就是 bootmgr ( BOOTMGFW.EFI )

uefi bootmgr 的原則大概是...

1. 先找同路徑下的 bcd
例如
FS0:\EFI\MICROSOFT\BOOT\BOOTMGFW.EFI
會找 FS0:\EFI\MICROSOFT\BOOT\BCD
FS0:\EFI\BOOT\bootx64.efi
會找 FS0:\EFI\BOOT\BCD

2. 找同分區的 \efi\microsoft\boot\bcd
基本上 uefi 開機就是用 ESP 或 FAT 的 EFI

\EFI\BOOT\bootx64.efi
是 uefi bios 預設的開機檔路徑
簡單說就是會去依順序載入...可被 uefi bios 支援並判斷為 FS 的分區
uefi shell 中會  map FS , FS 就是(可支援)檔案系統
在 uefi shell 中...也有磁碟代號的意味...通常是用
FS0:
FS1:
...
FSx:

也就是說...通常就是
找 FS0:\efi\boot\bootx64.efi ... 沒有
接著找 FS1:\efi\boot\bootx64.efi ......

所以如果 uefi bios 有支援 NTFS ( 也就是支援 NTFS FS )
那實際上 uefi bios 開機本身就會去找 NTFS (中的 \efi\boot\bootx64.efi)

簡單說 bootmgr 基本上找的都是 同分區 中的 BCD
和 grub4dos 是找各分區的 menu.lst 不一樣
發表於 2021-7-20 17:41:39 | 顯示全部樓層
請問有人成功啟動10PE.WIM嗎?
我把WIM檔放FAT32/NTFS槽皆無法成功
使用G4D UEFI官方寫法.改檔名而己

另外.請問下find XXX後回覆的值要如何儲存呢?
發表於 2021-7-21 08:33:31 | 顯示全部樓層
本帖最後由 阿達金田一 於 2021-7-21 08:41 編輯
saiz 發表於 2021-7-20 17:41
請問有人成功啟動10PE.WIM嗎?
我把WIM檔放FAT32/NTFS槽皆無法成功
使用G4D UEFI官方寫法.改檔名而己

有啊...之前就成功啊...不過之前是用 map iso
剛直接把 iso 解出來丟到根目錄下
chainloader /efi/boot/bootx64.efi
進 bootmgrfw.efi ... 載入 boot.wim ...一樣 ok

建議不管是 grub4dos 或 grub4efi ...有問題就 指令逐行測試
自己看不懂...問人也方便給個問題訊息什麼的
不然也不知道你問題出在哪裡

grub4efi 就只是引導而以...如果是 iso 啟動...
難度還比較高因為 iso 還要 虛擬+掛載光碟 ...有可能失敗
( 原因之前討論過...雖然我在 vbox 上測都 ok )



find 儲存
單行儲存 ...只會儲第1個 find 到的...存到變數 xxx 中
find xxxxx  | set 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 分別開來
發表於 2021-7-21 14:59:30 | 顯示全部樓層
感謝.目前已成功了.
好像是我一開始用錯範本了?
uuid %@root%
kernel  /EFI/grub/ntloader uuid=%?_UUID% file=/ISO/10PE.wim
initrd  /EFI/grub/initrd.lz1

原本是如上格式去改正
WIM放哪槽都失敗.
find --set-root WIM檔 也不行
改成chainloader就好了?
find --ignore-floppies --ignore-cd /EFI/grub/ntloader | set bd= ;; echo bd=%bd%
find --ignore-floppies --ignore-cd --set-root /iso/10pe.wim
uuid ()
chainloader %bd%/EFI/grub/ntloader initrd=/EFI/grub/initrd.lz1 uuid=%?_UUID% hires=0 file=/iso/10pe.wim
發表於 2021-7-21 17:24:45 | 顯示全部樓層
本帖最後由 阿達金田一 於 2021-7-21 17:29 編輯
saiz 發表於 2021-7-21 14:59
感謝.目前已成功了.
好像是我一開始用錯範本了?

https://github.com/grub4dos/ntloader

覺的不是原本的不行
而是原本的沒 find  所以大概是 root 有問題
大概是 grub4efi 啟動後 root 的問題


至於 ntloader 看資料用 kernel 或 chainloader 都可以
個人覺的(推測) ntloader 應該是用 linux 的 啟動核心 ( kernel img )
所以正常是用 kernel 的方式加載
chainloader 其實就是2行打成一行而以
linux 的 kernel 加載
通常是一個 kernel img + initrd ( init ramdisk 也有 root disk 之意 )
所以一般是2行加載 kernel 和 initrd
你用 chainloader 其實還是加載這2個
問題在 參數 和 路徑

uuid 這大概是取得 分區 的 uuid
而 ntloader 指定 uuid
大概是指定 ntloader 要用那個 分區 啟動
( 加上後面的 file=xxxxxx 就是用 uuid 分區 的 這個 wim 啟動 )
如果是要啟動 分區上的 Windows 就不用加 file ( 最前面的 ntloader 官方資料都有寫)

你寫的

find --ignore-floppies --ignore-cd /EFI/grub/ntloader | set bd= ;; echo bd=%bd%
find --ignore-floppies --ignore-cd --set-root /iso/10pe.wim
uuid ()
chainloader %bd%/EFI/grub/ntloader initrd=/EFI/grub/initrd.lz1 uuid=%?_UUID% hires=0 file=/iso/10pe.wim
其實以下應該是一樣的
find --ignore-floppies --ignore-cd /EFI/grub/ntloader | set bd= ;; echo bd=%bd%
find --ignore-floppies --ignore-cd --set-root /iso/10pe.wim
uuid ()
kernel  /EFI/grub/ntloader uuid=%?_UUID% hires=0 file=/iso/10pe.wim
initrd  /EFI/grub/initrd.lz1

所以你原本不行大概是 root 和 uuid 的問題
這裡你用 uuid() ... 是用 () 是用了 root
這裡推測 /efi/grub/ntloader 和 /iso/10pe.wim 是1個分區
因為 uuid 應該是要用 10pe.wim 的分區所以
所以 find --set-root 10pe.wim 後接 uuid () ... 這是對的
但後面 kernel 或 chainloader 你是用 /EFI/grub/ntloader
前面可沒加 %bd% 所以預設應該是用 root 的路徑

所以 /efi/grub/ntloader 和 /iso/10pe.wim 應該是一個分區
(不然根本 chainloader 不到 /efi/grub/ntloader )
那其實大可以 find 一行就好 set bd 用不到
find --ignore-floppies --ignore-cd --set-root /iso/10pe.wim
uuid ()
kernel  /EFI/grub/ntloader uuid=%?_UUID% hires=0 file=/iso/10pe.wim
initrd  /EFI/grub/initrd.lz1

如果不同分區...2行 find 應該寫成
find --ignore-floppies --ignore-cd /EFI/grub/ntloader | set bd= ;; echo bd=%bd%
find --ignore-floppies --ignore-cd --set-root /iso/10pe.wim
uuid ()
kernel  %bd%/EFI/grub/ntloader uuid=%?_UUID% hires=0 file=/iso/10pe.wim
initrd  %bd%/EFI/grub/initrd.lz1

或是
find --ignore-floppies --ignore-cd --set-root /iso/10pe.wim
uuid ()
find --ignore-floppies --ignore-cd /EFI/grub/ntloader
kernel /EFI/grub/ntloader uuid=%?_UUID% hires=0 file=/iso/10pe.wim
initrd /EFI/grub/initrd.lz1

您需要登錄後才可以回帖 登錄 | 我要註冊

本版積分規則

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

GMT+8, 2021-9-17 00:28 , Processed in 0.224774 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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