无忧启动论坛

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

[原创] NTBOOT & wimboot for UEFI GRUB2

    [复制链接]
发表于 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   则失败。

点评

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

使用道具 举报

 楼主| 发表于 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

点评

请教一下, if wimtools --is64 --index=1 "${filename_this}";then 红色字的地方可以用变量么?  详情 回复 发表于 2020-7-17 18:45
--exist, -e 检测文件是否存在 我以为是检测指定的WIM卷号是否存在。理解错了! 谢谢!  详情 回复 发表于 2020-7-14 17:18
回复

使用道具 举报

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

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

点评

如果需要这个功能的人很多,我可以加上这个功能。  详情 回复 发表于 2020-7-14 18:01
回复

使用道具 举报

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

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

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

点评

建议增加的功能: 1、读取WIM中的总卷数; 2、判断指定的WIM卷号是否存在;  详情 回复 发表于 2020-7-16 19:37
如果能加上这个功能,哪是再好不过了! 谢谢!  详情 回复 发表于 2020-7-14 18:32
回复

使用道具 举报

发表于 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卷号是否存在;

点评

功能2是功能1的子集,没必要存在。  详情 回复 发表于 2020-7-16 20:19
回复

使用道具 举报

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

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

点评

的确,功能2与功能1重复。如果可以, 1、读取WIM中的总卷数; 2、读取卷号对应的卷名称。  详情 回复 发表于 2020-7-16 22:22
回复

使用道具 举报

 楼主| 发表于 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
红色字的地方可以用变量么?

点评

可以 --index="${aaa}"  发表于 2020-7-17 20:18
回复

使用道具 举报

 楼主| 发表于 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

点评

获取 wim 可启动卷的卷号: wimtools --boot_index=aaa (loop)/sources/boot.wim; echo $aaa 假如wim中可启动的有三个卷,那么,获取的卷号是?  详情 回复 发表于 2020-7-18 09:15
回复

使用道具 举报

发表于 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中可启动的有三个卷,如何用循环语句读取其卷号?

谢谢!

点评

boot_index 是你用 bootmgfw.efi 启动时默认启动的卷号,这种可启动卷当然只能有一个。  详情 回复 发表于 2020-7-18 10:14
回复

使用道具 举报

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

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

点评

假如wim中可启动的有三个卷,如何用循环语句读取其卷号?  详情 回复 发表于 2020-7-18 10:50
回复

使用道具 举报

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

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

点评

你说的 "可启动" 跟我说的 "可启动" 不是一码事。wimboot 可以启动任意卷,是不是可启动都没关系,只要卷里面不缺文件。 至于菜单怎么写,那你自己研究。论坛里有很多类似的例子。  详情 回复 发表于 2020-7-18 11:07
回复

使用道具 举报

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

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

点评

再请教个问题: wimboot --index=1 @:bootmgfw.efi:(memdisk)/boot/grub/bootmgfw.efi @:boot.wim:"${filename_this}" 可以启动。 wimboot --index="${bbb}" @:bootmgfw.efi:(memdisk)/boot/grub  详情 回复 发表于 2020-7-18 11:53
已经解决了!谢谢!  详情 回复 发表于 2020-7-18 11:11
回复

使用道具 举报

发表于 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
回复

使用道具 举报

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

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

点评

我的菜单: menuentry "[${sequence}] 启动 ${name}卷${bbb}(${device})" "${device}" "${filename}" --unrestricted --hotkey="${sequence}"{  详情 回复 发表于 2020-7-18 12:11
回复

使用道具 举报

发表于 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
回复

使用道具 举报

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

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

点评

如果能读取卷号对应的卷名称,就完美了!  详情 回复 发表于 2020-7-18 13:09
晕!犯了这么低级的错误。唉... ... 谢谢!  详情 回复 发表于 2020-7-18 12:57
回复

使用道具 举报

发表于 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的参数传递进去

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

点评

不考虑添加这个功能。没有实际意义。  详情 回复 发表于 2020-7-18 13:25
回复

使用道具 举报

 楼主| 发表于 2020-7-18 13:25:23 | 显示全部楼层
青青草 发表于 2020-7-18 13:09
如果能读取卷号对应的卷名称,就完美了!

不考虑添加这个功能。没有实际意义。

点评

全自动菜单用到。 如 wimboot --index="${bbb}" 对应的名称为:"${bbb_name}" 菜单条:启动 "${bbb_name}"  详情 回复 发表于 2020-7-18 13:34
回复

使用道具 举报

发表于 2020-7-18 13:34:22 | 显示全部楼层
本帖最后由 青青草 于 2020-7-18 13:37 编辑
wintoflash 发表于 2020-7-18 13:25
不考虑添加这个功能。没有实际意义。

全自动菜单用到。
如 wimboot --index="${bbb}"  对应的名称为:"${bbb_name}"
菜单条:启动 "${bbb_name}"
这样,通用性就更强了!



回复

使用道具 举报

发表于 2020-7-18 17:36:18 | 显示全部楼层
https://github.com/a1ive/grub/commit/5936f5f47f3cfcaf9427c44e3ed43a9ffc0575fd开始,UEFI 下map img貌似没反应了。

menuentry "test" {
search -f -s /x.img
map -t hd /x.img
}
x.7z (99.87 KB, 下载次数: 4)

点评

已修复 https://github.com/a1ive/grub/commit/837cb3e452a644819048687970d86287c710d345 这个镜像没有分区表,应该属于 "软盘" 范畴吧。  详情 回复 发表于 2020-7-18 18:22
回复

使用道具 举报

 楼主| 发表于 2020-7-18 18:22:24 | 显示全部楼层
adef 发表于 2020-7-18 17:36
从https://github.com/a1ive/grub/commit/5936f5f47f3cfcaf9427c44e3ed43a9ffc0575fd开始,UEFI 下map img ...

已修复
https://github.com/a1ive/grub/co ... 87970d86287c710d345
这个镜像没有分区表,应该属于 "软盘" 范畴吧。

点评

img 文件是用 diskgenius 生成的“分区映像”。[attachimg]461719[/attachimg]  详情 回复 发表于 2020-7-18 20:28
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-3-29 02:14

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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