无忧启动论坛

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

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

    [复制链接]
发表于 2019-11-4 22:01:13 来自手机 | 显示全部楼层
你牛,只有楼主敢惹你,反正我是不敢。
回复

使用道具 举报

发表于 2019-11-5 07:08:55 | 显示全部楼层
本帖最后由 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,稍嫌麻烦。
        

点评

这年头几MB还要计较大小啊。。 不需要udf/iso格式,可以把udf和iso9660删掉。 不需要exfat,也可以删。 不需要echo/ls/reboot/halt之类的命令,也可以删。 不需要使用blocklist表示法,例如(hd0,1)123+456这  详情 回复 发表于 2019-11-5 08:55
回复

使用道具 举报

 楼主| 发表于 2019-11-5 08:55:02 | 显示全部楼层
本帖最后由 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之类的模块理论上也能删,只是不显示任何东西了。
回复

使用道具 举报

发表于 2019-11-5 09:28:00 | 显示全部楼层
本帖最后由 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?

        

点评

vbe 是BIOS下的显示模式。 加上 就可以了。  详情 回复 发表于 2019-11-5 09:41
回复

使用道具 举报

 楼主| 发表于 2019-11-5 09:41:31 | 显示全部楼层
liuzhaoyzz 发表于 2019-11-5 09:28
谢谢回复,知道了。因为之前主要是用grldr,只有310KB,突然来了个3.18MB有点不习惯,windows的bootx64.efi ...

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

就可以了。

点评

大神就是大神!一句话画龙点睛啊!果然可以了,怎么网上的菜单没见到这一句。。。  详情 回复 发表于 2019-11-5 09:47
回复

使用道具 举报

发表于 2019-11-5 09:47:39 | 显示全部楼层
本帖最后由 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启动?   

点评

模块"grubfm"指的是什么?grubfm.mod? grubfm.cfg 是在哪里下载的? ------------------------ 现在还只是功能测试阶段,先别搞这些复杂的玩意,否则万一命令变动了不兼容。 这个帖子里的附件目前仅供测试,我  详情 回复 发表于 2019-11-5 11:19
回复

使用道具 举报

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

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


点评

https://github.com/a1ive/grub2-filemanager grub2-filemanager 这不是您的大作吗?然后众多网友基于您的大作做了很多修改版,比如江南一根葱修改的,还有其他网友修改的等等。 有的网友修改之后的模板很小,gru  详情 回复 发表于 2019-11-5 11:39
回复

使用道具 举报

发表于 2019-11-5 11:39:33 | 显示全部楼层
本帖最后由 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就更好了。

        
回复

使用道具 举报

发表于 2019-11-5 11:45:12 | 显示全部楼层
本帖最后由 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, 下载次数: 129, 下载积分: 无忧币 -2

回复

使用道具 举报

 楼主| 发表于 2019-11-5 17:10:54 | 显示全部楼层
****更新****
新增--disk参数,支持仿真loopback虚拟盘,动态VHD等。
例:挂载动态VHD文件并仿真启动 (需要vhd模块)
  1. vhd vhd0 /test.vhd
  2. map --disk --type=HD vhd0
复制代码

例:挂载ISO为loopback盘并仿真启动
  1. loopback loop /abcd.iso
  2. map --disk --type=CD loop
复制代码
(1楼附件已更新,请不要再使用上一版的文件,防止不兼容情况)

点评

vhd vhd0 /test.vhd map --disk --type=HD vhd0 能否map --mem --disk --type=HD vhd0这样?能否启动? grub4dos用map --mem启动vhd,需要vhd里面安装firadisk/winvblock/svbus这一类的驱动,因为grub4dos运行  详情 回复 发表于 2019-11-6 10:53
回复

使用道具 举报

 楼主| 发表于 2019-11-5 17:12:30 | 显示全部楼层
指南针 发表于 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 20:11
差分是暂时不支持,还是后面都无法支持?  详情 回复 发表于 2019-11-5 17:14
回复

使用道具 举报

发表于 2019-11-5 17:14:31 | 显示全部楼层
wintoflash 发表于 2019-11-5 17:12
现在支持动态VHD了(不支持差分)
先挂载vhd到vhd0 (也可以是其他盘符)
vhd vhd0 /test.vhd

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

使用道具 举报

发表于 2019-11-5 17:29:41 | 显示全部楼层
还有疑问,用这种方式启动的vhd,应该是对vhd本身有要求吧?
vhd的分区表是用MBR还是GPT?如果是MBR应该要激活系统分区?

旧时代在普通MBR硬盘启动vhd都是需要bootmgr和bcd指定vhd的,现在是模拟成硬盘启动了,也就说,vhd内必须保证系统的完整性(不能少bootmgr之类),因为以前用ntboot来启动是可以不需具备vhd内部的引导文件也能启动成功

点评

mbr/gpt均可,gpt的没测试过。 首先,会尝试启动激活分区/ESP分区的/efi/boot/bootx64.efi 如果不行,就尝试启动该硬盘在UEFI固件下显示的第一个分区里面的/efi/boot/bootx64.efi。 VHD里面的必须有引导,如果里  详情 回复 发表于 2019-11-5 17:39
回复

使用道具 举报

发表于 2019-11-5 17:31:15 | 显示全部楼层
另外,假设能启动了差分vhd,如何实现grub2下面的秒还原可能又是个问题,因为我之前发过提问,但楼主回答grub2下没有能对ntfs分区写入的mod
回复

使用道具 举报

 楼主| 发表于 2019-11-5 17:39:23 | 显示全部楼层
本帖最后由 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,不靠谱。
回复

使用道具 举报

发表于 2019-11-5 17:41:07 | 显示全部楼层
grub2vhd.jpg

点评

这是动态VHD?还是没有分区表的VHD?  详情 回复 发表于 2019-11-5 17:44
回复

使用道具 举报

 楼主| 发表于 2019-11-5 17:44:53 | 显示全部楼层

这是动态VHD?还是没有分区表的VHD?

点评

不是动态vhd。 刚看你更新了模块,下来试了,连iso都出错了,之前是可以启动的。  详情 回复 发表于 2019-11-5 17:52
回复

使用道具 举报

发表于 2019-11-5 17:52:39 | 显示全部楼层
本帖最后由 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
刚才更新后不能启动了,要用回你的全部模块才可以,不知道我上面的少了哪个模块。

点评

加上blocklist模块就可以了。应该是启动iso需要blocklist和map这两个模块。原先只需要map一个模块。  详情 回复 发表于 2019-11-6 05:12
前两天的都要删干净。用我新上传的grubx64.efi,也不要用老版本的grub2 chainload新的efi。  详情 回复 发表于 2019-11-5 18:03
回复

使用道具 举报

 楼主| 发表于 2019-11-5 18:03:12 | 显示全部楼层
hilsonma 发表于 2019-11-5 17:52
不是动态vhd。

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

前两天的都要删干净。用我新上传的grubx64.efi,也不要用老版本的grub2 chainload新的efi。
回复

使用道具 举报

发表于 2019-11-5 18:40:57 | 显示全部楼层
请问楼主,wim10动态VHDx支持吗,谢谢

点评

不支持vhdx  详情 回复 发表于 2019-11-5 19:49
回复

使用道具 举报

发表于 2019-11-5 18:54:22 | 显示全部楼层
U盘是exfat 格式 vhd 能启动吗
回复

使用道具 举报

 楼主| 发表于 2019-11-5 19:49:49 | 显示全部楼层
haook 发表于 2019-11-5 18:40
请问楼主,wim10动态VHDx支持吗,谢谢

不支持vhdx
回复

使用道具 举报

发表于 2019-11-5 20:11:06 | 显示全部楼层
wintoflash 发表于 2019-11-5 17:12
现在支持动态VHD了(不支持差分)
先挂载vhd到vhd0 (也可以是其他盘符)
vhd vhd0 /test.vhd

这样启动的是内存系统 还是 普通系统

点评

什么叫内存系统什么叫普通系统  详情 回复 发表于 2019-11-5 20:26
回复

使用道具 举报

 楼主| 发表于 2019-11-5 20:26:26 | 显示全部楼层
liujun2000 发表于 2019-11-5 20:11
这样启动的是内存系统 还是 普通系统

什么叫内存系统什么叫普通系统
回复

使用道具 举报

发表于 2019-11-5 20:38:02 | 显示全部楼层
内存内运行 还是在 vhd或者磁盘上运行
回复

使用道具 举报

发表于 2019-11-5 21:07:12 | 显示全部楼层
常      规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
你看我理解对不

点评

你把它理解成grub4dos的map就行了  详情 回复 发表于 2019-11-5 21:11
回复

使用道具 举报

 楼主| 发表于 2019-11-5 21:11:29 | 显示全部楼层
liujun2000 发表于 2019-11-5 21:07
常      规UEFI ---bootx64.efi ---bootmgfw.efir----vhd-----WINLOAD.Efi
其他改版UEFI ---bootx64.efi-- ...

你把它理解成grub4dos的map就行了
回复

使用道具 举报

发表于 2019-11-6 05:12:08 | 显示全部楼层
hilsonma 发表于 2019-11-5 17:52
不是动态vhd。

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

加上blocklist模块就可以了。应该是启动iso需要blocklist和map这两个模块。原先只需要map一个模块。
回复

使用道具 举报

发表于 2019-11-6 09:21:43 来自手机 | 显示全部楼层
你有可能是混合光盘,既有img也有iso。
回复

使用道具 举报

发表于 2019-11-6 10:53:36 | 显示全部楼层
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是否直接运行于保护模式,还要不要类似的驱动呢?
        

点评

可以。 需要。 这跟cpu的模式其实没有太大关系。跟操作系统/启动管理器的设计有关。 比如UEFI下,其他启动管理器/uefi shell读文件都是直接用SimpleFileSystemProtocol,grub2不用这一套。所以uefi固件的ntfs  详情 回复 发表于 2019-11-6 11:11
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2020-10-27 03:11

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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