无忧启动论坛

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

[原创] GRUB4DOS for UEFI

    [复制链接]
2461#
发表于 2022-9-6 18:20:39 | 只看该作者
这个厉害了,时代更新变化,好多老东西不太适用了。
回复

使用道具 举报

2462#
发表于 2022-9-6 18:40:09 来自手机 | 只看该作者
2011yaya2007777 发表于 2022-9-6 18:11
有没有碎片?最好截图。

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

使用道具 举报

2463#
发表于 2022-9-6 18:40:45 来自手机 | 只看该作者
算了吧,一个旧机器,不用再折腾了!
可以借鉴XORBOOT的启动方法。
回复

使用道具 举报

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

使用道具 举报

2465#
发表于 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
回复

使用道具 举报

2466#
发表于 2022-9-6 19:21:55 | 只看该作者
比如  天涯海角1216   第一次 用的 那个pe  光盘里 没有 bootx64.efi
他传的 iso壳内没有,其它机器能启动。
回复

使用道具 举报

2467#
发表于 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
回复

使用道具 举报

2468#
发表于 2022-9-10 09:48:01 | 只看该作者
本帖最后由 2011whp 于 2022-9-10 09:50 编辑

猜测   failed to load virtual disk image 含义

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

使用道具 举报

2469#
发表于 2022-9-13 20:18:37 | 只看该作者
终于等到了grub4UEFI,多谢楼主了
回复

使用道具 举报

2470#
发表于 2022-9-16 16:02:41 | 只看该作者
最近又在迁移系统,又想起好久不见的G4D了。现在居然升级为G4E了。
回复

使用道具 举报

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

使用道具 举报

2472#
发表于 2022-9-20 11:17:11 | 只看该作者
111111111111111111111111111111
回复

使用道具 举报

2473#
发表于 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命令行状态了  是那里操作有问题吗?



回复

使用道具 举报

2474#
 楼主| 发表于 2022-9-22 15:05:03 | 只看该作者
你上面的例子,可以启动静态VHD。
启动动态VHD,要加参数:  map  --mem /w11.vhd (hd)
不能启动差分VHD。

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

使用道具 举报

2475#
发表于 2022-10-2 15:59:46 | 只看该作者
g4e用wimboot提示kenrel too old

点评

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

使用道具 举报

2476#
发表于 2022-10-2 16:00:09 | 只看该作者
kenrel too old怎么解决
回复

使用道具 举报

2477#
发表于 2022-10-2 16:45:16 | 只看该作者
shabi114514 发表于 2022-10-2 15:59
g4e用wimboot提示kenrel too old

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

使用道具 举报

2478#
发表于 2022-10-2 17:24:06 | 只看该作者
真是很佩服你们这些大神,为这些没有收入的软件付出了很多很多,感谢
回复

使用道具 举报

2479#
发表于 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
回复

使用道具 举报

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

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



点评

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

使用道具 举报

2481#
发表于 2022-10-5 10:30:26 | 只看该作者
2011whp 发表于 2022-10-5 10:15
尽量用 磁盘镜像  用diskgen建立,编辑
启动镜像,最好用mbr,不和微软wbm的gpt  抢
(物理磁盘存 资料 ...

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

点评

imdisk 挂不上硬盘,是基于 扇区区段的分区  发表于 2022-10-5 10:43
回复

使用道具 举报

2482#
 楼主| 发表于 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
回复

使用道具 举报

2483#
发表于 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了

非常感謝各位!
回复

使用道具 举报

2484#
发表于 2022-10-5 22:06:17 | 只看该作者
感谢分享,学习中
回复

使用道具 举报

2485#
发表于 2022-10-6 16:53:38 | 只看该作者
加油
回复

使用道具 举报

2486#
发表于 2022-10-6 22:20:54 | 只看该作者
感谢分享
回复

使用道具 举报

2487#
发表于 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%的数字转成字符吗?)


回复

使用道具 举报

2488#
发表于 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
回复

使用道具 举报

2489#
发表于 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/
回复

使用道具 举报

2490#
 楼主| 发表于 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
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-11-28 00:49

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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