无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
楼主: 2011yaya2007777

[原创] GRUB4DOS for UEFI

    [复制链接]
发表于 2020-11-5 12:21:08 | 显示全部楼层
本帖最后由 longpanda 于 2020-11-5 13:48 编辑

关于 UEFI 下 map ISO 之后 和 系统中的光驱冲突的问题。Ventoy 使用了下面的方法,放在这里仅供楼主参考。

在启动之前 hook 系统BootService中的 LocateHandle 接口,在这个接口中,对于获取 BlockIO Handle的情况,把前面 map ISO时生成的那个 handle 排到第一位貌似就可以骗过 bootmgr.efi。

代码在  https://github.com/ventoy/Ventoy ... toyProtocol.c#L1218

在虚拟机环境下测试没问题。 实际机器的话,收到过1个网友的反馈,U盘有量产CDROM的情况下测试OK了。但没有更多的测试反馈。


评分

参与人数 1无忧币 +10 收起 理由
liuzhaoyzz + 10 很给力!

查看全部评分

回复

使用道具 举报

发表于 2020-11-5 13:03:26 | 显示全部楼层
wuwuzz 发表于 2020-11-5 11:24
呃,量产那是固件范畴,是另外一个庞大的话题,就是因为它,我的知识结构、对事情的看法
才脱胎换骨,不 ...

我指的是量产出的cdrom并不能营造真实USB光驱环境
还是有区别的

点评

对USB光驱启动而言,没区别,或者说,足够了。BIOS/UEFI并无特别的方法去区分两者物理上的不同,就是按规范发固件命令,命令结果一样,BIOS/UEFI就认为两者一样。  详情 回复 发表于 2020-11-5 13:14
回复

使用道具 举报

发表于 2020-11-5 13:14:08 来自手机 | 显示全部楼层
江南一根葱 发表于 2020-11-5 13:03
我指的是量产出的cdrom并不能营造真实USB光驱环境
还是有区别的

对USB光驱启动而言,没区别,或者说,足够了。BIOS/UEFI并无特别的方法去区分两者物理上的不同,就是按规范发固件命令,命令结果一样,BIOS/UEFI就认为两者一样。
回复

使用道具 举报

发表于 2020-11-5 13:23:00 | 显示全部楼层
wuwuzz 发表于 2020-11-5 10:47
哈,原因很简单,巧合。要不是L版你,事情还进展不到测试map -x呢,
我之前压根就不知道新增了这个选项。
...

又试了下,ventoy 的 hook LocateHandle 的方法可行。
我昨天可能是喝多了。
回复

使用道具 举报

发表于 2020-11-5 13:23:28 | 显示全部楼层
我刚初学,请教各位大佬前辈,怎么启动启动 bootmgfw.efi 文件,然后启动装好的系统,谢谢呀
chainloader /EFI/Microsoft/Boot/bootmgfw.efi
没反应呢

点评

title /EFI/Microsoft/Boot/bootmgfw.efi find --set-root /EFI/Microsoft/Boot/bootmgfw.efi chainloader /EFI/Microsoft/Boot/bootmgfw.efi  详情 回复 发表于 2020-11-6 13:29
回复

使用道具 举报

发表于 2020-11-5 14:38:27 | 显示全部楼层
wuwuzz 发表于 2020-11-5 10:47
哈,原因很简单,巧合。要不是L版你,事情还进展不到测试map -x呢,
我之前压根就不知道新增了这个选项。
...

       哦,原来是这样子的。但是改造iso解决的办法,不是根本解决问题之道。还是从引导器层面解决更好,不然还要规避这样子的问题,比如就有人有真实光驱。
回复

使用道具 举报

 楼主| 发表于 2020-11-5 15:02:58 | 显示全部楼层
本帖最后由 2011yaya2007777 于 2020-11-5 15:04 编辑
CD+DISK,光驱在前时,DISK上的g4d不能顺利启动到menu,直接进入g4d shell状态,原因不明。

菜单在光盘上,还是在引导软盘镜像上?应当在光盘上。
一、当机器本身就有PE光盘(SATA或USB光驱,均使用MS的boot*.efi),此时,g4d再map U盘上
的其他PE ISO, map可以成功,但chainloader是失败的

麻烦你再试一试这个。
先在命令行执行:
debug 3
root
find
然后再 map ......
不用改造PE ISO,使用mkisofs重做。

BOOTX64.rar

133.09 KB, 下载次数: 25, 下载积分: 无忧币 -2

点评

怎么这个版本,连普通的pe.iso都启动不了了?  详情 回复 发表于 2020-11-5 15:46
回复

使用道具 举报

发表于 2020-11-5 15:46:09 | 显示全部楼层
2011yaya2007777 发表于 2020-11-5 15:02
菜单在光盘上,还是在引导软盘镜像上?应当在光盘上。

麻烦你再试一试这个。

       怎么这个版本,连普通的pe.iso都启动不了了?


GPT-TEST-2020-11-05-15-40-28.png
回复

使用道具 举报

发表于 2020-11-5 16:03:45 | 显示全部楼层
我也是遇到同样的问题
IMG_20201105_155628.jpg
回复

使用道具 举报

 楼主| 发表于 2020-11-5 16:33:06 来自手机 | 显示全部楼层
我实机测试正常。请增加 debug 3测试后截图。

点评

忘了上图了。  详情 回复 发表于 2020-11-5 16:47
回复

使用道具 举报

发表于 2020-11-5 16:47:49 | 显示全部楼层
本帖最后由 liuzhaoyzz 于 2020-11-5 16:51 编辑
2011yaya2007777 发表于 2020-11-5 16:33
我实机测试正常。请增加 debug 3测试后截图。

忘了上图了。虚拟机只有一个GPT分区的虚拟硬盘,(hd0,0)是ESP分区,(hd0,1)是第二个NTFS主分区。(0xa0)应该是挂载了WEPE.ISO的光驱。


GPT-TEST-2020-11-05-16-47-19.png
回复

使用道具 举报

 楼主| 发表于 2020-11-5 17:04:32 | 显示全部楼层
本帖最后由 2011yaya2007777 于 2020-11-5 17:05 编辑

你的光盘启动镜像是硬盘模式?怎么那么大,一个是 0x18d2d, 一个是 0x36b0b 扇区?
按光盘规范,视乎尺寸只有 2 字节。

点评

虚拟机里面挂载的光驱是微PE2.0X64,196MB。还有个仿真出来的光盘是438MB。 其他的我不懂  详情 回复 发表于 2020-11-5 19:52
回复

使用道具 举报

发表于 2020-11-5 19:07:44 | 显示全部楼层
本帖最后由 wuwuzz 于 2020-11-5 19:31 编辑

抱歉,下午单位组织学习,未及时看到帖子回复。

@2011yaya2007777

1、菜单在磁盘上。U盘量产后,相当于是变成2个物理设备,第1设备是光驱,放win10PE;
第2设备是磁驱,放g4d(含菜单),也放了其他供测试用的ISO。G4D for UEFI如何做光盘启动,
我还不会,所以菜单是放在磁盘上的。


2、新版G4D测试结果如下:

图1是真实的外置USB光驱、SATA光驱均存在的环境中,U盘MAP的情况。(此U盘未量产,是单独的磁驱)
G4D1.jpg


图2是构造了更复杂的环境,除了上面的光驱环境,又增加了量产USBCD,然后U盘DISK部分MAP的情景。
G4D2.jpg

回复

使用道具 举报

发表于 2020-11-5 19:13:41 | 显示全部楼层

@wintoflash

新增的map -f选项有效,能够成功将U盘上的ISO与其他光驱ISO区分开。

示例图是有意构造的复杂干扰环境:

USB光驱+SATA光驱+量产光驱都存在的条件下,U盘DISK部分MAP时的情况。
grub2OK.jpg
回复

使用道具 举报

发表于 2020-11-5 19:52:02 | 显示全部楼层
2011yaya2007777 发表于 2020-11-5 17:04
你的光盘启动镜像是硬盘模式?怎么那么大,一个是 0x18d2d, 一个是 0x36b0b 扇区?
按光盘规范,视乎尺寸 ...

虚拟机里面挂载的光驱是微PE2.0X64,196MB。还有个仿真出来的光盘是438MB。
其他的我不懂

回复

使用道具 举报

 楼主| 发表于 2020-11-5 20:02:37 来自手机 | 显示全部楼层
这个PE2.0X64比较小,如果不能启动这个盘,可否压缩发上来?

点评

https://cloud.189.cn/t/6VvmQvV3EFvy 微PE2.0 在虚拟机里面随便挂载一个PE都可以测试啊。 本地硬盘设置优先引导PE1.ISO,虚拟机里面挂载另一个wepe2.0.iso,就能重现问题。  详情 回复 发表于 2020-11-5 20:54
似乎不同的ISO,都不能启动,出错信息也都一样:boot_image_handle not found 参考图见#226  详情 回复 发表于 2020-11-5 20:10
回复

使用道具 举报

发表于 2020-11-5 20:10:59 | 显示全部楼层
2011yaya2007777 发表于 2020-11-5 20:02
这个PE2.0X64比较小,如果不能启动这个盘,可否压缩发上来?

似乎不同的ISO,都不能启动,出错信息也都一样:boot_image_handle not found
参考图见#226
回复

使用道具 举报

 楼主| 发表于 2020-11-5 20:17:25 来自手机 | 显示全部楼层
那发一个不能启动的光盘镜像,把里面与启动无关的文件删除,以便缩小体积。
回复

使用道具 举报

发表于 2020-11-5 20:34:17 | 显示全部楼层
上传1个测试ISO testiso.7z (1.86 MB, 下载次数: 43)
回复

使用道具 举报

发表于 2020-11-5 20:54:37 | 显示全部楼层
2011yaya2007777 发表于 2020-11-5 20:02
这个PE2.0X64比较小,如果不能启动这个盘,可否压缩发上来?

https://cloud.189.cn/t/6VvmQvV3EFvy
微PE2.0
在虚拟机里面随便挂载一个PE都可以测试啊。
本地硬盘设置优先引导PE1.ISO,虚拟机里面挂载另一个wepe2.0.iso,就能重现问题。
回复

使用道具 举报

 楼主| 发表于 2020-11-5 21:15:46 | 显示全部楼层
问题找到了。是启动光盘制作不规范。请问,是所以什么软件制作的?

点评

我的z.iso是用mkisofs 制作的,出错信息同样是boot_image_handle not found iso制作脚本如下: 请问怎样制作才规范?  详情 回复 发表于 2020-11-6 16:45
不知道微PE打包ISO用的是什么软件。  详情 回复 发表于 2020-11-6 11:59
回复

使用道具 举报

 楼主| 发表于 2020-11-5 21:50:13 来自手机 | 显示全部楼层
想当年,不点耗费大量的时间和精力排除bug,而这些bug好大一部分是由于不符合规范引起的。当年主要是对付U盘,int13/8返回的chs值不正确。而是一些小软件制作的光盘,软盘镜像不规范。MBR有个活动分区标志,就是不设置。文件系统表示不为0,偏要设置为0。等等数不胜数。

点评

uefi启动的光盘就没几个是规范的。特别操蛋。  详情 回复 发表于 2020-11-5 21:52
回复

使用道具 举报

发表于 2020-11-5 21:52:41 | 显示全部楼层
2011yaya2007777 发表于 2020-11-5 21:50
想当年,不点耗费大量的时间和精力排除bug,而这些bug好大一部分是由于不符合规范引起的。当年主要是对付U ...

uefi启动的光盘就没几个是规范的。特别操蛋。
回复

使用道具 举报

发表于 2020-11-5 22:13:09 来自手机 | 显示全部楼层
原始ISO是从网上找的,制作软件未知。
删除不必要文件缩小体积、再保存时,用的ultraISO。
回复

使用道具 举报

发表于 2020-11-5 22:50:18 | 显示全部楼层
看到很多大神出来冒泡,兴奋啊~    期待继续完善了~   
回复

使用道具 举报

发表于 2020-11-6 11:59:21 | 显示全部楼层
2011yaya2007777 发表于 2020-11-5 21:15
问题找到了。是启动光盘制作不规范。请问,是所以什么软件制作的?

      不知道微PE打包ISO用的是什么软件。  
回复

使用道具 举报

发表于 2020-11-6 13:29:54 | 显示全部楼层
yizhen 发表于 2020-11-5 13:23
我刚初学,请教各位大佬前辈,怎么启动启动 bootmgfw.efi 文件,然后启动装好的系统,谢谢呀
chainloader  ...

title /EFI/Microsoft/Boot/bootmgfw.efi
find --set-root /EFI/Microsoft/Boot/bootmgfw.efi
chainloader /EFI/Microsoft/Boot/bootmgfw.efi

回复

使用道具 举报

发表于 2020-11-6 15:48:58 | 显示全部楼层
本帖最后由 sunsea 于 2020-11-6 15:51 编辑

做个了个小测试,在2016 LTSB的内核环境里成功读到了UEFI变量。
TIM截图20201106134220.png 读了一下PlatformLangCodes这个UEFI Spec中规定的Globally Defined Variables。

只要命名空间的GUID明确而且有EFI_VARIABLE_RUNTIME_ACCESS 这个属性应该都可以读到,我是觉得可能map的时候设置一下EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,这两个属性都要比较好。
下一步就是看看SVBus处理磁盘映射的时候读了什么信息然后做针对性修改了。


回复

使用道具 举报

发表于 2020-11-6 15:59:39 | 显示全部楼层
前来围观 前景看好
回复

使用道具 举报

 楼主| 发表于 2020-11-6 16:04:36 | 显示全部楼层
本帖最后由 2011yaya2007777 于 2020-11-6 16:08 编辑
上传1个测试ISO

麻烦你在简单的,复杂的环境测试一下,我这里可以从众多 cdrom 中选择任意一个引导。

现在除了可以启动 map 的虚拟盘,也可以启动实体盘了。
比如已经有了 cd0:
map /a.iso (cd1)
chainloader (cd0)  或者 chainloader (cd1)
boot

另外,增加了一个函数 exit_image,退回引导管理器,或者父 uefi image。

BOOTX64.EFI.txt

376 KB, 下载次数: 61, 下载积分: 无忧币 -2

点评

一、简单环境测试未通过,因此未进行复杂环境测试。 直接chainloader实体机boot失败,现象与11月5日测试版雷同; [attachimg]468011[/attachimg] map优盘上的ISO,再chainloadr和boot,将启动实体USB光驱内容  详情 回复 发表于 2020-11-6 18:05
还是不行啊。  详情 回复 发表于 2020-11-6 16:36
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-3-29 18:14

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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