无忧启动论坛

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

[原创] NTBOOT & wimboot for UEFI GRUB2

    [复制链接]
发表于 2020-7-11 13:43:22 | 显示全部楼层
wintoflash 发表于 2020-7-4 19:28
测试版本

现在 wimboot 和 ntboot 模块在 Legacy BIOS 下也可用了。

ntboot可以启动指定的WIM卷号吗?

点评

wimboot可以,ntboot不行  详情 回复 发表于 2020-7-11 13:47
回复

使用道具 举报

 楼主| 发表于 2020-7-11 13:47:53 | 显示全部楼层
青青草 发表于 2020-7-11 13:43
ntboot可以启动指定的WIM卷号吗?

wimboot可以,ntboot不行

点评

谢谢!  详情 回复 发表于 2020-7-11 16:24
回复

使用道具 举报

发表于 2020-7-11 16:24:59 | 显示全部楼层
wintoflash 发表于 2020-7-11 13:47
wimboot可以,ntboot不行

谢谢!
回复

使用道具 举报

发表于 2020-7-14 08:11:16 | 显示全部楼层
请教大神:
grub2能否判断 WIM 内部系统是 64 位还是32位?

点评

目前是根据 wim 内部 \Windows\System32\Boot\winload.exe 判断的,不知道是否准确。 https://github.com/a1ive/grub2-filemanager/blob/c4d790157e204fb6e8551df4eec75e855081f985/boot/grubfm/rules/iso/buildp  详情 回复 发表于 2020-7-14 08:49
回复

使用道具 举报

发表于 2020-7-14 08:35:52 | 显示全部楼层
谢谢楼主的分享
回复

使用道具 举报

 楼主| 发表于 2020-7-14 08:49:17 | 显示全部楼层
本帖最后由 wintoflash 于 2020-7-14 08:51 编辑
青青草 发表于 2020-7-14 08:11
请教大神:
grub2能否判断 WIM 内部系统是 64 位还是32位?

目前是根据 wim 内部 \Windows\System32\Boot\winload.exe 判断的,不知道是否准确。
  1. wimtools --is64 /wim/wepe.wim; echo $?
复制代码

示例
https://github.com/a1ive/grub2-f ... s/iso/buildpe.sh#L4
wimtools 详细用法见
https://a1ive.github.io/grub2_cmd_zh.html

点评

学习了。 反馈: if wimtools --is64 --index=1 "${filename_this}";then 成功! if wimtools --exist --is64 --index=1 "${filename_this}";then 则失败。  详情 回复 发表于 2020-7-14 15:52
回复

使用道具 举报

发表于 2020-7-14 15:52:17 | 显示全部楼层
wintoflash 发表于 2020-7-14 08:49
目前是根据 wim 内部 \Windows\System32\Boot\winload.exe 判断的,不知道是否准确。

示例

学习了。
反馈:
if wimtools --is64 --index=1 "${filename_this}";then
   成功!
if wimtools --exist --is64 --index=1 "${filename_this}";then   则失败。
回复

使用道具 举报

 楼主| 发表于 2020-7-14 17:11:01 | 显示全部楼层
青青草 发表于 2020-7-14 15:52
学习了。
反馈:
if wimtools --is64 --index=1 "${filename_this}";then
if wimtools --exist --is64 --index=1 "${filename_this}";then   则失败。

你这个用法莫名其妙,完全不正确。
--exist 是判断 WIM 内部是否存在某文件的,比如
wimtools --exist /wim/boot.wim \\Windows\\System32\\abcd.exe
回复

使用道具 举报

发表于 2020-7-14 17:18:35 | 显示全部楼层
wintoflash 发表于 2020-7-14 17:11
你这个用法莫名其妙,完全不正确。
--exist 是判断 WIM 内部是否存在某文件的,比如
wimtools --exis ...

--exist, -e 检测文件是否存在
我以为是检测指定的WIM卷号是否存在。理解错了!
谢谢!
回复

使用道具 举报

 楼主| 发表于 2020-7-14 18:01:50 | 显示全部楼层
青青草 发表于 2020-7-14 17:18
--exist, -e 检测文件是否存在
我以为是检测指定的WIM卷号是否存在。理解错了!
谢谢!

检测指定的WIM卷号是否存在

如果需要这个功能的人很多,我可以加上这个功能。
回复

使用道具 举报

发表于 2020-7-14 18:32:16 | 显示全部楼层
wintoflash 发表于 2020-7-14 18:01
如果需要这个功能的人很多,我可以加上这个功能。

如果能加上这个功能,哪是再好不过了!
谢谢!
回复

使用道具 举报

发表于 2020-7-16 07:37:56 | 显示全部楼层
很给力!
回复

使用道具 举报

发表于 2020-7-16 19:37:32 | 显示全部楼层
wintoflash 发表于 2020-7-14 18:01
如果需要这个功能的人很多,我可以加上这个功能。

建议增加的功能:
      1、读取WIM中的总卷数;
      2、判断指定的WIM卷号是否存在;
回复

使用道具 举报

 楼主| 发表于 2020-7-16 20:19:02 | 显示全部楼层
青青草 发表于 2020-7-16 19:37
建议增加的功能:
      1、读取WIM中的总卷数;
      2、判断指定的WIM卷号是否存在;

功能2是功能1的子集,没必要存在。
回复

使用道具 举报

 楼主| 发表于 2020-7-16 20:58:22 | 显示全部楼层
更新了一下 wimboot/NTBOOT 的使用说明,顺便添加了原理介绍。
如果有朋友对 BCD/注册表感性趣,可以参考以下文章:
注册表文件结构解析 https://github.com/libyal/libreg ... 0Registry%20File%20(REGF)%20format.asciidoc
BCD 元素文档 https://www.geoffchappell.com/notes/windows/boot/bcd/elements.htm
NTBOOT 原理 http://bbs.wuyou.net/forum.php?mod=viewthread&tid=417518
我参考 quibble 修改的注册表解析代码 https://github.com/a1ive/grub/blob/master/grub-core/map/lib/reg.c
如果对 boot.sdi 感性趣,可以参考以下文章:
SDI 结构解析 https://skolk.livejournal.com/1320.html
boot.sdi 制作方法 http://bbs.wuyou.net/forum.php?mod=viewthread&tid=421193
回复

使用道具 举报

发表于 2020-7-16 22:22:36 | 显示全部楼层
wintoflash 发表于 2020-7-16 20:19
功能2是功能1的子集,没必要存在。

的确,功能2与功能1重复。如果可以,
      1、读取WIM中的总卷数;
      2、读取卷号对应的卷名称。
回复

使用道具 举报

发表于 2020-7-17 18:45:27 | 显示全部楼层
wintoflash 发表于 2020-7-14 17:11
你这个用法莫名其妙,完全不正确。
--exist 是判断 WIM 内部是否存在某文件的,比如
wimtools --exis ...

请教一下,
if wimtools --is64 --index=1 "${filename_this}";then
红色字的地方可以用变量么?
回复

使用道具 举报

 楼主| 发表于 2020-7-17 20:20:47 | 显示全部楼层
更新
1. 支持 XPRESS 压缩的 WIM。
2. wimtools 添加 --boot_index 和 --image_count 参数。
获取 wim 的总卷数:
wimtools --image_count=aaa (loop)/sources/install.wim; echo $aaa
获取 wim 可启动卷的卷号:
wimtools --boot_index=aaa (loop)/sources/boot.wim; echo $aaa
回复

使用道具 举报

发表于 2020-7-18 09:14:56 | 显示全部楼层
支持一下,谢谢分享
回复

使用道具 举报

发表于 2020-7-18 09:15:59 | 显示全部楼层
本帖最后由 青青草 于 2020-7-18 10:48 编辑
wintoflash 发表于 2020-7-17 20:20
更新
1. 支持 XPRESS 压缩的 WIM。
2. wimtools 添加 --boot_index 和 --image_count 参数。

获取 wim 可启动卷的卷号:
wimtools --boot_index=bbb (loop)/sources/boot.wim;

1、假如wim中可启动的有三个卷,那么,获取的卷号是?
    我这里,
    wimtools --image_count=aaa (loop)/sources/install.wim;  
              $aaa显示3
    wimtools --boot_index=bbb (loop)/sources/boot.wim;
             $bbb显示1
2、假如wim中可启动的有三个卷,如何用循环语句读取其卷号?

谢谢!
回复

使用道具 举报

 楼主| 发表于 2020-7-18 10:14:06 | 显示全部楼层
青青草 发表于 2020-7-18 09:15
获取 wim 可启动卷的卷号:
wimtools --boot_index=bbb (loop)/sources/boot.wim;

boot_index 是你用 bootmgfw.efi 启动时默认启动的卷号,这种可启动卷当然只能有一个。
回复

使用道具 举报

发表于 2020-7-18 10:50:06 | 显示全部楼层
本帖最后由 青青草 于 2020-7-18 10:54 编辑
wintoflash 发表于 2020-7-18 10:14
boot_index 是你用 bootmgfw.efi 启动时默认启动的卷号,这种可启动卷当然只能有一个。

假如wim中可启动的有{aaa}个卷,如何用循环语句读取其卷号?目的是通过循环语句分别显示{aaa}个菜单,启动各个卷
回复

使用道具 举报

 楼主| 发表于 2020-7-18 11:07:42 | 显示全部楼层
本帖最后由 wintoflash 于 2020-7-18 11:09 编辑
青青草 发表于 2020-7-18 10:50
假如wim中可启动的有{aaa}个卷,如何用循环语句读取其卷号?目的是通过循环语句分别显示{aaa}个菜单,启 ...

你说的 "可启动" 跟我说的 "可启动" 不是一码事。wimboot 可以启动任意卷,是不是可启动都没关系,只要卷里面不缺文件。
卷号是从1开始到总卷数的连续自然数,你每次加 1 就行了,不存在所谓 "读取" 的问题。
至于菜单怎么写,那你自己研究。论坛里有很多类似的例子。
回复

使用道具 举报

发表于 2020-7-18 11:11:32 | 显示全部楼层
wintoflash 发表于 2020-7-18 11:07
你说的 "可启动" 跟我说的 "可启动" 不是一码事。wimboot 可以启动任意卷,是不是可启动都没关系,只要卷 ...

已经解决了!谢谢!
回复

使用道具 举报

发表于 2020-7-18 11:53:48 | 显示全部楼层
wintoflash 发表于 2020-7-18 11:07
你说的 "可启动" 跟我说的 "可启动" 不是一码事。wimboot 可以启动任意卷,是不是可启动都没关系,只要卷 ...

再请教个问题:
       wimboot --index=1  @:bootmgfw.efi:(memdisk)/boot/grub/bootmgfw.efi @:boot.wim:"${filename_this}"
      可以启动。
wimboot --index="${bbb}"  @:bootmgfw.efi:(memdisk)/boot/grub/bootmgfw.efi @:boot.wim:"${filename_this}"
       无法启动。【${bbb}值为1】
如图。
1.png
回复

使用道具 举报

 楼主| 发表于 2020-7-18 12:01:01 | 显示全部楼层
青青草 发表于 2020-7-18 11:53
再请教个问题:
       wimboot --index=1  @:bootmgfw.efi:(memdisk)/boot/grub/bootmgfw.efi @:boot.w ...

你这明明是启动的第三个卷
回复

使用道具 举报

发表于 2020-7-18 12:11:31 | 显示全部楼层
本帖最后由 青青草 于 2020-7-18 12:16 编辑
wintoflash 发表于 2020-7-18 12:01
你这明明是启动的第三个卷

我的菜单:
menuentry "[${sequence}] 启动 ${name}卷${bbb}(${device})" "${device}" "${filename}" --unrestricted --hotkey="${sequence}"{        
                                     set root="$2";
                                     set filename_this="$3"                                                                  
                                      wimboot --index="${bbb}"  @:bootmgfw.efi:(memdisk)/boot/grub/bootmgfw.efi @:boot.wim:"${filename_this}"
           }

问题出在哪?
谢谢!
2.png
回复

使用道具 举报

 楼主| 发表于 2020-7-18 12:38:07 | 显示全部楼层
青青草 发表于 2020-7-18 12:11
我的菜单:
menuentry "[${sequence}] 启动 ${name}卷${bbb}(${device})" "${device}" "${filename}" - ...

你肯定在下面改变变量的值了。变量要通过menuentry的参数传递进去
回复

使用道具 举报

发表于 2020-7-18 12:57:04 | 显示全部楼层
wintoflash 发表于 2020-7-18 12:38
你肯定在下面改变变量的值了。变量要通过menuentry的参数传递进去

晕!犯了这么低级的错误。唉... ...
谢谢!
回复

使用道具 举报

发表于 2020-7-18 13:09:57 | 显示全部楼层
wintoflash 发表于 2020-7-18 12:38
你肯定在下面改变变量的值了。变量要通过menuentry的参数传递进去

如果能读取卷号对应的卷名称,就完美了!
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-3-29 05:52

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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