无忧启动论坛

标题: GRUB2 UEFI 下的磁盘仿真 [打印本页]

作者: wintoflash    时间: 2019-11-3 09:27
标题: GRUB2 UEFI 下的磁盘仿真
本帖最后由 wintoflash 于 2021-3-2 19:09 编辑

本项目已停止开发,不再维护。
-----------------------------------------------------------------------

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.     -e, --eltorito=DISK  同时指定挂载 El Torito 镜像的盘符
  11.     -n, --nb  加载虚拟盘后不立即启动
  12.     -g, --no_g4d  不向内存写入 GRUB4DOS map 信息
  13.     -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文件。
  8. map --mem --rt (hd1,4)/ramos.vhd.xz
复制代码

深度录屏_选择区域_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

作者: yynq    时间: 2019-11-3 09:55

作者: yynq    时间: 2019-11-3 09:56
再顶
作者: 2010sya    时间: 2019-11-3 10:04
谢谢分享
作者: aimengyu    时间: 2019-11-3 10:29
谢谢分享
作者: zandrawoo    时间: 2019-11-3 10:44
谢谢,給力
作者: ksafei    时间: 2019-11-3 11:42
GRUB2 功能的又一次创新和突破,感谢分享
作者: ksafei    时间: 2019-11-3 14:27
map /winpe.iso,测试fat32分区中的ISO成功启动。NTFS分区中的ISO失败,是要加什么参数吗
作者: wintoflash    时间: 2019-11-3 14:32
本帖最后由 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
作者: ddsony    时间: 2019-11-3 15:33
wintoflash 发表于 2019-11-3 14:32
加--pause参数,截图看一下
map --pause /xxx.iso
我测试是可以的。

扇区映射仿真盘能搞出来吗?
作者: vm669    时间: 2019-11-3 15:34
可以启动ISO安装镜像,这个很好
mark
改天再来研究
作者: wintoflash    时间: 2019-11-3 15:46
ddsony 发表于 2019-11-3 15:33
扇区映射仿真盘能搞出来吗?

"扇区映射仿真盘"是啥?能详细点不?
把硬盘上几个扇区弄成虚拟盘?
作者: ddsony    时间: 2019-11-3 15:53
wintoflash 发表于 2019-11-3 15:46
"扇区映射仿真盘"是啥?能详细点不?
把硬盘上几个扇区弄成虚拟盘?

对,象grub4dos一样。
作者: wintoflash    时间: 2019-11-3 16:09
ddsony 发表于 2019-11-3 15:53
对,象grub4dos一样。

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

作者: ksafei    时间: 2019-11-3 16:22
本帖最后由 ksafei 于 2019-11-3 17:13 编辑
wintoflash 发表于 2019-11-3 14:32
加--pause参数,截图看一下
map --pause /xxx.iso
我测试是可以的。


找到原因了,是我文件路径不完整导致的。原来的变量在isoboot中正常,用map的话路径必须加如(hd1,gpt7)。谢谢!
作者: ksafei    时间: 2019-11-3 16:49
GRUB2 UEFI 下的磁盘仿真已成功,期待W大将此引导ISO PE的功能加入到 Grub2的文件管理器 中, 建议加2个启动选项:一是map方式启动;二是wimboot方式启动(先用 loopback查找列出ISO内的所有WIM启动文件,然后用wimboot逐一引导,可以解决一个ISO镜像内有多个wim映像PE的问题)
作者: pky317    时间: 2019-11-3 18:18
期待已久。
此贴不顶良心不安,多谢分享!多谢!!!
作者: ddsony    时间: 2019-11-3 18:23
wintoflash 发表于 2019-11-3 16:09
“硬盘上几个扇区映射成虚拟盘”那肯定是可行的。
不过我不太熟悉grub4dos,能不能举个具体使用的例子。 ...

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

大概是这个意思,这样设计命令?
map --start=0x1234 --length=0x5678 --type=HD hd0
直接把vhd或img放到UD区不就行了?
作者: wintoflash    时间: 2019-11-3 18:41
ksafei 发表于 2019-11-3 16:49
GRUB2 UEFI 下的磁盘仿真已成功,期待W大将此引导ISO PE的功能加入到 Grub2的文件管理器 中, 建议加2个启 ...

(2) 容易死机。
作者: ddsony    时间: 2019-11-3 18:53
wintoflash 发表于 2019-11-3 18:40
大概是这个意思,这样设计命令?
map --start=0x1234 --length=0x5678 --type=HD hd0
直接把vhd或img放 ...

系统如果不是放在vhd或img镜像里,而是散装在这片区域呢?
作者: ksafei    时间: 2019-11-3 18:55
wintoflash 发表于 2019-11-3 18:41
(2) 容易死机。

哦,@lhb9900 的grubfm有此功能,很实用,使用中还未见异常,故有此想法
QQ截图20191103182556.png
QQ截图20191103182642.png
作者: wintoflash    时间: 2019-11-3 18:56
ddsony 发表于 2019-11-3 18:53
系统如果不是放在vhd或img镜像里,而是散装在这片区域呢?

这片区域是连续的啊,有自己的文件系统,相当于一个分区,不就等于一个不带分区表的img吗?
作者: wintoflash    时间: 2019-11-3 19:05
ksafei 发表于 2019-11-3 18:55
哦,@lhb9900 的grubfm有此功能,很实用,使用中还未见异常,故有此想法

他这个应该是指定深度的吧,比如 /*.wim /*/*.wim 这样。
如果目录嵌套得比较多,例如 /efi/microsoft/boot/wim/winpe.wim这样,就不好办了。
我以前尝试过遍历所有文件,遇到某些奇葩的ISO镜像(例如FreeBSD之类),会死机。
作者: 求道者    时间: 2019-11-3 19:13
挺好的,但是因为我发现直接引导wim也很方便就没再尝试UEFI磁盘仿真了
作者: 求道者    时间: 2019-11-3 19:13
本帖最后由 求道者 于 2019-11-3 19:16 编辑

挺好的,但是因为我发现直接引导wim也很方便就没再尝试UEFI磁盘仿真了
主要是xorboot的垃圾兼容性把我搞怕了
建议debug完成后提交mod到上游
作者: ddsony    时间: 2019-11-3 19:22
wintoflash 发表于 2019-11-3 18:56
这片区域是连续的啊,有自己的文件系统,相当于一个分区,不就等于一个不带分区表的img吗?

那就先这样设计,写成grub2的规范形式:
--start=0x1234 --length=0x5678 --type=HD hd0
按照规范写法,用块表。
grub2为: (hd0)0x1234+0x5688
作者: wintoflash    时间: 2019-11-3 19:26
求道者 发表于 2019-11-3 19:13
挺好的,但是因为我发现直接引导wim也很方便就没再尝试UEFI磁盘仿真了
主要是xorboot的垃圾兼容性把我搞怕 ...

ipxe wimboot的原理其实和这个差不多, 抄了不少他家的代码。
提交到上游是不可能了。我的这个分支改动太多。
作者: wintoflash    时间: 2019-11-3 19: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;
复制代码


作者: wintoflash    时间: 2019-11-3 19:39
ddsony 发表于 2019-11-3 19:22
那就先这样设计,写成grub2的规范形式:
--start=0x1234 --length=0x5678 --type=HD hd0
按照规范写法, ...

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


作者: wintoflash    时间: 2019-11-3 19:45
深度截图_选择区域_20191103194421.png

2048+14176768=14178816
这样也是能启动的。
深度截图_选择区域_20191103194344.png



作者: ddsony    时间: 2019-11-3 20:01
wintoflash 发表于 2019-11-3 19:45
2048+14176768=14178816
这样也是能启动的。

那这东西就是现成的了。
作者: tmdgdx    时间: 2019-11-3 20:06

谢谢分享
作者: ddsony    时间: 2019-11-3 20:42
wintoflash 发表于 2019-11-3 19:39
试了一下,可以直接用blocklist啊

你图3以这种虚拟盘的形式能顺利efi启动到PE桌面吗?
作者: wintoflash    时间: 2019-11-3 20:54
ddsony 发表于 2019-11-3 20:42
你图3以这种虚拟盘的形式能顺利efi启动到PE桌面吗?

可以
作者: freesoft00    时间: 2019-11-3 22:10
不正常呀,看到今天gurb2的帖子量这么大。就知道有人发好东西了。
作者: liuzhaoyzz    时间: 2019-11-4 08:31
本帖最后由 liuzhaoyzz 于 2019-11-4 08:33 编辑

wintoflash大神技术过硬,支持!现在支持ISO格式,其他格式呢?比如img,vdf,wim,vhd等等支持情况怎么样? 大神的这个帖子给了UEFI-RAMOS带来了曙光。
      

作者: wintoflash    时间: 2019-11-4 08:43
liuzhaoyzz 发表于 2019-11-4 08:31
wintoflash大神技术过硬,支持!现在支持ISO格式,其他格式呢?比如img,vdf,wim,vhd等等支持情况怎么样 ...

img  mbr分区表的已经测试过可以了。GPT的暂时没有条件测试。分区镜像(无分区表)也测试通过了。
wim  不是磁盘镜像,应该用wimboot启动。
vdh/vdf 暂时没有条件测试。可否推荐一下体积比较小的镜像?
作者: 指南针    时间: 2019-11-4 10:35
本帖最后由 指南针 于 2019-11-4 10:45 编辑

我来报告一下启动vhd情况:
MBR或GPT分区表,EFI启动,差分vhd,非差分vhd(均动态)
直接用楼主的efi文件,map或map --mem都失败
...
mem:0
type:0
vdisk_install
...
found iso partition
failed to install virtual partition
installing block_io protocol for virtual disk...
failed to install virtual disk
Failed to install vdisk.
exit.
exit status code:0x80000000000000000002


作者: 282198284    时间: 2019-11-4 10:55
本帖最后由 282198284 于 2019-11-9 22:26 编辑
指南针 发表于 2019-11-4 10:35
我来报告一下启动vhd情况:
MBR或GPT分区表,EFI启动,差分vhd,非差分vhd(均动态)
直接用楼主的efi文 ...


你有没有内置ntfs.efi的
作者: 指南针    时间: 2019-11-4 10:59
282198284 发表于 2019-11-4 10:55
你有没有内置ntfs.efi的

什么东西?什么作用?
作者: 282198284    时间: 2019-11-4 11:02
本帖最后由 282198284 于 2019-11-9 22:23 编辑
282198284 发表于 2019-11-4 10:55
你有没有内置ntfs.efi的


....

作者: wintoflash    时间: 2019-11-4 11:22
指南针 发表于 2019-11-4 10:35
我来报告一下启动vhd情况:
MBR或GPT分区表,EFI启动,差分vhd,非差分vhd(均动态)
直接用楼主的efi文 ...

固定大小的vhd是可以的。
动态vhd可能可以通过blocklist启动,我试一下。
作者: Climbing    时间: 2019-11-4 11:59
为楼主点赞!

UEFI的启动一直以来只有一个XORBoot勉强用用,而且,兼容性不是很好,很多机器不能用。导致我近几年安装电脑,基本上全部是把硬盘改成MBR格式,然后用grub4dos。UEFI+GPT真的没有一个能打的启动管理器,从今天开始,应该会有所好转了。


作者: liuzhaoyzz    时间: 2019-11-4 12:09
本帖最后由 liuzhaoyzz 于 2019-11-4 12:12 编辑
wintoflash 发表于 2019-11-4 08:43
img  mbr分区表的已经测试过可以了。GPT的暂时没有条件测试。分区镜像(无分区表)也测试通过了。
wim  不 ...


vhd和vdf基本上是面向机器的,需要自己安装个系统到vhd里面,小的esd镜像RAMOS专区有很多。vdf格式是用primo ramdisk生成的镜像,里面的内容也是面向机器的,主要是驱动什么的,就是说我机器上面的vdf肯定不能再你的机器上面启动,提供给您也没什么用啊。再说了现在primo驱动很多用的是复杂的双镜像启动技术,牵涉到的MBR克隆等内容更多,有些复杂,vdf单镜像的我现在用的少了,如果要测试,也要先用vdf单镜像的来测试最好,先排除双镜像的启动问题。RAMOS涉及到注册表mounteddevice等等内容,还是挺复杂的,任何一点卡住都可能导致引导失败,应该想办法缩小范围,以测试UEFI MAP是否能够用于vdf启动。

我对于vdf启动底层支持了解不是很透彻,能力和水平不够,看下虎大能否研究下。根据已知的众多测试,UEFI下生成的img硬盘格式这样子的内存盘,微软不支持,无法启动,vdf格式=img格式+引导脚,可以视作img格式。        

作者: wintoflash    时间: 2019-11-4 12:33
liuzhaoyzz 发表于 2019-11-4 12:09
vhd和vdf基本上是面向机器的,需要自己安装个系统到vhd里面,小的esd镜像RAMOS专区有很多。vdf格式是用 ...

img格式的话,应该是支持的。比如固定大小的vhd,可以看作img。
而动态vhd这种结构与img不同的,就要另找办法。
作者: wintoflash    时间: 2019-11-4 12:36
@282198284
建议和原作者一样,加一个外置配置文件

你在\boot\grub下新建文本文件grub.cfg,编码选UTF-8无BOM。
内容如下:
  1. menuentry "BOOT VHD" {
  2.   map --type=HD /xxx.vhd
  3. }
复制代码

就可以了。
如果不想显示菜单,就
  1. map --type=HD /xxx.vhd
  2. boot
复制代码

作者: liaonf    时间: 2019-11-4 14:22
W大,能直接用map命令启动Porteus-4.0-x86_64-20170917.iso镜像吗?
作者: wintoflash    时间: 2019-11-4 14:39
liaonf 发表于 2019-11-4 14:22
W大,能直接用map命令启动Porteus-4.0-x86_64-20170917.iso镜像吗?

不能。
在我的印象中,这个版本是符合loopback规范的。
  1. menuentry "Porteus" {
  2.       iso_path="/xxx/Porteus-4.0-x86_64-20170917.iso"
  3.       export iso_path
  4.       search --set=root --file "$iso_path"
  5.       loopback loop "$iso_path"
  6.       root=(loop)
  7.       configfile /boot/grub/loopback.cfg
  8. }
复制代码

作者: liaonf    时间: 2019-11-4 16:15
wintoflash 发表于 2019-11-4 14:39
不能。
在我的印象中,这个版本是符合loopback规范的。

谢了,只是不知道在UEFI下也可以吗?
作者: wintoflash    时间: 2019-11-4 16:36
liaonf 发表于 2019-11-4 16:15
谢了,只是不知道在UEFI下也可以吗?

都可以

作者: liaonf    时间: 2019-11-4 16:45
wintoflash 发表于 2019-11-4 16:36
都可以

刚才试了一下,可以启动win10pe,真的是太强了!只是grub.cfg和grubx64.efi话同一个目录,好像加载不了!另外在命令行下回车不起作用,这可能是一个bug.
作者: wintoflash    时间: 2019-11-4 17:57
liaonf 发表于 2019-11-4 16:45
刚才试了一下,可以启动win10pe,真的是太强了!只是grub.cfg和grubx64.efi话同一个目录,好像加载不了! ...

关于grub.cfg的路径,可以参考论坛里grub2定制相关的帖子。
只有回车键不能用?
作者: yynq    时间: 2019-11-4 17:59
本帖最后由 yynq 于 2019-11-4 18:01 编辑

wintoflash
查看个人网站查看详细资料
64主题
2971帖子
4597积分
VIP会员 大元帅

禁止访问

作者: liaonf    时间: 2019-11-4 18:27
wintoflash 发表于 2019-11-4 14:39
不能。
在我的印象中,这个版本是符合loopback规范的。

请教W大,到脚本初始化时就进不去了,是什么问题?
1.jpg

作者: gnuxwy    时间: 2019-11-4 18:28
哇,W大真的在憋大招啊,这下终于就出手了。。。
几天没上无忧,今天上来就发现重量级的贴子了,W大居然搞定grub2的磁盘仿真了!

好想试试看,可惜手里没有UEFI主板。
现在先用着grub4dos,等以后手里有了UEFI主板就立刻上马!


作者: wintoflash    时间: 2019-11-4 18:32
liaonf 发表于 2019-11-4 18:27
请教W大,到脚本初始化时就进不去了,是什么问题?

cat /proc/cmdline 看一下。
建议单独开一帖讨论。
作者: liuzhaoyzz    时间: 2019-11-4 18:48
本帖最后由 liuzhaoyzz 于 2019-11-4 19:23 编辑


1、虚拟机里面试了下,boot/grub/grub.cfg必须放在esp分区是吗?不放在ESP分区,似乎会直接进入grub rescue?我看了您在一楼给出的定制grub2模块,
grub-mkimage -d x86_64-efi -p /boot/grub,prefix明明没有写(hd0,1)这样子的盘符啊?奇怪的很。
我用set命令看了下是指向(hd0,gpt1)的,我试了如果放在esp分区,测试可以启动PE.ISO。
GPT测试-2019-11-04-18-39-36.png
QQ拼音截图20191104192215.png
2、wintoflash大神给出的grubx64.efi大小有3.18MB,感觉有点大,您在一楼给出的定制grub2模块,能否由您动手精简下,模块太多了,对于纯粹的windows用户,我不知道哪些模块是必须的。
        

作者: 窄口牛    时间: 2019-11-4 20:48
我的efi十一兆,将所有模块的打包进去,这样就不需要insmod了。
作者: 江南一根葱    时间: 2019-11-4 21:19
窄口牛 发表于 2019-11-4 20:48
我的efi十一兆,将所有模块的打包进去,这样就不需要insmod了。

我以前想把pe也打包进去,被楼主鄙视了
作者: 窄口牛    时间: 2019-11-4 22:01
你牛,只有楼主敢惹你,反正我是不敢。
作者: liuzhaoyzz    时间: 2019-11-5 07:08
本帖最后由 liuzhaoyzz 于 2019-11-9 21:22 编辑
liuzhaoyzz 发表于 2019-11-4 18:48
1、虚拟机里面试了下,boot/grub/grub.cfg必须放在esp分区是吗?不放在ESP分区,似乎会直接进入grub resc ...


自问自答,第一个问题解决了。
Windows定制Grub2(包括BIOS和UEFI、自定义Grub2路徑) - GRUB2 - 无忧启动论坛 - Powered by Discuz! http://wuyou.net/forum.php?mod=v ... &extra=page%3D1
新建个bootconfig.cfg文件,内容如下:
search.file /boot/grub/grub.cfg root
set prefix=/boot/grub

然后自定义grub2,内嵌bootconfig.cfg:
@echo off
grub-mkimage -d x86_64-efi -p /boot/grub -c bootconfig.cfg -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

这样子,只要存在/boot/grub/grub.cfg文件,就会找到并加载。似乎可以放在任意一个盘符,好处是方便编辑,如果被限制在esp分区,需要挂载esp,稍嫌麻烦。
        

作者: wintoflash    时间: 2019-11-5 08:55
本帖最后由 wintoflash 于 2019-11-5 08:57 编辑
liuzhaoyzz 发表于 2019-11-5 07:08
自问自答,第一个问题解决了。
Windows定制Grub2(包括BIOS和UEFI、自定义Grub2路徑) - GRUB2 - 无忧 ...

grubx64.efi大小有3.18MB,感觉有点大,您在一楼给出的定制grub2模块,能否由您动手精简下,模块太多了,对于纯粹的windows用户,我不知道哪些模块是必须的。

这年头几MB还要计较大小啊。。
  1. grub-mkimage -d x86_64-efi -p /boot/grub -c bootconfig.cfg -o grubx64.efi -O x86_64-efi blocklist boot chain configfile disk echo efi_gop efi_uga efiload exfat extcmd fat halt iso9660 ls minicmd normal ntfs part_gpt part_msdos progress reboot sbpolicy search terminal udf map
复制代码

不需要udf/iso格式,可以把udf和iso9660删掉。
不需要exfat,也可以删。
不需要echo/ls/reboot/halt之类的命令,也可以删。
不需要使用blocklist表示法,例如(hd0,1)123+456这种,也可以删。
不需要显示读文件进度,可以删progress
不需要安全启动相关的东西,可以删sbpolicy
不需要加载UEFI驱动(例如ntfs),可以删efiload
不需要gpt分区表支持,可以删part_gpt

反正基本上什么都可以删,屏幕显示相关相关的模块比如efi_gop efi_uga terminal之类的模块理论上也能删,只是不显示任何东西了。
作者: liuzhaoyzz    时间: 2019-11-5 09:28
本帖最后由 liuzhaoyzz 于 2019-11-5 09:41 编辑

谢谢回复,知道了。因为之前主要是用grldr,只有310KB,突然来了个3.18MB有点不习惯,windows的bootx64.efi(bootmgrfw.efi)大概1.1-1.5MB,所以有此一问。

另外请问个问题,您提供的grub2是2.05版本的,我尝试加载中文菜单总是失败,路径应该是对的,unicode.pf2也是从论坛下载的,中文显示不出来是怎么回事?

/boot/grub/grub.cfg相关内容如下,是utf-8无BOM编码(试过了utf-8带BOM的也不行),模块都是一楼的那些模块,没有精简:
set default=0
set fallback=1
set timeout=2

loadfont /boot/grub/fonts/unicode.pf2
set locale_dir=/boot/grub/locale
set lang=zh_CN
set gfxmode=auto,800x600,1024x768

这个里面似乎没有vbe模块,loadfont要不要vbe支持?另外是否需要set gfxmode=auto,800x600,1024x768?

        

作者: wintoflash    时间: 2019-11-5 09:41
liuzhaoyzz 发表于 2019-11-5 09:28
谢谢回复,知道了。因为之前主要是用grldr,只有310KB,突然来了个3.18MB有点不习惯,windows的bootx64.efi ...

vbe 是BIOS下的显示模式。
加上
  1. terminal_output gfxterm
复制代码

就可以了。
作者: liuzhaoyzz    时间: 2019-11-5 09:47
本帖最后由 liuzhaoyzz 于 2019-11-5 10:43 编辑
wintoflash 发表于 2019-11-5 09:41
vbe 是BIOS下的显示模式。
加上


大神就是大神!一句话画龙点睛啊!果然可以了,怎么网上的菜单没见到这一句。。。之前我折腾了好久。 测试GPT-2019-11-05-09-46-48.png      

再请教个问题,遍历WIM/ISO的模块grubfm能否用于这个支持map的版本,能否简单指点下?grubfm.cfg需要做什么修改吗?现在的grubfm只能遍历wim启动,似乎还不能遍历iso启动?   

作者: wintoflash    时间: 2019-11-5 11:19
liuzhaoyzz 发表于 2019-11-5 09:47
大神就是大神!一句话画龙点睛啊!果然可以了,怎么网上的菜单没见到这一句。。。之前我折腾了好久。   ...
遍历WIM/ISO的模块grubfm能否用于这个支持map的版本,能否简单指点下?
模块"grubfm"指的是什么?grubfm.mod?
grubfm.cfg需要做什么修改吗?现在的grubfm只能遍历wim启动,似乎还不能遍历iso启动?
grubfm.cfg 是在哪里下载的?

------------------------
现在还只是功能测试阶段,先别搞这些复杂的玩意,否则万一命令变动了不兼容。
这个帖子里的附件目前仅供测试,我还有可能未来会增加启动动态VHD等的功能,为了方便起见应该会不兼容。



作者: liuzhaoyzz    时间: 2019-11-5 11:39
本帖最后由 liuzhaoyzz 于 2019-11-5 11:53 编辑
wintoflash 发表于 2019-11-5 11:19
模块"grubfm"指的是什么?grubfm.mod?
grubfm.cfg 是在哪里下载的?


https://github.com/a1ive/grub2-filemanager
grub2-filemanager
这是您的大作吗?然后众多网友基于您的大作做了很多修改版,比如江南一根葱修改的(修改过的版本好多好多,眼花缭乱),hilsonma,还有其他网友修改的等等。
有的网友修改之后的模板很小,grubfm.cfg+isoboot.efi大概只有几十KB,如果能够遍历ISO就更好了。

        

作者: liuzhaoyzz    时间: 2019-11-5 11:45
本帖最后由 liuzhaoyzz 于 2019-11-6 22:19 编辑

另外,我测试了下,如果需要支持中文菜单,需要font gfxterm这两个模块。我传个定制的精简版本的grub2上来,只是在63楼的基础上增加了这两个模块,1.06MB。当然如果需要显示中文,还需要/boot/grub2/fonts/unicode.pf2,/boot/grub2/locale/zh_CN.mo,一起打包上传。
grubx64.efi改名为bootx64.efi拷贝到esp\EFI\boot\目录下覆盖原来的。

@echo off
grub-mkimage -d x86_64-efi -p /boot/grub -c bootconfig.cfg -o grubx64.efi -O x86_64-efi blocklist boot chain configfile disk echo efi_gop efi_uga efiload exfat extcmd fat halt iso9660 ls minicmd normal ntfs part_gpt part_msdos progress reboot sbpolicy search terminal udf map font gfxterm linux linux16 vhd loopback regexp probe wimboot multiboot multiboot2 test help ext2

        

grub1105.rar

1.05 MB, 下载次数: 158, 下载积分: 无忧币 -2


作者: wintoflash    时间: 2019-11-5 17:12
指南针 发表于 2019-11-4 10:35
我来报告一下启动vhd情况:
MBR或GPT分区表,EFI启动,差分vhd,非差分vhd(均动态)
直接用楼主的efi文 ...

现在支持动态VHD了(不支持差分)
先挂载vhd到vhd0 (也可以是其他盘符)
vhd vhd0 /test.vhd
然后启动
map --disk --type=HD vhd0
作者: 指南针    时间: 2019-11-5 17:14
wintoflash 发表于 2019-11-5 17:12
现在支持动态VHD了(不支持差分)
先挂载vhd到vhd0 (也可以是其他盘符)
vhd vhd0 /test.vhd

差分是暂时不支持,还是后面都无法支持?

作者: 指南针    时间: 2019-11-5 17:29
还有疑问,用这种方式启动的vhd,应该是对vhd本身有要求吧?
vhd的分区表是用MBR还是GPT?如果是MBR应该要激活系统分区?

旧时代在普通MBR硬盘启动vhd都是需要bootmgr和bcd指定vhd的,现在是模拟成硬盘启动了,也就说,vhd内必须保证系统的完整性(不能少bootmgr之类),因为以前用ntboot来启动是可以不需具备vhd内部的引导文件也能启动成功
作者: 指南针    时间: 2019-11-5 17:31
另外,假设能启动了差分vhd,如何实现grub2下面的秒还原可能又是个问题,因为我之前发过提问,但楼主回答grub2下没有能对ntfs分区写入的mod
作者: wintoflash    时间: 2019-11-5 17:39
本帖最后由 wintoflash 于 2019-11-5 17:46 编辑
指南针 发表于 2019-11-5 17:29
还有疑问,用这种方式启动的vhd,应该是对vhd本身有要求吧?
vhd的分区表是用MBR还是GPT?如果是MBR应该要 ...

mbr/gpt均可,gpt的没测试过。
首先,会尝试启动激活分区/ESP分区的/efi/boot/bootx64.efi
如果不行,就尝试启动该硬盘在UEFI固件下显示的第一个分区里面的/efi/boot/bootx64.efi。
VHD里面的必须有引导,如果里面有操作系统(Windows/Linux),操作系统必须安装有能识别虚拟盘的驱动。
NTBOOT的原理是内置了一套bootmgr,bcd,,,。BCD是特制的,以方便在g4d下更改里面菜单项VHD/WIM的路径。

差分是暂时不支持,还是后面都无法支持?

似乎没有比较简单的开源实现。我是做不出来。
另外,假设能启动了差分vhd,如何实现grub2下面的秒还原可能又是个问题,因为我之前发过提问,但楼主回答grub2下没有能对ntfs分区写入的mod

难度极大。据我所知,比较靠谱的只有vmlite vboot (该部分闭源)。grub4dos用的是比较拙劣的dd,不靠谱。
作者: hilsonma    时间: 2019-11-5 17:41
grub2vhd.jpg
作者: wintoflash    时间: 2019-11-5 17:44
hilsonma 发表于 2019-11-5 17:41

这是动态VHD?还是没有分区表的VHD?
作者: hilsonma    时间: 2019-11-5 17:52
本帖最后由 hilsonma 于 2019-11-5 17:59 编辑
wintoflash 发表于 2019-11-5 17:44
这是动态VHD?还是没有分区表的VHD?


不是动态vhd。

刚看你更新了模块,下来试了,连iso都出错了,之前是可以启动的。

前两天下载的
grub-mkimage -O x86_64-efi -p /efi/grub -o bootx64.efi part_msdos part_gpt fat exfat ntfs ext2 normal chain configfile probe regexp test search wimboot halt reboot help linux map
可以启动iso
刚才更新后不能启动了,要用回你的全部模块才可以,不知道我上面的少了哪个模块。
作者: wintoflash    时间: 2019-11-5 18:03
hilsonma 发表于 2019-11-5 17:52
不是动态vhd。

刚看你更新了模块,下来试了,连iso都出错了,之前是可以启动的。

前两天的都要删干净。用我新上传的grubx64.efi,也不要用老版本的grub2 chainload新的efi。
作者: haook    时间: 2019-11-5 18:40
请问楼主,wim10动态VHDx支持吗,谢谢
作者: ster1357A    时间: 2019-11-5 18:54
U盘是exfat 格式 vhd 能启动吗
作者: wintoflash    时间: 2019-11-5 19:49
haook 发表于 2019-11-5 18:40
请问楼主,wim10动态VHDx支持吗,谢谢

不支持vhdx
作者: liujun2000    时间: 2019-11-5 20:11
wintoflash 发表于 2019-11-5 17:12
现在支持动态VHD了(不支持差分)
先挂载vhd到vhd0 (也可以是其他盘符)
vhd vhd0 /test.vhd

这样启动的是内存系统 还是 普通系统
作者: wintoflash    时间: 2019-11-5 20:26
liujun2000 发表于 2019-11-5 20:11
这样启动的是内存系统 还是 普通系统

什么叫内存系统什么叫普通系统
作者: liujun2000    时间: 2019-11-5 20:38
内存内运行 还是在 vhd或者磁盘上运行
作者: liujun2000    时间: 2019-11-5 21:07
常      规UEFI ---bootx64.efi ---bootmgfw.efir----vhd-----WINLOAD.Efi
其他改版UEFI ---bootx64.efi---grub.cfg---bootmgfw.efi---vhd------WINLOAD.Efi
你      的UEFI ---bootx64.efi---grub.cfg---vhd----bootmgr---bcd---WINLOAD.EXE
都是可读写vhd
你看我理解对不
作者: wintoflash    时间: 2019-11-5 21:11
liujun2000 发表于 2019-11-5 21:07
常      规UEFI ---bootx64.efi ---bootmgfw.efir----vhd-----WINLOAD.Efi
其他改版UEFI ---bootx64.efi-- ...

你把它理解成grub4dos的map就行了
作者: hilsonma    时间: 2019-11-6 05:12
hilsonma 发表于 2019-11-5 17:52
不是动态vhd。

刚看你更新了模块,下来试了,连iso都出错了,之前是可以启动的。

加上blocklist模块就可以了。应该是启动iso需要blocklist和map这两个模块。原先只需要map一个模块。
作者: 窄口牛    时间: 2019-11-6 09:21
你有可能是混合光盘,既有img也有iso。
作者: liuzhaoyzz    时间: 2019-11-6 10:53
wintoflash 发表于 2019-11-5 17:10
****更新****
新增--disk参数,支持仿真loopback虚拟盘,动态VHD等。
例:挂载动态VHD文件并仿真启动 (需 ...



vhd vhd0 /test.vhd
map --disk --type=HD vhd0

能否map --mem --disk --type=HD vhd0这样?能否启动?
grub4dos用map --mem启动vhd,需要vhd里面安装firadisk/winvblock/svbus这一类的驱动,因为grub4dos运行于实模式下,进入保护模式之后实模式下仿真的内存盘会失效,所以需要这一类的驱动来带入到保护模式下。而grub2是否直接运行于保护模式,还要不要类似的驱动呢?
        

作者: wintoflash    时间: 2019-11-6 11:11
liuzhaoyzz 发表于 2019-11-6 10:53
能否map --mem --disk --type=HD vhd0这样?能否启动?
grub4dos用map --mem启动vhd,需要vhd里面 ...
能否map --mem --disk --type=HD vhd0这样?

可以。
grub4dos用map --mem启动vhd,需要vhd里面安装firadisk/winvblock/svbus这一类的驱动,因为grub4dos运行于实模式下,进入保护模式之后实模式下仿真的内存盘会失效,所以需要这一类的驱动来带入到保护模式下。而grub2是否直接运行于保护模式,还要不要类似的驱动呢?

需要。
这跟cpu的模式其实没有太大关系。跟操作系统/启动管理器的设计有关。
比如UEFI下,其他启动管理器/uefi shell读文件都是直接用SimpleFileSystemProtocol,grub2不用这一套。所以uefi固件的ntfs驱动grub2用不了,反之亦然。
作者: liuzhaoyzz    时间: 2019-11-6 11:15
您说的第一个问题grub2可以map --mem --disk --type=HD vhd0可以启动,是加载到内存盘,然后从内存盘启动的吗?
第二个问题说需要类似firadisk/winvblock/svbus这一类的驱动,那这个驱动是grub2提供的吗?        

作者: wintoflash    时间: 2019-11-6 11:20
liuzhaoyzz 发表于 2019-11-6 11:15
您说的第一个问题grub2可以map --mem --disk --type=HD vhd0可以启动,是加载到内存盘,然后从内存盘启动的 ...

是的。操作系统想读内存盘,需要的这个驱动是操作系统的驱动。
作者: liuzhaoyzz    时间: 2019-11-6 11:29
本帖最后由 liuzhaoyzz 于 2019-11-6 16:54 编辑

期望wintoflash大神更新grub filemanager以支持PE.iso的遍历,我试了下你修改的grub2里面的map --mem pe.iso已经很稳定了啊。你那个帖子删了,我只能顺着别人修改过的版本来测试grubfm,之前我没有学习grub2,因为之前grub2虽然支持UEFI,但是不支持map --mem pe.iso,bootmgr本身就能够支持wim启动,我更喜欢ISO整体仿真启动的模式,所以没有学习grub2,现在想学着用用grub2,结果您的帖子清空了,世界就是这样子,好的东西失去的时候才会让人后悔莫及,好的软件的被发现并被使用是需要时间的,可能需要很长的时间。        
作者: liaonf    时间: 2019-11-6 15:38
W大,WIM格式的PE如何启动?
作者: wintoflash    时间: 2019-11-6 16:18
liaonf 发表于 2019-11-6 15:38
W大,WIM格式的PE如何启动?

wimboot命令。要自备bootmgfw.efi, bcd. boot.sdi
可以参考 http://bbs.wuyou.net/forum.php?mod=viewthread&tid=413597
作者: wintoflash    时间: 2019-11-6 16:24
liuzhaoyzz 发表于 2019-11-6 11:29
期望wintoflash大神更新grub filemanager以支持PE.iso的遍历,我试了下你修改的grub2里面的map --mem pe.is ...

grub2-filemanager/我修改的grub2一直都在github上发布。在Linux下,论坛上发帖并不方便,而且论坛有敏感词过滤系统,有些词莫名其妙。之前的帖子想编辑下,改改上面的代码,结果提示有非法词汇,研究了半天才发现led是敏感词,太蛋疼了。
另外,在论坛上发布就对国际友人不太友好。
https://github.com/a1ive/grub
https://github.com/a1ive/grub2-filemanager

我试了下你修改的grub2里面的map --mem pe.iso已经很稳定了啊

因为我还要让它支持32位UEFI,,时机成熟自然会更新。
作者: liuzhaoyzz    时间: 2019-11-6 16:38
本帖最后由 liuzhaoyzz 于 2019-11-6 16:43 编辑

led
我试了可以发送啊,难道对于windows和linux操作系统过滤的关键字还不同啊?

我看了您在github发布的release版本,grubfm-zh_CN.7z,大小有6.76MB,为啥有的网友修改的版本只有几百KB(不包括boot.sdi),似乎是基于您的grubfm修改的。


作者: wintoflash    时间: 2019-11-6 16:47
liuzhaoyzz 发表于 2019-11-6 16:38
led
我试了可以发送啊,难道对于windows和linux操作系统过滤的关键字还不同啊?

不同时间/日期 似乎过滤程度不一样。前段时间不是10.1嘛,可能严一些。
他们修改的是我写的适用于任意版本grub2的简化菜单。
https://github.com/a1ive/grub2-f ... /samples/grubfm.cfg
作者: 879792799    时间: 2019-11-6 17:08
干嘛用的 我是菜鸟   是不是类似G4D中五大的siso模块啊???
作者: liuzhaoyzz    时间: 2019-11-6 19:20
本帖最后由 liuzhaoyzz 于 2019-11-6 22:14 编辑
879792799 发表于 2019-11-6 17:08
干嘛用的 我是菜鸟   是不是类似G4D中五大的siso模块啊???


差不多类似5大的siso,5大的siso里面run模块似乎也是源自sratlf的run模块,不知道改动了哪些。现在的grubfm支持wim,txt等等文件的遍历查看或者直接起动,还不支持iso遍历启动,当然对于wintoflash大神来说,只是举手之劳,a piece of cake。        




欢迎光临 无忧启动论坛 (http://wuyou.net/) Powered by Discuz! X3.3