无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
楼主: wintoflash
打印 上一主题 下一主题

[原创] GRUB2 UEFI 下的磁盘仿真

    [复制链接]
121#
 楼主| 发表于 2020-11-5 17:46:00 | 显示全部楼层
liuzhaoyzz 发表于 2020-11-5 17:02
map --mem可以规避在grub4dos下面需要pe.iso连续存放的问题,而且map --mem要比直接map稳定些,p ...
grub2下面直接map pe.iso对于碎片是否有要求?

没有任何要求。
如果没有碎片(或者碎片满足一些要求),可以用 --blocklist 参数加速虚拟盘的读取。(一般没必要)
而且map --mem要比直接map稳定些,pe.iso所在的优盘可以拔除

你这是闲得无聊吧,退出grub2/grub4dos的瞬间拔u盘,不怕坏了?如果u盘读取不靠谱,建议换u盘。
进pe之后,拔不拔u盘就和grub2没什么关系了,你用啥参数都不影响。

我已经再三提醒了,不建议用 --mem,一般情况下没有任何好处,反而有坏处。
只有以下几种需求,我建议用 --mem:
1. 网启。
2. 想对虚拟磁盘进行写入,不想实际写入到硬盘的文件上。
3. 想在grub2启动 iso 之后,windows 转圈之前的那几秒之间拔掉 U 盘。这种操作要手速快。

点评

不是退出grub2/grub4dos的瞬间拔u盘啊,不是想在grub2启动 iso 之后,windows 转圈之前的那几秒之间拔掉 U 盘,是启动PE之后可以拔掉优盘啊,如果直接map,启动PE之后可能还会有读写优盘的动作吧,在BIOS启动的grub4  详情 回复 发表于 2020-11-5 18:35
回复

使用道具 举报

122#
 楼主| 发表于 2020-11-5 18:47:16 | 显示全部楼层
liuzhaoyzz 发表于 2020-11-5 18:35
不是退出grub2/grub4dos的瞬间拔u盘啊,不是想在grub2启动 iso 之后,windows 转圈之前的那几秒之间拔掉  ...

如果外置,uefi启动的情况下无论如何都不能拔掉u盘。你没有搞清楚一件事:虚拟盘在windows转圈停止之后就不存在了。无论外置不外置,Windows当然都不能从本就不存在的所谓内存盘读数据。

点评

也是!  发表于 2020-11-5 19:41
回复

使用道具 举报

123#
 楼主| 发表于 2020-11-6 22:50:05 | 显示全部楼层
hilsonma 发表于 2020-11-6 18:22
不管带不带 --mem,始终都是读一次到内存,区别只是前者先读再从内存启动,后者边启动边读。整体效率应该 ...

如果启动的是winpe,不带--mem,bootmgfw.efi会要求一块内存,把wim读到内存。
如果带--mem,grub2先要求一块内存,把winpe iso加载到内存。然后 bootmgfw 还是会要求一块内存,把wim读到内存。
所以 --mem 是要占用两倍内存。
(1) bootloader 读普通虚拟盘上的文件:
uefi block io read->grub file read->grub filesystem read->grub disk read->uefi block io read
(2) bootloader 读blocklist虚拟盘的文件:
uefi block io read->grub file read->grub disk read->uefi block io read
(3) bootloader 读内存盘上的文件:
uefi block io read->grub file read->memcpy
(4) grub2 把文件加载到内存的过程:
grub file read->grub filesystem read->grub disk read->uefi block io read

回复

使用道具 举报

124#
 楼主| 发表于 2020-11-10 18:56:19 | 显示全部楼层
liuzhaoyzz 发表于 2020-11-10 07:55
外置版的,BIOS启动,如果集成了firadisk这样的驱动,可以拔盘。xppe有集成这样的驱动的,WIN7 8 ...
xppe有集成这样的驱动的,WIN7 8 10PE好像很少见了。

都 UEFI 了,还是忘掉插屁吧。
BIOS下面,管他是否集成了firadisk这样子的驱动,我都是喜欢用map --mem,便于XPPE启动找到外置,还规避文件碎片问题,启动速度也还可以。

UEFI也有UEFI的特点。我不建议UEFI用--mem也有我的考虑。
如果map一个兼容Ventoy (https://www.ventoy.net/cn/compatible.html) 的ISO,不论是否用--mem,启动后都是可以找到外置的,当然也都不能拔盘。
回复

使用道具 举报

125#
 楼主| 发表于 2020-11-16 12:43:56 | 显示全部楼层
OHMCFXG 发表于 2020-11-13 17:52
我愿称之为最强,真的好用。不过我还在研究grub咋编译

可以看 https://github.com/a1ive/grub/bl ... workflows/build.yml

回复

使用道具 举报

126#
 楼主| 发表于 2020-11-20 09:53:45 | 显示全部楼层
hilsonma 发表于 2020-11-20 09:39
i386-pc 下的map 怎么使用?是不是跟一楼不一样的?我不管是用一楼的用法还是用help里的用法都不成功。

i386-pc 下的 map 和 efi 下的完全不一样,不支持磁盘仿真。
map 实际上是 drivemap,用于交换或屏蔽磁盘。
想启动 ISO/IMG 请用 memdisk/grub4dos,以下菜单仅供参考,不保证正确。
  1. function to_g4d_path {
  2.     unset g4d_path;
  3.     if regexp --set=1:num '^\(hd[0-9]+,[a-zA-Z]*([0-9]+)\).*' "${1}"; then
  4.         # (hdx,msdosy) (hdx,gpty) (hdx,y)
  5.         expr --set=num "${num} - 1";
  6.         regexp --set=1:path_1 --set=2:path_2 '^(\(hd[0-9]+,)[a-zA-Z]*[0-9]+(\).*)' "${1}";
  7.         set g4d_path="${path_1}${num}${path_2}";
  8.     elif regexp '^\([chf]d[0-9]*\).*' "${1}"; then
  9.         # (hd) (cd) (fd) (hdx) (cdx) (fdx)
  10.         set g4d_path="${1}";
  11.     fi;
  12. }

  13. menuentry "Boot WinPE ISO" {
  14.     set iso_file="(hd0,2)/winpe.iso";
  15.     if [ "$grub_platform" = "efi" ]; then
  16.         map -f "${iso_file}";
  17.     elif [ "$grub_platform" = "pc" ]; then
  18.         to_g4d_path "${iso_file}";
  19.         if [ -n "${g4d_path}" ]; then
  20.             set g4d_cmd="map ${g4d_path} (0xff);map --hook;chainloader (0xff);boot";
  21.             linux ${prefix}/grub.exe --config-file=${g4d_cmd};
  22.         else
  23.             set enable_progress_indicator=1;
  24.             linux16 ${prefix}/memdisk iso raw;
  25.             initrd16 "${iso_file}";
  26.         fi;
  27.         boot;
  28.     fi;
  29. }
复制代码
回复

使用道具 举报

127#
 楼主| 发表于 2020-11-20 10:25:28 | 显示全部楼层
hilsonma 发表于 2020-11-20 10:07
谢谢。现在明白了。原来是我误解了,以为 i386-pc 下的map 你也照g4d改造了。

有点难,Legacy BIOS下的东西开发难度很大,这也就是厂商去搞 UEFI 的一部分原因。如果只支持map无文件碎片的镜像,那难度低一些。如果能像efi那样随便map,那太难了。
回复

使用道具 举报

128#
 楼主| 发表于 2020-11-24 19:32:16 | 显示全部楼层
wuwuzz 发表于 2020-11-6 22:36
我和你相反,USB是我的爱好(由此发散至USB启动、BIOS/UEFI中USB启动代码...等知识点),而U盘收藏了一大 ...

grubx64.efi.zip (651.83 KB, 下载次数: 10)
试一下


回复

使用道具 举报

129#
 楼主| 发表于 2020-11-24 20:31:50 | 显示全部楼层
wuwuzz 发表于 2020-11-24 20:19
测试结果如下图:

map之后进uefi shel看看,有没有 CD(1,12b,75245) 的设备挂载到 FS0 FS1 之类的。
回复

使用道具 举报

130#
 楼主| 发表于 2020-11-24 21:02:59 | 显示全部楼层
wuwuzz 发表于 2020-11-24 21:00
有挂载,如下图

进 fs1
然后启动 \EFI\BOOT\BOOTX64.EFI 试试?
回复

使用道具 举报

131#
 楼主| 发表于 2020-11-24 21:20:28 | 显示全部楼层

那应该是UEFI有毛病,没救了。
回复

使用道具 举报

132#
 楼主| 发表于 2020-11-25 11:06:16 | 显示全部楼层
wuwuzz 发表于 2020-11-25 07:21
换了U盘,换了ISO(这次用的是微PE X64V2版,官网下载的)
AMI UEFI、Insyde UEFI均使用同一U盘、同一ISO ...

用 Ventoy 能不能在 Insyde UEFI 启动这个 ISO?
回复

使用道具 举报

133#
 楼主| 发表于 2020-11-28 12:43:01 | 显示全部楼层
wuwuzz 发表于 2020-11-25 15:54
初步看了一下,似乎用的是wimboot。

这个就与我们的主题map ISO偏离了...

grubx64.efi.zip (652.06 KB, 下载次数: 7)
试试这个。注意,要加 -a 参数。
map -a /xxx.iso
map -a -f /xxx.iso

点评

V20201128版测试结果如下: 一、ISO测试,AMI UEFI、Insyde UEFI均出现新的出错提示信息 Failed to connect DISK I/O driver Failed to connect Parttition driver [attachimg]469384[/attachimg] 但是,AMI  详情 回复 发表于 2020-11-28 18:45
回复

使用道具 举报

134#
 楼主| 发表于 2020-11-29 09:40:20 | 显示全部楼层
wuwuzz 发表于 2020-11-28 20:54
L大,您好!

一、因为这个Insyde UEFI本身问题很多,grub*  PE map一直不成功,

辛苦了,请再测试一下。
grubx64.efi.zip (652.06 KB, 下载次数: 11)
map -f /xxx.iso 和 map -a -f /xxx.iso 都要测试。


三、另外,此版本read命令失效。

我提供的这个efi文件,不带read模块。是因为你硬盘上有 read.mod,它自己加载了。由于 grub2 不能混用模块,才出现这个报错。

点评

测试结果如下: AMI UEFI成功,Insyde UEFI失败 [attachimg]469416[/attachimg] [attachimg]469417[/attachimg] [attachimg]469418[/attachimg] [attachimg]469419[/attachimg] [attachimg]4694  详情 回复 发表于 2020-11-29 11:38
回复

使用道具 举报

135#
 楼主| 发表于 2020-11-29 13:01:07 | 显示全部楼层
wuwuzz 发表于 2020-11-29 11:38
测试结果如下:
AMI UEFI成功,Insyde UEFI失败

那我暂时没有什么办法了。

点评

OK,老大辛苦了。 不知L的ventoy用了啥特殊的map方法能够成功,他似乎是另行开发了vt系列新命令...  详情 回复 发表于 2020-11-29 14:07
回复

使用道具 举报

136#
 楼主| 发表于 2020-11-29 14:52:18 | 显示全部楼层
本帖最后由 wintoflash 于 2020-11-29 14:54 编辑
wuwuzz 发表于 2020-11-29 14:07
OK,老大辛苦了。

不知L的ventoy用了啥特殊的map方法能够成功,他似乎是另行开发了vt系列新命令...

我发的测试版本用的就是类似ventoy的解决方法。说明可能另有原因。

点评

报告W大一个好消息:map ventoydsk.ima启动成功。 忽略map时failed to load image信息,手动chainloader虚拟盘上的bootx64.efi就可以。 [attachimg]469478[/attachimg] map ISO,运用同样的手法处理,直接chainlo  详情 回复 发表于 2020-11-29 23:25
回复

使用道具 举报

137#
 楼主| 发表于 2020-11-30 09:49:24 | 显示全部楼层
wuwuzz 发表于 2020-11-29 23:25
报告W大一个好消息:map ventoydsk.ima启动成功。
忽略map时failed to load image信息,手动chainloader ...

以前的版本也可以这样吗?

点评

找了一个老版本20201105,也可以这样。 结果相同:img可以成功启动,ISO进PE后出错。 [attachimg]469525[/attachimg] [attachimg]469526[/attachimg]  详情 回复 发表于 2020-11-30 18:44
报告老大另一个好消息,上面ISO出错原因 找到了:应该启动软盘上的bootx64.efi,启动光盘上的bootx64.efi就出错,见g4e 贴上的验证。map iso后,grub2 ls命令没有列出fd设备,暂无法入手。 我现在外面,老版本  详情 回复 发表于 2020-11-30 13:43
回复

使用道具 举报

138#
 楼主| 发表于 2020-11-30 19:33:32 | 显示全部楼层
2011whp 发表于 2020-11-30 18:14
安装盘标准起动序:光盘挂的软盘内的 cdboot.efi(当然改名了)下来是  bootmgr.efi 下来是bcd

Pe盘  ...

你没搞清楚我们在讨论什么,请不要干扰讨论。
回复

使用道具 举报

139#
 楼主| 发表于 2020-11-30 19:35:37 | 显示全部楼层
本帖最后由 wintoflash 于 2020-11-30 19:37 编辑
wuwuzz 发表于 2020-11-30 18:44
找了一个老版本20201105,也可以这样。
结果相同:img可以成功启动,ISO进PE后出错。

说明磁盘是虚拟成功了,但是里面的启动分区没有虚拟成功。
ISO启动报错,是因为微软傻逼,只从光盘上 Eltorito 软盘分区里面的 bootmgfw.efi 启动,否则读不了 bcd。
能不能在光盘里面塞个 shell,进 shell 再研究一下?
比如把软盘里面的 bootx64.efi 换成 shell,看看 ventoy 启动这个 ISO 之后,shell 能不能正常读取软盘里面的内容。

点评

对UEFI ISO结构不熟悉,试着改了下。 原始ISO的引导扇区情况: 其中第2段导出后是个2880K的IMG,里面有bootx64.efi [attachimg]469530[/attachimg] 将这个img改造替换shell,重新添加到ISO后,引导扇区情况:  详情 回复 发表于 2020-11-30 21:35
请等一会,我改造一下那个PE  详情 回复 发表于 2020-11-30 19:47
回复

使用道具 举报

140#
 楼主| 发表于 2020-11-30 21:43:41 | 显示全部楼层
wuwuzz 发表于 2020-11-30 21:35
对UEFI ISO结构不熟悉,试着改了下。
原始ISO的引导扇区情况:
其中第2段导出后是个2880K的IMG,里面有bo ...

fs3和fs4是什么关系?在grub2下直接map,路径是什么?(用 map -a)

点评

448#的前2张图涉及到这个,应该是制作上的问题。 原始ISO引导扇区有2段,导出后第1段是4字节文件;第2段是2880K img 修改后:第1段是我们改后的2880K img;第2段是原2880K img fs3对应的是我们修改后的IMG;  详情 回复 发表于 2020-11-30 22:07
回复

使用道具 举报

141#
 楼主| 发表于 2020-11-30 22:09:39 | 显示全部楼层
wuwuzz 发表于 2020-11-30 22:07
448#的前2张图涉及到这个,应该是制作上的问题。

原始ISO引导扇区有2段,导出后第1段是4字节文件;第2 ...

device path看起来没毛病,那真是奇怪了。
我再想想吧。
回复

使用道具 举报

142#
 楼主| 发表于 2020-12-8 17:52:26 | 显示全部楼层
测试:
grubx64.zip (637.85 KB, 下载次数: 20)
现在map时会创建类似 GRUB4DOS 的信息,以支持 SVBus。在 WinPE 下测试是可以认出 VHD 或 ISO 的。VHD 系统不会弄,没有测试。
命令:
  1. map --mem --rt /xxx.vhd
复制代码
回复

使用道具 举报

143#
 楼主| 发表于 2020-12-9 10:34:07 | 显示全部楼层
本帖最后由 wintoflash 于 2020-12-9 10:48 编辑
liuzhaoyzz 发表于 2020-12-9 07:36
VHD系统非常简单啊,怎么不会弄呢?直接用winntsetup就可以创建vhd+安装系统一条龙服务啊。
需要注意 ...
SXWIN10X64_20180609_LTSB2016_noNET.esd

你的网盘里没有这个文件啊

VHD系统非常简单啊,怎么不会弄呢?直接用winntsetup就可以创建vhd+安装系统一条龙服务啊。

主要是因为我的主系统是 Linux。弄这些东西只能到虚拟机,内存只有 8GB。
回复

使用道具 举报

144#
 楼主| 发表于 2020-12-9 10:49:12 | 显示全部楼层
本帖最后由 wintoflash 于 2020-12-9 10:50 编辑
liuzhaoyzz 发表于 2020-12-9 10:48
哦,sorry,原来是上传到了百度云盘,我立刻上传到天翼云盘上面。

发我百度链接也可以。
另外 grub2 加上vhd 模块,理论上也是可以直接启动动态vhd的。不过没怎么测试。

点评

链接: https://pan.baidu.com/s/1tIgWYzxxuB5_9Se3T9SgrA 提取码: dggd  详情 回复 发表于 2020-12-9 10:57
回复

使用道具 举报

145#
 楼主| 发表于 2020-12-9 19:02:21 | 显示全部楼层
liuzhaoyzz 发表于 2020-12-9 07:36
VHD系统非常简单啊,怎么不会弄呢?直接用winntsetup就可以创建vhd+安装系统一条龙服务啊。
需要注意 ...
安装后C盘已用3.2GB。

弄了个3.9GB的vhd,winntsetup说空间太小了,装不上。
vhd建议直接用物理机,主引导可以用bootmgfw.efi那一套文件,vhd不会影响你的linux系统,可以安装多个vhd系统,互相隔离,互不影响。
linux的话,直接用grub2引导,我想说的是,grub2x64.efi可以和bootmgfw.efi并列,是两个并列的启动项,互不影响,Bootice的引导序列可以创建的。

我不能用物理机装Win10。用虚拟机当然是为了测试。很多时候还必须得用 QEMU 开串口调试。
回复

使用道具 举报

146#
 楼主| 发表于 2020-12-9 19:56:43 | 显示全部楼层
2011whp 发表于 2020-12-9 19:53
SVbus认出了虚拟盘

注意  D盘  和  E盘  是  我建的  300MB的 img

这个我早就测试过可行了。

点评

同一个VHD,RUNTIME_SERVICES_DATA不行,RESERVED_MEMORY就可以。 哦,我那个帖子打错字了,不好意思。你看下yaya在714楼的那个帖子。 你有空的话更新grub2的map类型我来尝试下。另外发布grubx64.efi的时候,  详情 回复 发表于 2020-12-10 10:12
回复

使用道具 举报

147#
 楼主| 发表于 2020-12-10 11:12:49 | 显示全部楼层
liuzhaoyzz 发表于 2020-12-10 10:12
同一个VHD,RUNTIME_SERVICES_DATA不行,RESERVED_MEMORY就可以。

哦,我那个帖子打错字了,不好意思 ...

改了之后,实体机测试可以了,已经推送到github了,可以直接从github上下载。
grubx64.zip (637.84 KB, 下载次数: 18)
  1. map --mem --rt (hd0,2)/ramos.vhd
复制代码

测试通过
  1. map --mem --rt (hd1,4)/Downloads/ramos.vhd.xz
复制代码

测试通过
  1. map (hd0,2)/ramos.vhd
复制代码

测试蓝屏

麻烦请把xz解压缩模块内置到里面。

有啊。

点评

再反馈个问题,UEFI-WIN7+SVBUS,加载vhd没问题,过了100%,也完成了加载进度,但直接返回到菜单了。  详情 回复 发表于 2020-12-10 13:24
测试过了,这个版本,可以成功启动UEFI-RAMOS. set default=0 set fallback=1 set timeout=2 set pager=20 set grub_draw_border=1 #设定菜单字体及背景颜色 set menu_color_normal=white/black set menu_  详情 回复 发表于 2020-12-10 12:24
回复

使用道具 举报

148#
 楼主| 发表于 2020-12-10 13:25:19 | 显示全部楼层
liuzhaoyzz 发表于 2020-12-10 13:24
再反馈个问题,UEFI-WIN7+SVBUS,加载vhd没问题,过了100%,也完成了加载进度,但直接返回到菜单了。

...

控制台输命令,看报错。

点评

只有晚上看看了。  详情 回复 发表于 2020-12-10 13:26
回复

使用道具 举报

149#
 楼主| 发表于 2020-12-10 13:46:15 | 显示全部楼层
本帖最后由 wintoflash 于 2020-12-10 13:52 编辑
liuzhaoyzz 发表于 2020-12-10 13:39
VHD里面应该不需要FAT32分区吧,VHD外面可能需要FAT32分区,保存启动文件比如grubx64.efi

必须有/EFI/BOOT/BOOTX64.EFI,位于 UEFI 认可的分区里 (FAT)。
如果用 NTBOOT 启动VHD的话可以不需要这个。

点评

不是这样子的。 以我的笔记本为例,必须要一个FAT32分区用作UEFI启动才能添加UEFI序列,然后VHD之外有一个FAT32分区,VHD里面只需要一个MBR格式的NTFS分区即可。最主要的是主板→第一引导bootx64.efi要能够被识别,  详情 回复 发表于 2020-12-10 17:11
efiload那个 ntfs驱动后会不会可以认ntfs分区里的  详情 回复 发表于 2020-12-10 14:20
回复

使用道具 举报

150#
 楼主| 发表于 2020-12-10 14:35:06 | 显示全部楼层
江南一根葱 发表于 2020-12-10 14:20
efiload那个 ntfs驱动后会不会可以认ntfs分区里的

可以。那ntfs里面也得有/efi/boot/bootx64.efi啊。

点评

直接上图8GBVHD, 20GB内存,WIN7X64 逆光拍摄的看不太清楚  详情 回复 发表于 2020-12-10 17:09
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-5-3 06:11

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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