无忧启动论坛

 找回密码
 注册
搜索
最纯净的「微PE装机优盘」UEPON大师作品系统gho:最纯净好用系统下载站数据恢复、数据保护、视频编辑
Win To Go 极致利器(IXUNCIS固态U盘)无忧启动网成立20周年!广告联系 QQ:184822951 微信:wuyouceo
查看: 35091|回复: 497

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

    [复制链接]
发表于 2019-11-3 09:27:39 | 显示全部楼层 |阅读模式
本帖最后由 wintoflash 于 2020-11-5 13:27 编辑

本帖内容不再更新。愿意改进的可以到GitHub发PR和issue。
-----------------------------------------------------------------------

grub2   下载:
https://github.com/a1ive/grub/releases/tag/latest
若下载慢可用 http://gitd.cc/ 下载
使用方法:
  1. map [--pause] [--mem] [--type=CD|HD|FD] FILE
  2.     -m, --mem  加载到内存
  3.     --rt 指定内存盘在操作系统加载后不被释放
  4.     -l, --blocklist 强制转换为 blocklist 格式可写磁盘
  5.     -t, --type  指定虚拟盘类型
  6.          --type=CD  指定为光盘,块大小为2048
  7.          --type=HD  指定为硬盘,块大小为512
  8.          --type=FD  指定为软盘,块大小为512
  9.     -o, --ro  紧用虚拟盘写入支持
  10.     -n, --nb  加载虚拟盘后不立即启动
  11.     -x, --unmap=DEVICE 屏蔽某设备
  12.     -f, --first 使该设备位于磁盘列表的第一位
复制代码

示例:

  1. #未指定虚拟盘类型时,map 会自动判断磁盘类型。
  2. map /winpe.iso
  3. #加载到内存  如果是网启,请使用此参数
  4. map --mem --type=CD /wepe_64.iso
  5. #加载某磁盘/分区为虚拟盘
  6. map --type=HD (hd0)
  7. #加载VHD文件,支持动态VHD。
  8. vhd vhd0 /test.vhd
  9. map --type=HD (vhd0)
复制代码

深度录屏_选择区域_20191103084431.gif
示例定制命令:
  1. grub-mkimage -d x86_64-efi -p /boot/grub -o grubx64.efi -O x86_64-efi acpi affs afs all_video bfs bitmap bitmap_scale blocklist boot bsd btrfs cat chain cmp commandline configfile cpio crc date datehook dd disk dm_nv echo efi_gop efi_uga efifwsetup efiload eval exfat expr ext2 extcmd f2fs fat fb file font fshelp getenv getkey gfxmenu gfxterm gfxterm_background gfxterm_menu gptsync gzio halt hashsum help hexdump hfs hfsplus iso9660 jfs jpeg keystatus legacycfg linux linuxefi loadbios loadenv loopback ls lsacpi lua lvm lzopio mdraid09 mdraid09_be memdisk minicmd multiboot multiboot2 newc normal ntfs part_apple part_bsd part_gpt part_msdos partnew parttool png probe progress raid5rec raid6rec random read reboot regexp reiserfs sbpolicy search setenv shell sleep squash4 syslinuxcfg tar terminal terminfo test tga time true udf vhd video video_colors video_fb videoinfo wimboot xfs xnu xzio zfs map
复制代码

附注:
  硬盘镜像支持MBR分区表和GPT分区表。
鸣谢:
参考了以下项目的代码,感谢相关作者的开源。
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=414814
http://www.lab-z.com/stu132rd
https://gitlab.com/Jay_Repos/grub2eh/tree/wip
https://github.com/tianocore/edk2
https://sourceforge.net/projects/gnu-efi
https://github.com/ipxe/wimboot
源码:
https://github.com/a1ive/grub
许可协议:GPL v3

评分

参与人数 31无忧币 +154 收起 理由
小贝贝 + 5 很给力!
蓝星明月 + 5 很给力!
johnyou + 3 赞一个!
jneny + 5
xman00 + 5 赞一个!
2012kwy + 5 很给力!
jack612 + 1 很给力!
dido0379 + 5 好东西终于出来了。
2011yaya2007777 + 5 很给力!
826773297 + 5 赞一个!
longhai2018 + 5 很给力!
adef + 5
ht1021873332 + 5 很给力!
879792799 + 5 赞一个!
liaonf + 5 很给力!
bardlet + 5 神马都是浮云
wuxin9712 + 5 很给力!
lhb9900 + 5 很给力!
dian + 5 很给力!
282198284 + 5 建议和原作者一样,加一个外置配置文件
zhangmi + 5 很给力!
jxdeng2017 + 5 里程碑!很给力!
liuzhaoyzz + 10 很给力!
纯脆entropy + 5 很给力!
freesoft00 + 5
hilsonma + 5 很给力!
sghihor + 5
ddsony + 5 很给力!
ksafei + 5 赞一个!
jdcgzb + 5 很给力!

查看全部评分

发表于 2019-11-3 09:55:39 | 显示全部楼层
回复

使用道具 举报

发表于 2019-11-3 09:56:37 | 显示全部楼层
再顶
回复

使用道具 举报

发表于 2019-11-3 10:04:04 | 显示全部楼层
谢谢分享
回复

使用道具 举报

发表于 2019-11-3 10:29:18 | 显示全部楼层
谢谢分享
回复

使用道具 举报

发表于 2019-11-3 10:44:41 | 显示全部楼层
谢谢,給力
回复

使用道具 举报

发表于 2019-11-3 11:42:03 | 显示全部楼层
GRUB2 功能的又一次创新和突破,感谢分享
回复

使用道具 举报

发表于 2019-11-3 14:27:12 | 显示全部楼层
map /winpe.iso,测试fat32分区中的ISO成功启动。NTFS分区中的ISO失败,是要加什么参数吗

点评

加--pause参数,截图看一下 map --pause /xxx.iso  详情 回复 发表于 2019-11-3 14:32
回复

使用道具 举报

 楼主| 发表于 2019-11-3 14:32:36 | 显示全部楼层
本帖最后由 wintoflash 于 2019-11-3 15:04 编辑
ksafei 发表于 2019-11-3 14:27
map /winpe.iso,测试fat32分区中的ISO成功启动。NTFS分区中的ISO失败,是要加什么参数吗


加--pause参数,截图看一下
map --pause /xxx.iso
我测试是可以的。
1.png
2.png

点评

找到原因了,是我文件路径不完整导致的。原来的变量在iosboot中正常,用map的话路径必须加如(hd1,gpt7)。谢谢!  详情 回复 发表于 2019-11-3 16:22
扇区映射仿真盘能搞出来吗?  详情 回复 发表于 2019-11-3 15:33
回复

使用道具 举报

发表于 2019-11-3 15:33:33 | 显示全部楼层
wintoflash 发表于 2019-11-3 14:32
加--pause参数,截图看一下
map --pause /xxx.iso
我测试是可以的。

扇区映射仿真盘能搞出来吗?

点评

"扇区映射仿真盘"是啥?能详细点不? 把硬盘上几个扇区弄成虚拟盘?  详情 回复 发表于 2019-11-3 15:46
回复

使用道具 举报

发表于 2019-11-3 15:34:10 | 显示全部楼层
可以启动ISO安装镜像,这个很好
mark
改天再来研究
回复

使用道具 举报

 楼主| 发表于 2019-11-3 15:46:43 | 显示全部楼层
ddsony 发表于 2019-11-3 15:33
扇区映射仿真盘能搞出来吗?

"扇区映射仿真盘"是啥?能详细点不?
把硬盘上几个扇区弄成虚拟盘?

点评

对,象grub4dos一样。  详情 回复 发表于 2019-11-3 15:53
回复

使用道具 举报

发表于 2019-11-3 15:53:26 | 显示全部楼层
wintoflash 发表于 2019-11-3 15:46
"扇区映射仿真盘"是啥?能详细点不?
把硬盘上几个扇区弄成虚拟盘?

对,象grub4dos一样。

点评

“硬盘上几个扇区映射成虚拟盘”那肯定是可行的。 不过我不太熟悉grub4dos,能不能举个具体使用的例子。  详情 回复 发表于 2019-11-3 16:09
回复

使用道具 举报

 楼主| 发表于 2019-11-3 16:09:19 | 显示全部楼层
ddsony 发表于 2019-11-3 15:53
对,象grub4dos一样。

“硬盘上几个扇区映射成虚拟盘”那肯定是可行的。
不过我不太熟悉grub4dos,能不能举个具体使用的例子。

点评

grub2把磁盘上的一片未分配区域映射成虚拟盘以启动其上的系统,这样就可以不通过分区表实现深度隐藏系统的启动。  详情 回复 发表于 2019-11-3 18:23
回复

使用道具 举报

发表于 2019-11-3 16:22:07 | 显示全部楼层
本帖最后由 ksafei 于 2019-11-3 17:13 编辑
wintoflash 发表于 2019-11-3 14:32
加--pause参数,截图看一下
map --pause /xxx.iso
我测试是可以的。


找到原因了,是我文件路径不完整导致的。原来的变量在isoboot中正常,用map的话路径必须加如(hd1,gpt7)。谢谢!
回复

使用道具 举报

发表于 2019-11-3 16:49:29 | 显示全部楼层
GRUB2 UEFI 下的磁盘仿真已成功,期待W大将此引导ISO PE的功能加入到 Grub2的文件管理器 中, 建议加2个启动选项:一是map方式启动;二是wimboot方式启动(先用 loopback查找列出ISO内的所有WIM启动文件,然后用wimboot逐一引导,可以解决一个ISO镜像内有多个wim映像PE的问题)

点评

(2) 容易死机。  详情 回复 发表于 2019-11-3 18:41
回复

使用道具 举报

发表于 2019-11-3 18:18:35 | 显示全部楼层
期待已久。
此贴不顶良心不安,多谢分享!多谢!!!
回复

使用道具 举报

发表于 2019-11-3 18:23:05 | 显示全部楼层
wintoflash 发表于 2019-11-3 16:09
“硬盘上几个扇区映射成虚拟盘”那肯定是可行的。
不过我不太熟悉grub4dos,能不能举个具体使用的例子。 ...

grub2把磁盘上的一片未分配区域映射成虚拟盘以启动其上的系统,这样就可以不通过分区表实现深度隐藏系统的启动。

点评

大概是这个意思,这样设计命令? map --start=0x1234 --length=0x5678 --type=HD hd0 直接把vhd或img放到UD区不就行了?  详情 回复 发表于 2019-11-3 18:40
回复

使用道具 举报

 楼主| 发表于 2019-11-3 18:40:53 | 显示全部楼层
ddsony 发表于 2019-11-3 18:23
grub2把磁盘上的一片未分配区域映射成虚拟盘以启动其上的系统,这样就可以不通过分区表实现深度隐藏系统 ...

大概是这个意思,这样设计命令?
map --start=0x1234 --length=0x5678 --type=HD hd0
直接把vhd或img放到UD区不就行了?

点评

系统如果不是放在vhd或img镜像里,而是散装在这片区域呢?  详情 回复 发表于 2019-11-3 18:53
回复

使用道具 举报

 楼主| 发表于 2019-11-3 18:41:33 | 显示全部楼层
ksafei 发表于 2019-11-3 16:49
GRUB2 UEFI 下的磁盘仿真已成功,期待W大将此引导ISO PE的功能加入到 Grub2的文件管理器 中, 建议加2个启 ...

(2) 容易死机。

点评

哦,@lhb9900 的grubfm有此功能,很实用,使用中还未见异常,故有此想法 [attachimg]404358[/attachimg] [attachimg]404359[/attachimg]  详情 回复 发表于 2019-11-3 18:55
回复

使用道具 举报

发表于 2019-11-3 18:53:04 | 显示全部楼层
wintoflash 发表于 2019-11-3 18:40
大概是这个意思,这样设计命令?
map --start=0x1234 --length=0x5678 --type=HD hd0
直接把vhd或img放 ...

系统如果不是放在vhd或img镜像里,而是散装在这片区域呢?

点评

这片区域是连续的啊,有自己的文件系统,相当于一个分区,不就等于一个不带分区表的img吗?  详情 回复 发表于 2019-11-3 18:56
回复

使用道具 举报

发表于 2019-11-3 18:55:02 | 显示全部楼层

哦,@lhb9900 的grubfm有此功能,很实用,使用中还未见异常,故有此想法
QQ截图20191103182556.png
QQ截图20191103182642.png

点评

他这个应该是指定深度的吧,比如 /*.wim /*/*.wim 这样。 如果目录嵌套得比较多,例如 /efi/microsoft/boot/wim/winpe.wim这样,就不好办了。 我以前尝试过遍历所有文件,遇到某些奇葩的ISO镜像(例如FreeBSD之类)  详情 回复 发表于 2019-11-3 19:05
回复

使用道具 举报

 楼主| 发表于 2019-11-3 18:56:31 | 显示全部楼层
ddsony 发表于 2019-11-3 18:53
系统如果不是放在vhd或img镜像里,而是散装在这片区域呢?

这片区域是连续的啊,有自己的文件系统,相当于一个分区,不就等于一个不带分区表的img吗?

点评

那就先这样设计,写成grub2的规范形式: --start=0x1234 --length=0x5678 --type=HD hd0 按照规范写法,用块表。 grub2为: (hd0)0x1234+0x5688  详情 回复 发表于 2019-11-3 19:22
回复

使用道具 举报

 楼主| 发表于 2019-11-3 19:05:34 | 显示全部楼层
ksafei 发表于 2019-11-3 18:55
哦,@lhb9900 的grubfm有此功能,很实用,使用中还未见异常,故有此想法

他这个应该是指定深度的吧,比如 /*.wim /*/*.wim 这样。
如果目录嵌套得比较多,例如 /efi/microsoft/boot/wim/winpe.wim这样,就不好办了。
我以前尝试过遍历所有文件,遇到某些奇葩的ISO镜像(例如FreeBSD之类),会死机。
回复

使用道具 举报

发表于 2019-11-3 19:13:24 | 显示全部楼层
挺好的,但是因为我发现直接引导wim也很方便就没再尝试UEFI磁盘仿真了
回复

使用道具 举报

发表于 2019-11-3 19:13:26 | 显示全部楼层
本帖最后由 求道者 于 2019-11-3 19:16 编辑

挺好的,但是因为我发现直接引导wim也很方便就没再尝试UEFI磁盘仿真了
主要是xorboot的垃圾兼容性把我搞怕了
建议debug完成后提交mod到上游

点评

ipxe wimboot的原理其实和这个差不多, 抄了不少他家的代码。 提交到上游是不可能了。我的这个分支改动太多。  详情 回复 发表于 2019-11-3 19:26
回复

使用道具 举报

发表于 2019-11-3 19:22:42 | 显示全部楼层
wintoflash 发表于 2019-11-3 18:56
这片区域是连续的啊,有自己的文件系统,相当于一个分区,不就等于一个不带分区表的img吗?

那就先这样设计,写成grub2的规范形式:
--start=0x1234 --length=0x5678 --type=HD hd0
按照规范写法,用块表。
grub2为: (hd0)0x1234+0x5688

点评

试了一下,可以直接用blocklist啊 [attachimg]404363[/attachimg] [attachimg]404364[/attachimg] [attachimg]404365[/attachimg]  详情 回复 发表于 2019-11-3 19:39
blocklist那一套东西一直没搞懂。 grub2应该是支持直接用blocklist当文件用的吧,比如我见过这种写法:  详情 回复 发表于 2019-11-3 19:30
回复

使用道具 举报

 楼主| 发表于 2019-11-3 19:26:25 | 显示全部楼层
求道者 发表于 2019-11-3 19:13
挺好的,但是因为我发现直接引导wim也很方便就没再尝试UEFI磁盘仿真了
主要是xorboot的垃圾兼容性把我搞怕 ...

ipxe wimboot的原理其实和这个差不多, 抄了不少他家的代码。
提交到上游是不可能了。我的这个分支改动太多。
回复

使用道具 举报

 楼主| 发表于 2019-11-3 19:30:30 | 显示全部楼层
ddsony 发表于 2019-11-3 19:22
那就先这样设计,写成grub2的规范形式:
--start=0x1234 --length=0x5678 --type=HD hd0
按照规范写法, ...

blocklist那一套东西一直没搞懂。
grub2应该是支持直接用blocklist当文件用的吧,比如我见过这种写法:
  1. loopback ElTorito (loop)228+380000;
  2. linux (ElTorito)/abr64ker.dat product=bootagent media_for_windows quiet;
  3. initrd (ElTorito)/abr64ram.dat (ElTorito)/dat8.dat;
复制代码

回复

使用道具 举报

 楼主| 发表于 2019-11-3 19:39:19 | 显示全部楼层
ddsony 发表于 2019-11-3 19:22
那就先这样设计,写成grub2的规范形式:
--start=0x1234 --length=0x5678 --type=HD hd0
按照规范写法, ...

试了一下,可以直接用blocklist啊
深度截图_选择区域_20191103193726.png
深度截图_选择区域_20191103193740.png
深度截图_选择区域_20191103193753.png

点评

你图3以这种虚拟盘的形式能顺利efi启动到PE桌面吗?  详情 回复 发表于 2019-11-3 20:42
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2020-11-28 22:19

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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