无忧启动论坛
标题: NTloader: BIOS/UEFI 下用 GRUB 启动 VHD/WIM [打印本页]
作者: wintoflash 时间: 2021-1-31 16:08
标题: NTloader: BIOS/UEFI 下用 GRUB 启动 VHD/WIM
本帖最后由 wintoflash 于 2025-4-8 21:58 编辑
适用范围:
BIOS, x64 UEFI, ia32 UEFI, arm64 UEFI 均可使用。
支持 FAT, NTFS, exFAT 文件系统 (VHD 不能位于 FAT 分区,老版本 Windows VHD 只能位于 NTFS 分区)
文件路径最好是不带空格的英文字母/数字。带空格的话传递参数时用冒号":"代替空格。
命令行长度不得超过 4096。
使用方法:
GNU GRUB 2 (>=2.12)
- menuentry "Boot Windows NT6+ WIM" {
- search -s -f /path/to/ntloader
- search -s dev -f /path/to/winpe.wim
- probe -s dev_uuid -u $dev
- if [ "${grub_platform}" = "efi" ]; then
- linux /path/to/ntloader uuid=${dev_uuid} wim=/path/to/winpe.wim
- initrd /path/to/initrd.cpio
- else
- linux16 /path/to/ntloader uuid=${dev_uuid} wim=/path/to/winpe.wim
- initrd16 /path/to/initrd.cpio
- fi;
- }
- menuentry "Boot Windows NT6+ VHD/VHDx" {
- search -s -f /path/to/ntloader
- search -s dev -f /path/to/windows.vhd
- probe -s dev_uuid -u $dev
- if [ "${grub_platform}" = "efi" ]; then
- linux /path/to/ntloader uuid=${dev_uuid} vhd=/path/to/windows.vhd
- initrd /path/to/initrd.cpio
- else
- linux16 /path/to/ntloader uuid=${dev_uuid} vhd=/path/to/windows.vhd
- initrd16 /path/to/initrd.cpio
- fi;
- }
- menuentry "Boot Windows NT6+ on (hdx,y)" {
- search -s -f /path/to/ntloader
- probe -s dev_uuid -u (hdx,y)
- if [ "${grub_platform}" = "efi" ]; then
- linux /path/to/ntloader uuid=${dev_uuid}
- initrd /path/to/initrd.cpio
- else
- linux16 /path/to/ntloader uuid=${dev_uuid}
- initrd16 /path/to/initrd.cpio
- fi;
- }
复制代码
GRUB4DOS / GRUB4EFI
- title Boot Windows NT6+ WIM
- find --set-root /path/to/winpe.wim
- uuid ()
- find --set-root /path/to/ntloader
- kernel /path/to/ntloader uuid=%?_UUID% wim=/path/to/winpe.wim
- initrd /path/to/initrd.cpio
- title Boot Windows NT6+ VHD
- find --set-root /path/to/windows.vhd
- uuid ()
- find --set-root /path/to/ntloader
- kernel /path/to/ntloader uuid=%?_UUID% vhd=/path/to/windows.vhd
- initrd /path/to/initrd.cpio
复制代码
下载:
https://github.com/grub4dos/ntloader/releases/latest
源码:
https://github.com/grub4dos/ntloader
作者: sairen139 时间: 2021-1-31 16:19
非常好,支持W大!
作者: menhm 时间: 2021-1-31 16:22
正在找BIOS下用 GRUB4DOS 启动 WIM 。。。。。太好了。。。。
作者: 2011yaya2007777 时间: 2021-1-31 16:39
强大
作者: oym2016 时间: 2021-1-31 16:57
1月27日版 在Grub2 中正常引导 WIM和VHDx
menuentry "Windows 10 PE ntloader" --class recovery {
probe -s a -u (hd0,gpt1)
linuxefi /ntloader uuid=$a file=/Sources/boot.wim
initrdefi /initrd.lz
}
用今天的替换后 均引导失败
menuentry "Windows 10 PE ntloader" --class recovery {
probe -s a -u (hd0,gpt1)
linuxefi /ntloader uuid=$a file=/Sources/boot.wim
initrdefi /initrd.lz1
}
作者: wintoflash 时间: 2021-1-31 17:00
grub2没必要用这个。直接用ntboot命令就行了。
作者: liuzhaoyzz 时间: 2021-1-31 17:14
wintoflash 发表于 2021-1-31 17:00
grub2没必要用这个。直接用ntboot命令就行了。
看意思现在是推荐采用kernel语句?与chainloader语句有没有区别?
作者: acerken 时间: 2021-1-31 18:18
感谢分享,研究研究
作者: wintoflash 时间: 2021-1-31 18:31
重新上传了文件,应该修复了这个问题,请重新下载测试。
作者: hilsonma 时间: 2021-1-31 19:11
我想是这样的:ntloader虽然叫loader,但其实是一个core.img,所以用kernel,如果这个core.img前面再加一个boot.img,那样才是用chainloader.
作者: wintoflash 时间: 2021-1-31 19:17
本帖最后由 wintoflash 于 2021-1-31 19:18 编辑
它有两个入口,既可以把它当作linux内核,也可以把它当作efi应用程序。
正常玩法就是从前面的口进 (linuxefi),initrd 是由启动管理器加载好的。
非得从后面的口进(chainloader)也行,只不过需要把initrd的路径告诉它,让它自己加载 initrd。
linuxefi 的另一好处是同时支持 x64 EFI 和 ia32 EFI。
作者: 14928806 时间: 2021-1-31 19:35
感谢分享
作者: 叮叮咚咚 时间: 2021-1-31 19:43
也就是说,使用linuxefi可以启动ia32 efi的Linux系统?32位Windows可以启动吗?
作者: wintoflash 时间: 2021-1-31 20:14
不是
作者: 18958925900 时间: 2021-1-31 20:17
学习了。谢谢
作者: liuzhaoyzz 时间: 2021-1-31 22:00
本帖最后由 liuzhaoyzz 于 2021-1-31 22:22 编辑
用刚才下载的ntloader两个文件,搭配2021-1-22日的g4e,kernel ntloader启动基于svbus启动的vhd-ramos失败啊。
title WIN7X64-SVBUS (/VHD/SX70211.vhd)-kernel ntloader-1
debug 3
find --ignore-floppies --ignore-cd /EFI/grub/ntloader | set x=
echo x=%x%
find --ignore-floppies --ignore-cd --set-root /VHD/SX70211.vhd
map --mem --top /VHD/SX70211.vhd (hd)
uuid (hd-1,0)
kernel %x%/EFI/grub/ntloader uuid=%?_UUID%
initrd %x%/EFI/grub/initrd.lz1
pause pause1
等我用手机上传截图
-
-
作者: liuzhaoyzz 时间: 2021-1-31 22:21
本帖最后由 liuzhaoyzz 于 2021-1-31 22:22 编辑
我尝试直接启动vhd也失败,菜单如下,菜单有没有问题?
title WIN7X64-SVBUS (/VHD/SX70211.vhd)-kernel ntloader-3
debug 3
find --ignore-floppies --ignore-cd /EFI/grub/ntloader | set x=
echo x=%x%
find --ignore-floppies --ignore-cd --set-root /VHD/SX70211.vhd
uuid ()
kernel %x%/EFI/grub/ntloader uuid=%?_UUID% file=/VHD/SX70211.vhd
initrd %x%/EFI/grub/initrd.lz1
pause pause1
等我上传截图。
-
-
作者: wintoflash 时间: 2021-2-1 09:01
GRUB2 下linuxefi 启动试试。
作者: liuzhaoyzz 时间: 2021-2-1 09:57
本帖最后由 liuzhaoyzz 于 2021-2-1 09:59 编辑
刚才用uefi-grub2试了,结果一样。
uefi-grub2我只尝试了直接启动sx70211.vhd,没有尝试map --mem --rt这种,因为grub2好像是直接启动vd0的,能用probe -u (vd0,1) -s uuid获取仿真内存盘的uuid吗?我不知道。
menuentry "SX70211.vhd-svbus-ntloader" "/VHD/SX70211.vhd" {
search -n -s x -f /EFI/grub/ntloader
search --no-floppy --set --file $2
probe -u ($root) -s uuid
linuxefi ($x)/EFI/grub/ntloader uuid=$uuid file=/VHD/SX70211.vhd
initrdefi ($x)/EFI/grub/initrd.lz1
}
上面的菜单写的对吗?
-
-
作者: liuzhaoyzz 时间: 2021-2-1 10:02
哦,另外说下,g4e搭配chainloader ntloader 启动vhd、仿真磁盘,vdf都可以成功。
作者: 18958925900 时间: 2021-2-1 12:39
这个很好-不用管设么efi了。
作者: liuzhaoyzz 时间: 2021-2-1 17:15
本帖最后由 liuzhaoyzz 于 2021-2-1 17:16 编辑
title WIN7X64-SVBUS (/VHD/SX70211.vhd)-kernel ntloader-1
debug 3
find --ignore-floppies --ignore-cd /EFI/grub/ntloader | set x=
echo x=%x%
find --ignore-floppies --ignore-cd --set-root /VHD/SX70211.vhd
map --mem --top /VHD/SX70211.vhd (hd)
uuid (hd-1,0)
kernel %x%/EFI/grub/ntloader uuid=%?_UUID%
initrd %x%/EFI/grub/initrd.lz1
pause pause1
启动vhd-ramos失败,等我上传截图
-
-
作者: liuzhaoyzz 时间: 2021-2-1 17:15
本帖最后由 liuzhaoyzz 于 2021-2-1 17:17 编辑
title WIN7X64-SVBUS (/VHD/SX70211.vhd)-kernel ntloader-3
debug 3
find --ignore-floppies --ignore-cd /EFI/grub/ntloader | set x=
echo x=%x%
find --ignore-floppies --ignore-cd --set-root /VHD/SX70211.vhd
uuid ()
kernel %x%/EFI/grub/ntloader uuid=%?_UUID% file=/VHD/SX70211.vhd
initrd %x%/EFI/grub/initrd.lz1
pause pause1
直接启动vhd失败,等我上传截图
-
-
作者: 2011whp 时间: 2021-2-1 18:43
@liuzhaoyzz
为什么,我复现不了你的问题呢
我这边能启动啊
作者: wintoflash 时间: 2021-2-1 18:48
是的,他这个现象非常离谱,我到现在还没有想出来可能的原因。
作者: gnuxwy 时间: 2021-2-1 18:49
W大牛比,又出好货了。。。
下载回来抽空试玩下。。。
作者: chenall 时间: 2021-2-1 19:34
这个强,应该ipxe也能用吧
作者: liuzhaoyzz 时间: 2021-2-1 19:40
wintoflash 发表于 2021-2-1 18:48
是的,他这个现象非常离谱,我到现在还没有想出来可能的原因。
用2021-1-31的g4e搭配这个最新版,直接启动vhd还是不行
-
-
作者: 2011whp 时间: 2021-2-1 19:49
是奇怪 @liuzhaoyzz
调调 g4e 分辨率,比如 1024(分辨率 经常成迷)
我的这边启动时,ntloader 把屏幕 清的 干净
记得,g4e刚发布时,我这机器,800分辨率 启动不了shell,
作者: liuzhaoyzz 时间: 2021-2-1 22:20
跟分辨率没什么关系吧。。。如果分辨率不对,g4e早就报错了。我的分辨率一直没动,没有关注过那些语句。
作者: wintoflash 时间: 2021-2-1 22:25
应该和栈有关。明天改下试试。
作者: 18958925900 时间: 2021-2-1 22:40
给力,学习了。
作者: liuzhaoyzz 时间: 2021-2-1 22:42
大神辛苦了,这个不着急,慢慢来吧,现在已经有grub2-ntboot保底了。
作者: wintoflash 时间: 2021-2-2 10:44
ipxe没办法获得本地磁盘某分区的uuid吧。
作者: liuzhaoyzz 时间: 2021-2-2 12:01
wintoflash 发表于 2021-2-2 10:28
试试:
回去后试试看
作者: liuzhaoyzz 时间: 2021-2-2 13:42
wintoflash 发表于 2021-2-2 10:44
ipxe没办法获得本地磁盘某分区的uuid吧。
直接启动vhd,还是失败了。
-
-
作者: liuzhaoyzz 时间: 2021-2-2 15:14
wintoflash 发表于 2021-2-2 15:05
希望这个能打印点不一样的东西。
是不是其他地方有问题,我说的是用户侧,不是开发侧的问题?我这边是否有哪里不对的地方,比如菜单什么的?但我不知道倒底该怎么改进或者尝试。启动vhd还是不行。
-
-
作者: liuzhaoyzz 时间: 2021-2-2 16:52
wintoflash 发表于 2021-2-2 16:46
还失败
-
-
作者: liuzhaoyzz 时间: 2021-2-2 17:43
wintoflash 发表于 2021-2-2 17:19
还是不行
-
-
作者: wbs1997 时间: 2021-2-2 17:51
非常好,支持W大!
作者: 2011whp 时间: 2021-2-2 17:56
做了个 差分的 vhd系统,
表示 ntloader 能启动 ,也能回写进去
( bootmgfw 是支持差分的,分享下,只是本人没试过)
作者: 2011whp 时间: 2021-2-2 18:06
本帖最后由 2011whp 于 2021-2-2 18:09 编辑
@liuzhaoyzz
密集试验啊,开始怀疑机器本身了
能不能启动 深度livecd 或者你这台机有启动过linux的经历的话,就不试了附 :见示例菜单 第四项
http://bbs.wuyou.net/forum.php?m ... 1257&fromuid=413782
作者: 2048 时间: 2021-2-2 18:13
谢谢大佬的分享
作者: wintoflash 时间: 2021-2-2 18:36
看样子是 boot_params 被"黑恶势力"破坏了。目前暂时没有想好怎么解决,这个问题先放着吧。
作者: wintoflash 时间: 2021-2-2 19:25
v1.0.3 版本
支持的命令行长度从 255 改为 511
支持 BCD 解析,允许修改 winload 路径等参数。
支持 MBR 逻辑分区 (最多支持 32 个分区)。
支持在启动阶段伪造安全启动状态 (一般情况下不要使用)。
作者: liuzhaoyzz 时间: 2021-2-2 19:42
wintoflash 发表于 2021-2-2 18:36
看样子是 boot_params 被"黑恶势力"破坏了。目前暂时没有想好怎么解决,这个问题先放着吧。
好奇地问下,为啥chainloader-ntloader-initrd就可以呢?同样是调用ntloader啊。
作者: liuzhaoyzz 时间: 2021-2-2 19:47
2011whp 发表于 2021-2-2 18:06
@liuzhaoyzz
密集试验啊,开始怀疑机器本身了
这与深度livecd没关系啊,我下载的深度livecd启动没问题。
作者: 2011whp 时间: 2021-2-2 19:56
按linux启动过程,第一步就是 分类 解析参数,
那个 no bootmgfw 的错误,我文件名 写错后 也出现过(或 启动分区时,多了指文件的参数)
那这就成迷了
作者: chenall 时间: 2021-2-3 10:15
可以支持NT5(xp)吗?
作者: wintoflash 时间: 2021-2-3 10:30
不支持。BIOS 下的虚拟盘只有 bootmgr.exe 可以读取,不是像 GRUB4DOS 那样通用的 int13h 仿真磁盘。
作者: wintoflash 时间: 2021-2-3 11:12
启动 bootmgr.exe 是通过解析pe文件,找到入口,然后跳转进去。入口是这样的:
pe_entry (struct bootapp_descriptor *bootapp)
bootapp_descriptor 里面包含了 memory map,启动磁盘的签名和分区偏移,callback 函数用来调用 BIOS 中断 等东西。
不知道 NT5 的 setupldr.exe / osloader.exe 有没有类似的东西?
作者: 2011whp 时间: 2021-2-3 11:56
本帖最后由 2011whp 于 2021-2-3 17:33 编辑
这个,不是个别现象吧,现在是一进bootmgfw就出现四格窗了?
从esp分区 提取出来,自已 新建的bcd,菜单 是 原来的 黑白的菜单了,具体原因,见下面楼层
bootmgfw.efi 文件 修改日期为2020-12-11
作者: wintoflash 时间: 2021-2-3 15:35
你是不是开了这个选项:
作者: 2011whp 时间: 2021-2-3 17:14
本帖最后由 2011whp 于 2021-2-3 17:38 编辑
果然是 metro 选 项的作用 ,
以前bcd组织 wim 没出现过这事,
是bcd里的分区 启动 勾上 metro 以后,会提前出现 四格窗 ( 难道 四格窗的 意思 是开始用 系统分区windows 目录下的资源了)
作者: xiaohhl 时间: 2021-2-4 09:04
G4E下winload=\\Windows\\System32\\winload.efi和sysroot=\\Windows的双斜杠要改成单斜杠才能用——小白
作者: xiaohhl 时间: 2021-2-4 09:06
搭配initrd ntloader能成功吗?
作者: liuzhaoyzz 时间: 2021-2-4 10:55
xiaohhl 发表于 2021-2-4 09:06
搭配initrd ntloader能成功吗?
答主请听题!
作者: 2011whp 时间: 2021-2-4 13:36
B75 主板附意 不能 initrd ntloader
b360主板 表示 能 initrd ntloader
作者: wintoflash 时间: 2021-2-4 15:43
显示 metro 界面的时候 Windows 已经加载一部分了,选择其他的启动选项,实际上是重启之后再进入的。
B75 主板附意 不能 initrd ntloader
你也遇到 liuzhaoyzz 电脑上那样的问题了?
作者: wintoflash 时间: 2021-2-4 15:53
v1.0.4 版本
支持使用自定义启动 logo (UEFI Win8+)。(实体机上图片位置暂时有点问题)
支持 winload、sysroot 路径中的斜杠 ('/') 自动转换成反斜杠 ('\')
作者: wintoflash 时间: 2021-2-4 15:55
现在可以直接用斜杠了,内部自动转换成反斜杠
winload=/Windows/System32/winload.efi
作者: liuzhaoyzz 时间: 2021-2-4 18:36
2011whp 发表于 2021-2-4 13:36
B75 主板附意 不能 initrd ntloader
怎么感觉你的回帖里面,很多错别字,有时候不知道你想要表达的是什么意思,你是大陆的吧?
你用的是什么菜单?
作者: 2011whp 时间: 2021-2-4 19:20
本帖最后由 2011whp 于 2021-2-4 20:09 编辑
试验的g4e菜单
debug 3
find --ignore-floppies --ignore-cd /ntloader | set x=
echo x=%x%
find --ignore-floppies --ignore-cd --set-root /src/boot.wim
uuid ()
kernel %x%/ntloader uuid=%?_UUID% file=/src/boot.wim
initrd %x%/initrd.lz1
pause pause1
b75主板的电脑 ,不能启动,和你情况一样
b360主板的电脑,可以启动
意思是同一个u盘,内容也一样,在不同电脑上,前者不能启动,后者能启动
说明:
1. 按 wintoflash 原理,有的电脑是 能行得通的,有的电脑 行不通
2. bios g4e的kernel ntloader 三者关系,当然从 wintoflah 角度 只能怀疑 后两者
3. 如果,不发布 上面菜单的 用法的话 ,就没有问题了(chailoader方式,没人报错)
作者: 2011whp 时间: 2021-2-4 20:49
本帖最后由 2011whp 于 2021-2-5 18:39 编辑
可以启动了 B75主板电脑也能了
作者: liuzhaoyzz 时间: 2021-2-4 22:24
本帖最后由 liuzhaoyzz 于 2021-2-5 08:19 编辑
wintoflash 发表于 2021-2-4 20:05
试试这个打印的调试信息
还是不行,回头截图
截图模块果然很好用,现在的截图很清晰了。
-
作者: liuzhaoyzz 时间: 2021-2-5 08:21
看你的菜单,你是用来启动pe.wim,不是xxx.vhd啊?前面你说可以启动xxx.vhd是吗?
作者: liuzhaoyzz 时间: 2021-2-5 10:18
这个做不到啊。执行完 kernel /ntloader XXXX, initrd /initrd.lz1 之后,按任何键系统都会直接重启,没有办法再chainloader到grub2。
作者: liuzhaoyzz 时间: 2021-2-5 10:29
哦,明白了!boot之前先chainloader %x%/EFI/boot/grubx64.efi即可。
直接上图。
-
作者: 2011whp 时间: 2021-2-5 11:32
本帖最后由 2011whp 于 2021-2-5 11:36 编辑
前面 是启动的vhd (24层:http://wuyou.net/forum.php?mod=r ... &fromuid=413782 )
是为了 复现你的问题 在B360主板的电脑 上 启动vhd的,(菜单是 按e键后 编辑成vhd的)
现在我这边 B75主板的电脑 ,也能启动wim了,所以没法试了 (我一般 都是试 wim)
(我这有两台 电脑, 相当于两个人 发生的案例)
另说:
上次 在 B360主板试时,bios为 纯UEFI ,后来试时 改成 uefi+cms,也能的
说明,ntloader 与这个没关系
作者: wintoflash 时间: 2021-2-5 14:59
还是纯用grub2测试更方便。
linuxefi.zip
(2.31 KB, 下载次数: 25)