无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 111199|回复: 496
打印 上一主题 下一主题

[原创] NTloader: BIOS/UEFI 下用 GRUB4DOS 启动 VHD/WIM

    [复制链接]
跳转到指定楼层
1#
发表于 2021-1-31 16:08:47 | 显示全部楼层 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 wintoflash 于 2023-6-19 20:30 编辑

适用范围:
BIOS, x64 UEFI, ia32 UEFI 均可使用。
支持 MBR 分区表主分区、GPT 分区表任意分区 (不支持 MBR 分区表逻辑分区)
支持 FAT, NTFS, exFAT 文件系统 (VHD 不能位于 FAT 分区,老版本 Windows VHD 只能位于 NTFS 分区)
文件路径最好是不带空格的英文字母/数字。带空格的话传递参数时用冒号":"代替空格。
命令行长度不得超过 511。
使用方法:
启动 Windows WIM/VHD
假设 WIM 或 VHD 位于 (hdx,y),路径为 /path/to/winpe.wim
  1. title Boot Windows NT6+ PE
  2. uuid (hdx,y)
  3. kernel /ntloader uuid=%?_UUID% file=/path/to/winpe.wim
  4. initrd /initrd.lz1
复制代码
  1. title Boot Windows NT6+ PE
  2. uuid (hdx,y)
  3. chainloader /ntloader initrd=/initrd.lz1 uuid=%?_UUID% file=/path/to/winpe.wim
复制代码

启动 Windows 系统
假设系统文件夹位于 (hdx,y)
  1. title Boot Windows NT6+ PE
  2. uuid (hdx,y)
  3. kernel /ntloader uuid=%?_UUID%
  4. initrd /initrd.lz1
复制代码
  1. title Boot Windows NT6+ PE
  2. uuid (hdx,y)
  3. chainloader /ntloader initrd=/initrd.lz1 uuid=%?_UUID%
复制代码

命令行选项:
  1. uuid=%?_UUID%
复制代码

指定 文件所在分区文件系统 UUID。
  1. file=/xxx.vhd
复制代码

指定 VHD / WIM 文件路径。空格用冒号 ":" 代替。
  1. testmode=1
复制代码

启用测试模式。
  1. hires=1
复制代码

强制使用最高分辨率。
  1. pae=Enable|Disable|Default
复制代码

配置 PAE。
  1. nx=OptIn|OptOut|AlwaysOff|AlwaysOn
复制代码

配置 DEP。
  1. loadopt=XXX
复制代码

设置 Windows 加载选项。
  1. winload=/Windows/System32/winload.efi
复制代码

指定 winload.exe/winload.efi 的路径。
  1. sysroot=/Windows
复制代码

指定 Windows 系统根目录。
  1. quite
复制代码

不显示调试信息。
  1. pause
复制代码

启动过程中暂停,以便记录调试信息。
下载:
ntloader.zip (2.92 MB, 下载次数: 2218)
源码:
https://github.com/grub4dos/ntloader (许可证:GPLv2+)
参考:
ipxe wimboot https://github.com/ipxe/wimboot
lznt1 压缩 https://github.com/you0708/lznt1
Linux/x86 Boot Protocol https://www.kernel.org/doc/html/latest/x86/boot.html
GRUB https://github.com/a1ive/grub

点评

辛苦了  发表于 6 天前

评分

参与人数 18无忧币 +95 收起 理由
yyz2191958 + 2 赞一个!
diskmans + 2 很给力!
有阴也有阳 + 5 很给力!
cuicongyuan + 5 很给力!
gutaiping2006 + 5 很给力!
2012chenyuwen + 5 很给力!
f111 + 5 很给力!
zhczf + 5 很给力!
lookerJ + 5
蓝星明月 + 10 赞一个!
2011yaya2007777 + 5 赞一个!
2011cwj6958 + 5 很给力!
amita + 5
liuzhaoyzz + 10 很给力!
piazini + 1 很给力!
sunsea + 10 很给力!
hilsonma + 5 很给力!
freesoft00 + 5

查看全部评分

2#
 楼主| 发表于 2021-1-31 17:00:37 | 显示全部楼层
oym2016 发表于 2021-1-31 16:57
1月27日版 在Grub2 中正常引导 WIM和VHDx
menuentry "Windows 10 PE ntloader"    --class recovery {
  ...

grub2没必要用这个。直接用ntboot命令就行了。

点评

看意思现在是推荐采用kernel语句?与chainloader语句有没有区别?  详情 回复 发表于 2021-1-31 17:14
回复

使用道具 举报

3#
 楼主| 发表于 2021-1-31 18:31:35 | 显示全部楼层
oym2016 发表于 2021-1-31 16:57
1月27日版 在Grub2 中正常引导 WIM和VHDx
menuentry "Windows 10 PE ntloader"    --class recovery {
  ...

重新上传了文件,应该修复了这个问题,请重新下载测试。
回复

使用道具 举报

4#
 楼主| 发表于 2021-1-31 19:17:04 | 显示全部楼层
本帖最后由 wintoflash 于 2021-1-31 19:18 编辑
liuzhaoyzz 发表于 2021-1-31 17:14
看意思现在是推荐采用kernel语句?与chainloader语句有没有区别?

它有两个入口,既可以把它当作linux内核,也可以把它当作efi应用程序。
正常玩法就是从前面的口进 (linuxefi),initrd 是由启动管理器加载好的。
非得从后面的口进(chainloader)也行,只不过需要把initrd的路径告诉它,让它自己加载 initrd。

linuxefi 的另一好处是同时支持 x64 EFI 和 ia32 EFI。

点评

也就是说,使用linuxefi可以启动ia32 efi的Linux系统?32位Windows可以启动吗?  详情 回复 发表于 2021-1-31 19:43
回复

使用道具 举报

5#
 楼主| 发表于 2021-1-31 20:14:17 | 显示全部楼层
叮叮咚咚 发表于 2021-1-31 19:43
也就是说,使用linuxefi可以启动ia32 efi的Linux系统?32位Windows可以启动吗?

不是
回复

使用道具 举报

6#
 楼主| 发表于 2021-2-1 09:01:20 | 显示全部楼层
liuzhaoyzz 发表于 2021-1-31 22:21
我尝试直接启动vhd也失败,菜单如下,菜单有没有问题?
title WIN7X64-SVBUS (/VHD/SX70211.vhd)-kernel n ...

GRUB2 下linuxefi 启动试试。

点评

刚才用uefi-grub2试了,结果一样。 uefi-grub2我只尝试了直接起动sx70211.vhd,没有尝试map --mem --rt这种,因为grub2好像是直接起动vd0的,能用probe -u (vd0) -s uuid获取仿真内存盘的uuid吗?我不知道。 men  详情 回复 发表于 2021-2-1 09:57
回复

使用道具 举报

7#
 楼主| 发表于 2021-2-1 18:48:05 | 显示全部楼层
2011whp 发表于 2021-2-1 18:43
@liuzhaoyzz
为什么,我复现不了你的问题呢
我这边能启动啊

是的,他这个现象非常离谱,我到现在还没有想出来可能的原因。

点评

用2021-1-31的g4e搭配这个最新版,直接启动vhd还是不行  详情 回复 发表于 2021-2-1 19:40
回复

使用道具 举报

8#
 楼主| 发表于 2021-2-1 22:25:18 | 显示全部楼层
liuzhaoyzz 发表于 2021-2-1 22:20
跟分辨率没什么关系吧。。。如果分辨率不对,g4e早就报错了。我的分辨率一直没动,没有关注过那些语句。

应该和栈有关。明天改下试试。

点评

大神辛苦了,这个不着急,慢慢来吧,现在已经有grub2-ntboot保底了。  详情 回复 发表于 2021-2-1 22:42
回复

使用道具 举报

9#
 楼主| 发表于 2021-2-2 10:44:47 | 显示全部楼层
chenall 发表于 2021-2-1 19:34
这个强,应该ipxe也能用吧

ipxe没办法获得本地磁盘某分区的uuid吧。

点评

直接启动vhd,还是失败了。  详情 回复 发表于 2021-2-2 13:42
回复

使用道具 举报

10#
 楼主| 发表于 2021-2-2 18:36:26 | 显示全部楼层

看样子是 boot_params 被"黑恶势力"破坏了。目前暂时没有想好怎么解决,这个问题先放着吧。

点评

怀疑是ntload要在原始启动的磁盘,在其他盘不行。  详情 回复 发表于 2021-5-1 21:46
我也碰到L版类似问题了。不同的是,我的测试环境是普通win10 PE WIM,没有map, 也没有svbus。 前2天在AMI UEFI环境下,还说启动wim/vhd,kernel方式比chainloader方式兼容性 更好。而在Insyde UEFI环境下,此  详情 回复 发表于 2021-2-10 21:39
好奇地问下,为啥chainloader-ntloader-initrd就可以呢?同样是调用ntloader啊。  详情 回复 发表于 2021-2-2 19:42
回复

使用道具 举报

11#
 楼主| 发表于 2021-2-2 19:25:59 | 显示全部楼层
v1.0.3 版本
支持的命令行长度从 255 改为 511
支持 BCD 解析,允许修改 winload 路径等参数。
支持 MBR 逻辑分区 (最多支持 32 个分区)。
支持在启动阶段伪造安全启动状态 (一般情况下不要使用)。
回复

使用道具 举报

12#
 楼主| 发表于 2021-2-3 10:30:18 | 显示全部楼层
chenall 发表于 2021-2-3 10:15
可以支持NT5(xp)吗?

不支持。BIOS 下的虚拟盘只有 bootmgr.exe 可以读取,不是像 GRUB4DOS 那样通用的 int13h 仿真磁盘。
回复

使用道具 举报

13#
 楼主| 发表于 2021-2-3 11:12:07 | 显示全部楼层
chenall 发表于 2021-2-3 10:15
可以支持NT5(xp)吗?

启动 bootmgr.exe 是通过解析pe文件,找到入口,然后跳转进去。入口是这样的:
pe_entry (struct bootapp_descriptor *bootapp)
bootapp_descriptor 里面包含了 memory map,启动磁盘的签名和分区偏移,callback 函数用来调用 BIOS 中断 等东西。
不知道 NT5 的 setupldr.exe / osloader.exe 有没有类似的东西?
回复

使用道具 举报

14#
 楼主| 发表于 2021-2-3 15:35:23 | 显示全部楼层
2011whp 发表于 2021-2-3 11:56
这个,不是个别现象吧,现在是一进bootmgfw就出现四格窗了?

你是不是开了这个选项:

点评

果然是 metro 选 项的作用 , 以前bcd组织 wim 没出现过这事, 是bcd里的分区 启动 勾上 metro 以后,会提前出现 四格窗  详情 回复 发表于 2021-2-3 17:14
回复

使用道具 举报

15#
 楼主| 发表于 2021-2-4 15:43:11 | 显示全部楼层
2011whp 发表于 2021-2-3 17:14
果然是 metro 选 项的作用 ,

以前bcd组织 wim 没出现过这事,

显示 metro 界面的时候 Windows 已经加载一部分了,选择其他的启动选项,实际上是重启之后再进入的。

B75 主板附意  不能 initrd ntloader


你也遇到 liuzhaoyzz 电脑上那样的问题了?
回复

使用道具 举报

16#
 楼主| 发表于 2021-2-4 15:53:47 | 显示全部楼层
v1.0.4 版本
支持使用自定义启动 logo (UEFI Win8+)。(实体机上图片位置暂时有点问题)
支持 winload、sysroot 路径中的斜杠 ('/') 自动转换成反斜杠 ('\')
回复

使用道具 举报

17#
 楼主| 发表于 2021-2-4 15:55:02 | 显示全部楼层
xiaohhl 发表于 2021-2-4 09:04
G4E下winload=\\Windows\\System32\\winload.efi和sysroot=\\Windows的双斜杠要改成单斜杠才能用——小白

现在可以直接用斜杠了,内部自动转换成反斜杠
winload=/Windows/System32/winload.efi
回复

使用道具 举报

18#
 楼主| 发表于 2021-2-5 14:59:22 | 显示全部楼层
liuzhaoyzz 发表于 2021-2-5 10:29
哦,明白了!boot之前先chainloader %x%/EFI/boot/grubx64.efi即可。
直接上图。

还是纯用grub2测试更方便。 linuxefi.zip (2.31 KB, 下载次数: 23)
rmmod linuxefi
insmod /xxx/linuxefi.mod
linuxefi /ntloader XXXX
会打印这样的信息:"kernel_mem = XXXX kernel_params = XXXX cmdline = XXXX",这就是对应的内存地址。

然后用 hexdump 命令查看一下 kernel_params 和 cmdline 的内存。


点评

menuentry "SX70211.vhd-svbus-ntloader-2" "/VHD/SX70211.vhd" { search -n -s x -f /EFI/grub/ntloader rmmod linuxefi insmod /EFI/grub/linuxefi.mod search --no-floppy --set --file $2 probe -u ($root)  详情 回复 发表于 2021-2-5 15:51
回复

使用道具 举报

19#
 楼主| 发表于 2021-2-5 16:06:11 | 显示全部楼层
本帖最后由 wintoflash 于 2021-2-5 16:07 编辑
liuzhaoyzz 发表于 2021-2-5 15:51
menuentry "SX70211.vhd-svbus-ntloader-2" "/VHD/SX70211.vhd" {
search -n -s x -f /EFI/grub/ntloa ...

当然有办法暂停,read和getkey都可以。
但是调试的时候不要这样用。必须手动逐条执行,以便观察情况。
按 tab 补全命令或路径,也不是很麻烦。
linux 命令行那里,随便输入什么都行,没必要那么认真,那不是重点。

点评

上面的菜单,我逐条输入命令,本来CTRL+ALT+F12,我按错了,按成了CTRL+ALT+DELETE,白搞了! 直接上图。  详情 回复 发表于 2021-2-5 17:20
回复

使用道具 举报

20#
 楼主| 发表于 2021-2-5 17:35:37 | 显示全部楼层
liuzhaoyzz 发表于 2021-2-5 17:20
上面的菜单,我逐条输入命令,本来CTRL+ALT+F12,我按错了,按成了CTRL+ALT+DELETE,白搞了!

直接上 ...

老哥,你这内存地址都没敲对。。。

点评

华硕台式机: 1、g4e2021-1-16-kernel-ntloader-initrd-vhd+svbus,启动WIN7.VHD成功。() title WIN7X64-SVBUS (/VHD/sx7en.vhd)-kernel-ntloader-initrd-hd find --ignore-floppies --ignore-cd /EFI/grub/n  详情 回复 发表于 2021-2-5 21:30
你看下  详情 回复 发表于 2021-2-5 20:01
回复

使用道具 举报

21#
 楼主| 发表于 2021-2-6 19:43:05 | 显示全部楼层
xiaohhl 发表于 2021-2-6 17:43
(接上)
title 启动 Windows 系统
uuid (hd0,2)

256MB内存启Win10,不是没事找事吗。
另外你这 winload 和 sysroot 都是默认路径,没必要加这两个参数。


回复

使用道具 举报

22#
 楼主| 发表于 2021-2-7 15:52:37 | 显示全部楼层
lusir401 发表于 2021-2-7 00:20
我按照启动WINDOWS的方式,直接指定WINDOWS7X64所在分区,启动后过了Windows徽标后就蓝屏了。

win7 UEFI 要用特殊的 bootmgfw.efi 文件,这个还没有搞。

点评

原来是我太着急了。  详情 回复 发表于 2021-2-8 01:41
回复

使用道具 举报

23#
 楼主| 发表于 2021-2-7 15:56:16 | 显示全部楼层
wuwuzz 发表于 2021-2-7 11:00
kernel命令启动wim/vhd,没有问题。
===================================================
chainloader ...

ntloader 本身不支持任何文件系统,它只能通过 UEFI 固件提供的 Simple File System Protocol 读 initrd 文件。
所以把它当 EFI 应用程序启动时,它和 initrd 文件必须放在同一分区,且要保证 UEFI 固件支持这个分区。
如果把它当 linux 内核用,那么 initrd 是由 grub4dos 加载到内存的,所以两个文件无论放在哪都行。

点评

这样一解释就容易理解多了。还是kernel方式更自由,chainloader受UEFI限制,不确定性较大。  详情 回复 发表于 2021-2-7 16:45
从这段话的意思来看: 1、chainloader+ntloader+initrd=/efi/grub/initrd.lz1方案中,ntloader和initrd.lz1一般地都要放在FAT32/ESP分区,部分主板内置了ntfs.efi驱动的,可能可以放在NTFS分区。 2、kernel+ntlo  详情 回复 发表于 2021-2-7 16:14
回复

使用道具 举报

24#
 楼主| 发表于 2021-2-7 15:57:56 | 显示全部楼层
dos时代菜鸟 发表于 2021-2-7 15:19
测试 ,g4d 下 ntloader 可以启动 wim 和 本地系统,硬盘是 sata组的 raid0,可以跨区引导启动,

如果 v ...

能不能发个启这种系统的 bcd 文件,我研究一下。
如果有个体积小的vhd能测试一下,那就更好了。

点评

感觉 bcd 设置上 跟正常的 vhd 没啥区别,但是 wim + vhd 所在的分区上 可能有标记,标记 很可能是在 system volume information 文件夹中的 某个文件里。 因为 Wim+ vhd 太大了,没法上传,只能先把 bcd 给你  详情 回复 发表于 2021-2-7 16:15
回复

使用道具 举报

25#
 楼主| 发表于 2021-2-7 16:45:13 | 显示全部楼层
dos时代菜鸟 发表于 2021-2-7 16:42
用这个 启动 本地系统 win10  不支持休眠 么?

不支持。休眠好像和 winresume 有点关系,我没研究明白, bcd 里面就没有弄。
回复

使用道具 举报

26#
 楼主| 发表于 2021-2-7 17:12:23 | 显示全部楼层
dos时代菜鸟 发表于 2021-2-7 15:19
测试 ,g4d 下 ntloader 可以启动 wim 和 本地系统,硬盘是 sata组的 raid0,可以跨区引导启动,

如果 v ...
如果 vhd 是经由 具有 wimboot 特性的 wim 做的指针,似乎就不能被启动了,还是需要另外设置些什么?

"不能启动" 的具体现象是什么?

点评

没有任何提示的卡死,屏幕纯色 青色,不是蓝屏,然后 Ctrl+Alt+del 就重启了。  详情 回复 发表于 2021-2-8 16:09
回复

使用道具 举报

27#
 楼主| 发表于 2021-2-7 17:15:06 | 显示全部楼层
wuwuzz 发表于 2021-2-7 16:45
这样一解释就容易理解多了。还是kernel方式更自由,chainloader受UEFI限制,不确定性较大。

chainloader 也有一个好,就是命令行长度没有任何限制。linux内核支持的命令行长度是写死的,ntloader 目前是 511 字节。
回复

使用道具 举报

28#
 楼主| 发表于 2021-2-8 15:03:51 | 显示全部楼层
dos时代菜鸟 发表于 2021-2-7 16:42
用这个 启动 本地系统 win10  不支持休眠 么?

ntloader.zip (2.13 MB, 下载次数: 45)
试试,应该支持休眠了。


点评

好的,  详情 回复 发表于 2021-2-8 16:08
回复

使用道具 举报

29#
 楼主| 发表于 2021-2-8 18:29:07 | 显示全部楼层
dos时代菜鸟 发表于 2021-2-8 16:08
好的,

休眠、睡眠按钮都能用了,但是 ,功能不正常,点完以后,马上就又回系统里来了,并没有 保存数 ...

是不是开了"快速启动"?

点评

有可能,老机器,可能bios 里没有这设置。 我明天看看才知道。  详情 回复 发表于 2021-2-8 20:48
回复

使用道具 举报

30#
 楼主| 发表于 2021-2-8 22:25:11 | 显示全部楼层
dos时代菜鸟 发表于 2021-2-8 22:21
那个  no bootmgfw.efi 的问题,我 是在 kernel /ntloader 前 先 chainloader bootmgfw.efi 来解决的。

...

你这样用不行。

点评

为啥呢? 开始我以为是 本地 bootmgfw.efi 调用了本地的 bcd ,我把 本地的 bcd 改名了,一样可以。  详情 回复 发表于 2021-2-9 09:16
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-5-17 10:01

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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