wintoflash 发表于 2019-11-20 17:40:12

NTBOOT & wimboot for UEFI GRUB2

本帖最后由 wintoflash 于 2021-3-2 19:10 编辑

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

wimboot
根据 ipxe wimboot 移植的模块,适用于 BIOS/UEFI,可以启动并修改 Windows NT6+ WIM。
使用方法
wimboot @:NAME1:FILE1 @:NAME2:FILE2 ...
BOOT OPTIONS (启动参数)
-g, --gui 显示图形启动界面 (不推荐开启)
-p, --pause 显示调试信息并在启动过程中暂停
-b, --rawbcd 禁用 BCD 自动修改 (.exe 改为 .efi)
-w, --rawwim 禁用 WIM 自动修改
-i, --index=n 指定要启动的WIM卷号
-p, --pause 启动前暂停
-j, --inject=WIN32_PATH 指定射入文件夹,默认为 \Windows\Syatem32

@:NAME:FILE
指定要加载的文件 FILE,其被射入虚拟盘后文件名为 NAME。若未射入 BCD 或 boot.sdi,将使用内置 BCD 和 boot.sdi

BCD OPTIONS (BCD 内部启动选项,仅当使用内置 BCD 时才有效。在使用 yes|no 的地方,也可以使用 on|off, true|false, 1|0):
--testmode=yes|no 测试模式 (testsigning)。
--highest=yes|no 强制使用最高分辨率。
--nx=OptIn|OptOut|AlwaysOff|AlwaysOn 指定 NX 策略。
--pae=Default|Enable|Disable 指定 PAE 策略。
--detecthal=yes|no 检测 HAL 和 kernel。
--winpe=yes|no 启动到 WinPE 模式 (/MININT)。
--timeout=n 设置超时。
--sos=yes|no 启用 SOS 模式。
--novesa=yes|no 禁用 VESA BIOS 调用。
--novga=yes|no 禁用 VGA 模式。
--loadoptions=XXX 指定 NT 内核加载参数。
--winload=\\WIN32_PATH 指定 winload 路径。
--sysroot=\\WIN32_PATH 指定系统根目录。
示例1: 启动 WIM
wimboot --rawwim @:bootmgfw.efi:/boot/grub/bootmgfw.efi @:boot.wim:/wim/wepe.wim
示例2: 启动 WIM,关闭测试模式,启用 PAE
wimboot --testmode=no --pae=Enable --rawwim @:bootmgfw.efi:/boot/grub/bootmgfw.efi @:boot.wim:/wim/wepe.wim
示例3: 启动 WIM 的第二卷,并射入替代 explorer
wimboot --index=2 @:bootmgfw.efi:/boot/bootmgfw.efi @:explorer.exe:/boot/explorer.exe \
            @:WinXShell.exe:/boot/WinXShell.exe @:WinXShell.jcfg:/boot/WinXShell.jcfg \
            @:winpeshl.ini:/boot/winpeshl.ini @:boot.wim:(loop)/sources/boot.wim
注意事项
wim 文件体积不得超过 4GB。

NTBOOT
根据 chenall 的 GRUB4DOS NTBOOT 移植的模块,适用于 BIOS/UEFI,可以启动 Windows 系统/WIM/VHD。
使用方法
ntboot [-g] [-p] -e FILE [-s FILE] FILE
-g, --gui 显示图形启动界面 (不推荐开启)
-p, --pause 显示调试信息并在启动过程中暂停
-e, --efi=FILE 指定 bootmgfw.efi / bootmgr.exe 的路径。
-s, --sdi=FILE 指定 boot.sdi 的路径。若无此参数,则使用内部生成的 boot.sdi。

BOOT TYPE (指定启动文件类型,默认情况下根据文件扩展名自动判断):
-w, --wim 指定启动类型为 wim。
-n, --win 指定启动类型为 Windows 系统。
-v, --vhd 指定启动类型为 VHD。
-r, --ramvhd 指定启动类型为 RamOS VHD (此选项仅供测试)

BCD OPTIONS (BCD 内部启动选项,在使用 yes|no 的地方,也可以使用 on|off, true|false, 1|0):
--testmode=yes|no 测试模式 (testsigning)。
--highest=yes|no 强制使用最高分辨率。
--nx=OptIn|OptOut|AlwaysOff|AlwaysOn 指定 NX 策略。
--pae=Default|Enable|Disable 指定 PAE 策略。
--detecthal=yes|no 检测 HAL 和 kernel。
--winpe=yes|no 启动到 WinPE 模式 (/MININT)。
--imgoffset=n 指定 RamOS VHD 内存盘偏移。
--timeout=n 设置超时。
--sos=yes|no 启用 SOS 模式。
--novesa=yes|no 禁用 VESA BIOS 调用。
--novga=yes|no 禁用 VGA 模式。
--loadoptions=XXX 指定 NT 内核加载参数。
--winload=\\WIN32_PATH 指定 winload 路径。
--sysroot=\\WIN32_PATH 指定系统根目录。
示例1: 启动WIM
ntboot --efi=/xxx/bootmgfw.efi --wim /xxx/xxx.wim
示例2: 启动VHD
ntboot --efi=/xxx/bootmgfw.efi --vhd /xxx/xxx.vhd
示例3: 启动 Windows 系统
ntboot --efi=/xxx/bootmgfw.efi --win (hd0,4)
示例4: 启动WIM,禁用测试模式,启用 PAE
ntboot --efi=/xxx/bootmgfw.efi --wim /xxx/xxx.wim --testmode=no --pae=Enable

注意事项
只支持硬盘 mbr/gpt 分区表 FAT/NTFS 分区上的文件。
启动 VHD 可能会有个错误(如下图),不过不要慌,按两遍回车就可以了。


下载
https://github.com/a1ive/grub/releases/tag/latest

技术细节
wimboot 可以生成一个 bootmgfw.exe/bootmgr.exe 可识别的单分区 FAT32 虚拟盘, 将 bootmgfw.efi, bcd 等文件放入其中即可启动。BCD 文件为 bootmgfw.efi 读取的启动配置文件,其格式为 REGF (Windows 注册表)。关于 REGF,可以到这里了解更多。boot.sdi 文件为 bootmgfw.efi 启动 WIM 必须的 System Deployment Image 文件,可以到这里了解更多。wimboot 内置了一个 REGF/BCD 解析器,可以解析并自动修改 BCD 的内容;同时也内置了 boot.sdi 生成工具,可以自动生成所需的 boot.sdi。wimboot 启动方式与 NTBOOT 启动方式的主要区别是 wimboot 启动时,WIM 文件也放入FAT32虚拟盘中,而 NTBOOT 启动时,WIM 不在启动盘中。因此,wimboot 方式可以虚拟修改 WIM 内容,向其中插入文件而不用改变实际文件内容,NTBOOT 则不可以。wimboot 会将除了 bcd, boot.sdi, WIM 自身之外的所有文件都射入 WIM 的 \Windows\System32 目录下。但是由于 VHD 启动过程中需要从真实硬盘读取 VHD,所以 wimboot 方式无法启动 VHD。


grub-mkimage -d x86_64-efi -p /boot/grub -o grubx64.efi -O x86_64-efi acpi all_video bitmap bitmap_scale blocklist boot cat chain cmp commandline configfile cpio date datehook dd disk echo efi_gop efi_uga efifwsetup exfat expr ext2 extcmd fat fb file font fshelp getenv getkey gfxmenu gfxterm gfxterm_background gfxterm_menu gzio halt hashsum help hexdump iso9660 jfs jpeg keystatus linux linuxefi loadenv loopback ls lua lzopio memdisk minicmd multiboot multiboot2 newc normal ntfs part_gpt part_msdos partnew parttool png probe progress random read reboot regexp sbpolicy search sleep squash4 tar terminal terminfo test tga time udf vhd video video_colors video_fb videoinfo xzio map wimboot ntboot

参考
参考了以下项目的代码或文档,感谢开源
iPXE wimboot
NTBOOT by chenall
quibble
REGF Spec
BCD Elements
SDI Spec

源码
https://github.com/a1ive/grub 许可协议 GPLv3

maghreb 发表于 2019-11-20 17:51:59

前排支持一下

红毛樱木 发表于 2019-11-20 18:01:40

LZ最近移植的功能多,要升仙封神了

yynq 发表于 2019-11-20 18:49:54

{:1_183:}{:1_183:}支持一下支持一下支持一下

江南一根葱 发表于 2019-11-20 19:18:39

红毛樱木 发表于 2019-11-20 18:01
LZ最近移植的功能多,要升仙封神了

红毛改个磁盘驱动出来,让瘟哆撕能认到grub2的内存盘{:1_201:}

minmax 发表于 2019-11-20 19:25:25

期待支持 差分及VHDX

创新科技2015 发表于 2019-11-20 20:36:16

很给力!

2010up 发表于 2019-11-20 20:52:48

可以写一个,UEFI GRUB2PXE引导 的事例吗?

wuwuzz 发表于 2019-11-20 21:01:49

本帖最后由 wuwuzz 于 2019-11-20 21:03 编辑

启动U盘上的固定wtg.vhd成功。

红毛说的没错,LZ最近功劳很大,要升仙
封神了。

下一步,需要有人写识别虚拟盘的win驱动,
以充分发挥MAP的作用。



2012kwy 发表于 2019-11-20 21:04:37

某些绕过安全打包的grub2版本为2.02,楼主的grub2为2.05版,且某些模块还是特制的,请问如何兼容?如果出现某mod已加载的提示,该如何处理?

2010sya 发表于 2019-11-20 21:20:42

谢谢W大,期待grub2能有更广泛的应用!{:1_186:}

wintoflash 发表于 2019-11-20 21:21:48

本帖最后由 wintoflash 于 2019-11-20 21:23 编辑

2012kwy 发表于 2019-11-20 21:04
某些绕过安全打包的grub2版本为2.02,楼主的grub2为2.05版,且某些模块还是特制的,请问如何兼容?如果出现 ...
没看我的帖子?
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=416924都能绕过安全启动了,直接chainload这个grub不就行了

wintoflash 发表于 2019-11-20 21:27:19

2010up 发表于 2019-11-20 20:52
可以写一个,UEFI GRUB2PXE引导 的事例吗?

@江南一根葱

wintoflash 发表于 2019-11-20 21:27:50

minmax 发表于 2019-11-20 19:25
期待支持 差分及VHDX

如果bootmgfw.efi能直接启,那就行,否则,不行.

liujun2000 发表于 2019-11-20 21:54:13

wintoflash 发表于 2019-11-20 21:27
如果bootmgfw.efi能直接启,那就行,否则,不行.

能给一个模板么

adef 发表于 2019-11-20 22:31:26

顶一个捞点分

ksafei 发表于 2019-11-20 22:56:08

本帖最后由 ksafei 于 2019-11-20 23:00 编辑

虚拟机测试可以,实体机还未成功,继续测试....

发现此版grubx64.efi不兼容wimboot方式启动wim了,是不是参数有变?
loopback wimboot /boot/grub/wimboot.gz
wimboot @:bootmgfw.efi:(wimboot)/bootmgfw.efi @:bcd:(wimboot)/bcd @:boot.sdi:(wimboot)/boot.sdi @:boot.wim:/test/test.wim

wintoflash 发表于 2019-11-21 07:59:57

ksafei 发表于 2019-11-20 22:56
虚拟机测试可以,实体机还未成功,继续测试....

发现此版grubx64.efi不兼容wimboot方式启动wim了,是不 ...

我这边可以啊

826773297 发表于 2019-11-21 12:01:42

希望能够加上wim分卷启动功能,这样可以节省空间,另外虚拟盘能否在光盘下运作wim,每次量产后grub2都只能调用shell来启动pe太麻烦

wintoflash 发表于 2019-11-21 13:00:27

826773297 发表于 2019-11-21 12:01
希望能够加上wim分卷启动功能,这样可以节省空间,另外虚拟盘能否在光盘下运作wim,每次量产后grub2都只能 ...

那你应该用wimboot啊,支持指定启动分卷。
ntboot本来就是用于硬盘启动的。
现在新一代wimboot比前一代速度快了,而且不再像前一代那样占用两倍内存。

826773297 发表于 2019-11-21 15:01:21

wintoflash 发表于 2019-11-21 13:00
那你应该用wimboot啊,支持指定启动分卷。
ntboot本来就是用于硬盘启动的。
现在新一代wimboot比前一代 ...

好的,有空试试

ksafei 发表于 2019-11-22 14:12:42

wintoflash 发表于 2019-11-21 07:59
我这边可以啊

我这里的测试结果:
1.如采用绕过UEFI安全启动,然后用 chainloader /efi/boot/grubx64.efi引导 则ntboot和wimboot均报错;
2.如关闭安全启动,将grubx64.efi 改为 bootx64.efi 引导,则ntboot和wimboot正常;
3.wimboot 如用loopback wimboot /boot/grub/wimboot.gz
                     ........   (报错)
如下方式则正常:
wimboot @:bootmgfw.efi:"${prefix}"/wimboot/bootmgfw.efi \
                        @:bcd:"${prefix}"/wimboot/bcd \
                        @:boot.sdi:"${prefix}"/wimboot/boot.sdi \
                        @:boot.wim:"${wimroot}"$2
4.用11.21版文件管理器生成的grubfmx64.efi,在安全启动和关闭两种模式使用 ntboot和wimboot引导wim均报错

或许是我使用不当产生错误,还请wintoflash大指点

wintoflash 发表于 2019-11-22 15:09:42

ksafei 发表于 2019-11-22 14:12
我这里的测试结果:
1.如采用绕过UEFI安全启动,然后用 chainloader /efi/boot/grubx64.efi引导 则ntboo ...


3.wimboot 如用loopback wimboot /boot/grub/wimboot.gz
                     ........   (报错)
如下方式则正常:
wimboot @:bootmgfw.efi:"${prefix}"/wimboot/bootmgfw.efi \
                        @:bcd:"${prefix}"/wimboot/bcd \
                        @:boot.sdi:"${prefix}"/wimboot/boot.sdi \
                        @:boot.wim:"${wimroot}"$2
这一段没太看懂,能详细些吗?

minmax 发表于 2019-11-22 16:08:52

wintoflash 发表于 2019-11-20 21:27
如果bootmgfw.efi能直接启,那就行,否则,不行.

bootmgfw.efi能直接启,可以,透過引導BCD ?

ksafei 发表于 2019-11-22 17:20:22

本帖最后由 ksafei 于 2019-11-22 17:35 编辑

wintoflash 发表于 2019-11-22 15:09
这一段没太看懂,能详细些吗?
一、UEFI安全模式启动,ntboot和wimboot均报错
1.ntboot报错如下:



2.wimboot报错如下:
菜单a:
loopback wimboot /boot/grub/wimboot.gz
wimboot @:bootmgfw.efi:(wimboot)/bootmgfw.efi @:bcd:(wimboot)/bcd @:boot.sdi:(wimboot)/boot.sdi @:boot.wim:"${wimroot}"$2




菜单b:
wimboot @:bootmgfw.efi:"${prefix}"/wimboot/bootmgfw.efi \
   @:bcd:"${prefix}"/wimboot/bcd \
   @:boot.sdi:"${prefix}"/wimboot/boot.sdi \
   @:boot.wim:"${wimroot}"$2



二、关闭安全模式
将grubx64.efi 改名为 bootx64.efi 引导启动

1.ntboot正常

2.wimboot
(1)菜单a BCD报错同上
(2)菜单b 正常

ksafei 发表于 2019-11-22 17:26:53

通过以上测试对新的 grubx64.efi 有如下疑惑:
一是好像不支持安全启动模式 ;
二是对 loopback wimboot /boot/grub/wimboot.gz 语句好像不支持了

wintoflash 发表于 2019-11-22 17:34:09

ksafei 发表于 2019-11-22 17:26
通过以上测试对新的 grubx64.efi 有如下疑惑:
一是好像不支持安全启动模式 ;
二是对 loopback wimboot...

loopback的那个图,你按回车试试?

ksafei 发表于 2019-11-22 17:37:53

wintoflash 发表于 2019-11-22 17:34
loopback的那个图,你按回车试试?

按回车显示如下图:


wintoflash 发表于 2019-11-22 18:56:35

ksafei 发表于 2019-11-22 17:37
按回车显示如下图:

我这里loopback没问题。
关于安全启动,暂时放弃吧。微软搞事情,证书失效,我也没办法。

ksafei 发表于 2019-11-22 20:33:46

wintoflash 发表于 2019-11-22 18:56
我这里loopback没问题。
关于安全启动,暂时放弃吧。微软搞事情,证书失效,我也没办法。

明白。wimboot、map和ntboot等模块是对grub2的创新和发展,感谢wintoflash大的辛苦付出和分享。期待有更多更好的成果
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: NTBOOT & wimboot for UEFI GRUB2