找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
楼主: 2011yaya2007777

[原创] GRUB4DOS for UEFI

   火... [复制链接]
发表于 2022-9-6 18:40:09 来自手机 | 显示全部楼层
2011yaya2007777 发表于 2022-9-6 18:11
有没有碎片?最好截图。

回车后,没有任何反应,回到菜单。
回复

使用道具 举报

发表于 2022-9-6 18:40:45 来自手机 | 显示全部楼层
算了吧,一个旧机器,不用再折腾了!
可以借鉴XORBOOT的启动方法。
回复

使用道具 举报

 楼主| 发表于 2022-9-6 18:41:40 来自手机 | 显示全部楼层
我觉得启动光盘上的bootx64.efi成功率高。我把内部修改一下,直接使用这个,再看看。
回复

使用道具 举报

发表于 2022-9-6 19:13:20 | 显示全部楼层
觉得 还是 启动 efisys.bin   的  bootx64.efi   符合 范,万一光盘,没有 bootx64.efi呢

要是   内部 改成 启动光盘上的bootx64.efi, vbox虚拟机不能启动了(ls  (0xff)/ 出错的)
还有 会不会 涉及到     map (hd),

必经是  少数 efibios 问题,不更改为好。
改菜单 范式  即可
title 启动 Win11PE64_22000.917.ISO
find --set-root /Win11PE64_22000.917.ISO
map --mem /win11pe64_22000.917.iso (0xff)
chainloader (0xff)
boot
chainloader  (0xff)/efi/boot/bootx64.efi
boot
回复

使用道具 举报

发表于 2022-9-6 19:21:55 | 显示全部楼层
比如  天涯海角1216   第一次 用的 那个pe  光盘里 没有 bootx64.efi
他传的 iso壳内没有,其它机器能启动。
回复

使用道具 举报

发表于 2022-9-6 19:54:41 | 显示全部楼层
liuzhaoyzz 发表于 2022-9-6 14:15
chainloader  (0xff)/efi/boot/bootx64.efi出错,有没有可能是g4e大小写敏感导致的呢?Efisys.bin 是 E ...

变量名 区分大小写,路径不区分大小写。

——————————————————————————————
oscdimg 两个要素
         传统代码:etfsboot.com      4KB
        UEFI代码: efisysy。bin        2.88MB
回复

使用道具 举报

发表于 2022-9-10 09:48:01 | 显示全部楼层
本帖最后由 2011whp 于 2022-9-10 09:50 编辑

猜测   failed to load virtual disk image 含义

efibios没有找到  可读取的  efi启动分区( 包括 没找到 efisys   、 ntfs分区bios默认没驱动 )
即使 找到分区,找不到文件 ,再到 efi文件不是可启动的,都会 出这个错。
回复

使用道具 举报

发表于 2022-9-13 20:18:37 | 显示全部楼层
终于等到了grub4UEFI,多谢楼主了
回复

使用道具 举报

发表于 2022-9-16 16:02:41 | 显示全部楼层
最近又在迁移系统,又想起好久不见的G4D了。现在居然升级为G4E了。
回复

使用道具 举报

发表于 2022-9-17 14:59:51 | 显示全部楼层
牛逼了,真是不容易,像一个孩子一样。随 着环境的成长不停的重先塑造他以适应新环境。真心支持。20多年了。
回复

使用道具 举报

发表于 2022-9-20 11:17:11 | 显示全部楼层
111111111111111111111111111111
回复

使用道具 举报

发表于 2022-9-22 14:28:10 | 显示全部楼层
咨询大神一个问题   我测试的加载 VHD+SVBUS启动   这个过程是正常没有问题的  UUID也可以看到盘 系统正常进桌面
版本是:2022-09-15这样加载的
find --set-root /w11.vhd
map /w11.vhd (hd)
chainloader (hd-1)
boot

用Diskpart  和 bootice和其它工具  创建出来的差异  W111.vhd  照上面的指令执行完没有出错  但查询UUID没有增加盘出来  boot又重启GRUB4DOS命令行状态了  是那里操作有问题吗?



回复

使用道具 举报

 楼主| 发表于 2022-9-22 15:05:03 | 显示全部楼层
你上面的例子,可以启动静态VHD。
启动动态VHD,要加参数:  map  --mem /w11.vhd (hd)
不能启动差分VHD。

差分VHD,可以试一试:
NTBOOT for uefi
回复

使用道具 举报

发表于 2022-10-2 15:59:46 | 显示全部楼层
g4e用wimboot提示kenrel too old

点评

不支持。 wimboot只能用ipxe加载。  详情 回复 发表于 2022-10-2 16:45
回复

使用道具 举报

发表于 2022-10-2 16:00:09 | 显示全部楼层
kenrel too old怎么解决
回复

使用道具 举报

发表于 2022-10-2 16:45:16 | 显示全部楼层
shabi114514 发表于 2022-10-2 15:59
g4e用wimboot提示kenrel too old

不支持。
wimboot只能用ipxe加载。
回复

使用道具 举报

发表于 2022-10-2 17:24:06 | 显示全部楼层
真是很佩服你们这些大神,为这些没有收入的软件付出了很多很多,感谢
回复

使用道具 举报

发表于 2022-10-4 18:31:55 | 显示全部楼层
本帖最后由 saiz 于 2022-10-4 23:12 编辑

請問下.我更新了IFU.img成3.55版了但原本可行的指令就不成功了
會跳回開機主選單
但此檔可直接在Qemu中開機
Qemu 在Grub2中也可開機
Qemu 透過grub4dos UEFI 2022-9-15無法開機?
指令是
map IFU.img(hd)
chainloader (hd-1)

IFU.zip

934.69 KB, 下载次数: 10, 下载积分: 无忧币 -2

点评

尽量用 磁盘镜像 用diskgen建立,编辑 启动镜像,最好用mbr,不和微软wbm的gpt 抢 (物理磁盘存 资料:无所谓 mbr GPT) [attachimg]508652[/attachimg]  详情 回复 发表于 2022-10-5 10:15
回复

使用道具 举报

发表于 2022-10-5 10:15:42 | 显示全部楼层
saiz 发表于 2022-10-4 18:31
請問下.我更新了IFU.img成3.55版了但原本可行的指令就不成功了
會跳回開機主選單
但此檔可直接在Qemu中開 ...

尽量用 磁盘镜像  用diskgen建立,编辑
启动镜像,最好用mbr,不和微软wbm的gpt  抢
(物理磁盘存 资料:无所谓 mbr  GPT)

屏幕截图 2022-10-05 101117.png

点评

我用的是原ISO檔拉出來的IMG而已 檔案不是我建立的.. 我只有掛imdisk 改下設定而已 我再試試自己建一個  详情 回复 发表于 2022-10-5 10:30
回复

使用道具 举报

发表于 2022-10-5 10:30:26 | 显示全部楼层
2011whp 发表于 2022-10-5 10:15
尽量用 磁盘镜像  用diskgen建立,编辑
启动镜像,最好用mbr,不和微软wbm的gpt  抢
(物理磁盘存 资料 ...

我用的是原ISO檔拉出來的IMG而已
檔案不是我建立的..
我只有掛imdisk 改下設定而已
我再試試自己建一個
回复

使用道具 举报

 楼主| 发表于 2022-10-5 15:47:35 | 显示全部楼层
請問下.我更新了IFU.img成3.55版了但原本可行的指令就不成功了

你这个IFU.img是软盘镜像,当然不能使用以下方法启动:
map /IFU.img (hd)
chainloader (hd-1)
以前那个3.52版本是硬盘镜像,可以使用此变通方法启动。

正确启动的方法是:
map /IFU355.ISO (cd)
chainloader (cd-1)

以前不能启动IFU352.ISO的问题,grub4dos UEFI 2022-9-15已经解决。

点评

原來如此@@ 我在qemu中是用磁碟鏡像啟動OK QEMU中以GRUB2也是 沒修改能啟動 menuentry "3. 磁碟備份還原工具 TeraByte Image For UEFI" --class recovery --hotkey=3{ set isofile="$isodir/ISO/IFU.img"  详情 回复 发表于 2022-10-5 16:16
回复

使用道具 举报

发表于 2022-10-5 16:16:03 | 显示全部楼层
2011yaya2007777 发表于 2022-10-5 15:47
你这个IFU.img是软盘镜像,当然不能使用以下方法启动:
map /IFU.img (hd)
chainloader (hd-1)

原來如此@@
我在qemu中是用磁碟鏡像啟動OK
QEMU中以GRUB2也是 沒修改能啟動
menuentry "3. 磁碟備份還原工具 TeraByte Image For UEFI"  --class recovery --hotkey=3{
                set isofile="$isodir/ISO/IFU.img"
                echo "讀取中...請耐心等候..."
                map --type=HD $isofile
                boot
}
我還以為只是相容性問題...
結果也是照2011whp大大所說
用diskgenius建個IMG硬碟映像來啟動
就OK了

非常感謝各位!
回复

使用道具 举报

发表于 2022-10-5 22:06:17 | 显示全部楼层
感谢分享,学习中
回复

使用道具 举报

发表于 2022-10-6 16:53:38 | 显示全部楼层
回复

使用道具 举报

发表于 2022-10-6 22:20:54 | 显示全部楼层
感谢分享
回复

使用道具 举报

发表于 2022-10-8 10:01:14 | 显示全部楼层
本帖最后由 sunsea 于 2022-10-8 10:08 编辑

请教一下,菜单区如何达成if条件为真后执行【一组】命令?
我目前的写法,能达到目的的:
  1. pause --wait=5 等你5秒,按W加载可读写ntfs驱动,按R加载只读ntfs驱动,不按键或者其他键不加载。两个驱动都是测试性的!如果有快速启动等功能不要加载!
  2. # r 0x72 114 w 0x77 119
  3. set tempbuf=%@retval%
  4. if "%tempbuf%"=="114" load /efi/grub/ntfs_x64.efi
  5. if "%tempbuf%"=="114" echo 检测到您按了R,加载只读驱动……
  6. if "%tempbuf%"=="119" load /efi/grub/ntfs_x64_rw.efi
  7. if "%tempbuf%"=="119" echo 检测到您按了W,加载可读写驱动……(测试性!)
复制代码

如果这么写,会让后面的提示信息无条件漏出来:
  1. pause --wait=5 等你5秒,按W加载可读写ntfs驱动,按R加载只读ntfs驱动,不按键或者其他键不加载。两个驱动都是测试性的!如果有快速启动等功能不要加载!
  2. # r 0x72 114 w 0x77 119
  3. set tempbuf=%@retval%
  4. if "%tempbuf%"=="114" load /efi/grub/ntfs_x64.efi ;; echo 检测到您按了R,加载只读驱动……
  5. if "%tempbuf%"=="119" load /efi/grub/ntfs_x64_rw.efi ;; echo 检测到您按了W,加载可读写驱动……(测试性!)
复制代码

使用括号把两个命令括住似乎不起作用。以及似乎在虚拟机上pause执行后和读秒之间有一空隙,此时按键不起作用(%@retval%录不到按键)

(以及有什么命令可以把%@retval%的数字转成字符吗?)


回复

使用道具 举报

发表于 2022-10-8 12:04:47 | 显示全部楼层
本帖最后由 2011whp 于 2022-10-8 12:16 编辑

if "%tempbuf%"=="114" load /efi/grub/ntfs_x64.efi ;; echo 检测到您按了R,加载只读驱动……
改为:if "%tempbuf%"=="114" && echo 检测到您按了R,加载只读驱动……  && load /efi/grub/ntfs_x64.efi
解释:
  @retval的值  每执行一条命令,会被重置。(紧跟 在命令后使用)
   if "%tempbuf%"=="114" load /efi/grub/ntfs_x64.efi  是 一句,不是两句
   行内分块:  ;; 代表无条件 执行下一句     (续真&& 续假|| 续非! 续非假&;  续假|;  分句;;)




在用的一个选择菜单:供参考

!BAT
clear
echo -P:0315      $[0x9c]iso启动方案选择(%~1)
echo -P:0410 =====================================
echo -P:0610  1.  ISO    加载内存启动(svbus必用)
echo -P:0710  2.  ISO 不 加载内存启动()
echo -P:0810  3.  备用
echo -P:0910  4.  备用
echo -P:1010  5.  备用
echo -P:1210 =====================================
echo -P:1310 选 序号 启动:
pause --test-key --wait=40 > nul
echo %@retval% | set aa=
set /a aa=%aa%-48 > nul
echo -P:1325 $[0x9c]%aa%
pause && clear

set wfile=%~1
if "%aa%"=="1"  goto :start1
if "%aa%"=="2"  goto :start2
if "%aa%"=="3"  goto :start3
if "%aa%"=="4"  goto :start4
if "%aa%"=="5"  goto :start5
exit

:start1
clear
echo %wfile% 的  加载内存启动(svbus必用)
map --mem --top %wfile% (0xff)
chainloader (0xff)
boot
exit
回复

使用道具 举报

发表于 2022-10-10 20:32:38 | 显示全部楼层
本帖最后由 wintoflash 于 2022-10-10 20:50 编辑

关于 grub4efi 对 Linux 内核支持的改进,我想征求一下 yaya 和大家的意见。
UEFI 下启动 Linux 内核,有很多种方式。

1. 传统的 32 位启动协议 (32-bit Boot Protocol)
这种方式下 Linux 接管时,已经退出了 UEFI 启动服务,Linux 获取不到 UEFI 系统表指针,因此 Linux 启动后无法调用 UEFI 运行时服务。
这种方式的实现也比较复杂,主流 Linux 发行版都没有采用这种方法,因此不予考虑。

2. 64 位启动协议 (64-bit Boot Protocol)
缺点同上,而且不支持 32 位 Linux。

3. EFI 交接协议 (EFI Handover Protocol)
grub4efi 目前使用的就是这种方式。将内核加载到内存后直接跳转到对应位数(32/64)下的入口,同时传递镜像句柄,UEFI 系统表和 Linux 启动参数。
EFI Handover Protocol 目前已经被主线 Linux 废弃:
NOTE: The EFI Handover Protocol is deprecated in favour of the ordinary PE/COFF
entry point, combined with the LINUX_EFI_INITRD_MEDIA_GUID based initrd loading protocol (refer to [0] for an example of the bootloader side of this), which removes the need for any knowledge on the part of the EFI bootloader regarding the internal representation of boot_params or any requirements/limitations regarding the placement of the command line and ramdisk in memory, or the placement of the kernel image itself.

而且这种方式需要内核自己进行重定位。在有些电脑上启动 ntloader 出现问题,就是因为 ntloader 没有进行 self-relocation 导致的。

4. 直接当作 EFI 可执行程序进行启动
这种方式下,我们不用操心内核的加载/重定位,直接把它交给固件来做。我们只要在 initrd 加载到内存后通过某种方式告诉内核就行了。
Linux 官方给出的方法是 initrd loading protocol。bootloader 实现一个 EFI_LOAD_FILE2_PROTOCOL,Vendor GUID 设为 EFI_INITRD_MEDIA_GUID,内核就会自己找到这个 protocol,来读内存中的 initrd。目前 u-boot 使用的就是这种方法。grub2 官方也在考虑支持这种方式。
iPXE 使用的方式是实现一个 EFI_SIMPLE_FILE_SYSTEM_PROTOCOL,把它对应的句柄传给内核,这样内核就能加载上面的 initrd。

目前 grub4efi 支持方法 3,但是方法 3 已经被 Linux 官方废弃,将来有可能会删掉。
因此我考虑改为用方法 4 启动 Linux 内核,弄一个 EFI_LOAD_FILE2_PROTOCOL 来加载 initrd。
这样会造成一定程度的不兼容,就是 64 位 EFI 下不能启动 32 位 Linux (反之亦然)。不过不支持方法 3 的发行版要比不支持方法 4 的发行版要多。
不知道 yaya 有没有什么看法?

-----------------------
u-boot 相关实现:https://github.com/u-boot/u-boot ... cc3a5d717d4739b0fd0
Linux 官方已经在讨论默认取消 EFI Handover Protocol 支持:https://lore.kernel.org/lkml/Y0GOKnD89SOjGzCf@nazgul.tnic/t/
回复

使用道具 举报

 楼主| 发表于 2022-10-11 07:12:57 | 显示全部楼层
@wintoflash
你这方面了解的多,你认为怎样好就怎样办。
我个人认为,只要能满足功能,实现起来越简单越好。看来启动 Linux 类型的 PE/COFF 只能是方法 4 了。

我不清楚,由 UEFI 固件启动 Linux 操作系统,按规范传递了 UEFI 系统表,就将控制权交给 Linux 操作系统了,它不进行 self-relocation ?要求 UEFI 固件实现一个 EFI_LOAD_FILE2_PROTOCOL ?
似乎是使用 kernel 和 initrd 加载 Linux 的 PE/COFF,才由 Linux 自己折腾吧。

点评

假如内核和 initrd 不在 ESP 分区,那么内核是无法通过 UEFI 读取 initrd 的。 这样就需要某个约定俗成的方法,预先把 initrd 加载到内存,再告诉内核。 方法四,其实和 chainloader 启动 efi 程序一样,只是 St  详情 回复 发表于 2022-10-11 10:12
回复

使用道具 举报

发表于 2022-10-11 10:12:18 | 显示全部楼层
2011yaya2007777 发表于 2022-10-11 07:12
@wintoflash
你这方面了解的多,你认为怎样好就怎样办。
我个人认为,只要能满足功能,实现起来越简单越 ...

假如内核和 initrd 不在 ESP 分区,那么内核是无法通过 UEFI 读取 initrd 的。
这样就需要某个约定俗成的方法,预先把 initrd 加载到内存,再告诉内核。

方法四,其实和 chainloader 启动 efi 程序一样,只是 StartImage 前面多了一步加载 initrd。这个是固件提供的功能,固件会做好重定位的。

但是目前用的方法三 (EFI Handover Protocol),是启动管理器把内核随便加载到哪个位置,直接暴力跳转进去,要 Linux 内核自己再进行重定位。

将来的 Linux 发行版有可能不再支持方法三,只能按方法四当成 efi 程序启动了。

点评

EFI Handover Protocol/Loadfile2看了你的介绍似乎以后在linux内核方面是只能二选一是吧? 那么对于g4e,对于我们这样子的最终用户,我们期待的是不改菜单(或者少量修改),未来用最新版g4e/grub2能否自动适配两  详情 回复 发表于 2023-4-6 15:10
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1|闽公网安备35020302032614号 )

GMT+8, 2026-8-12 01:32

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表