居然实现了,奇迹啊 |
学习长姿势了 |
本帖最后由 ko20010214 于 2024-4-29 00:15 编辑 为啥出错了? 解释一下, 第一个引导文件,我是选择的原版的bootx64.efi, (因为我装的G4E把原版的bootx64的名字占用了)我才特意改名为boot64.efi,不是我少写了X。 就这个出错了! 而且重启后无法引导也无法试着加载第二个引导文件。 是不是这个文件不是连续存放的?我去哪保证它一定是连续存放的啊。 还是因为无法直接启动原版的bootx64.efi? 好像我想启动bootmgfw2.efi 也是同样的错误。 然后这个129又是啥啊。 129>=1590656 是啥意思, 第三行的129又是啥? |
IMG_20240428_221348.jpg (37.61 KB, 下载次数: 0)
现在就是不知道这个出错的原因是什么,然后这个信息(129)又是代表什么 |
本帖最后由 ko20010214 于 2024-4-29 00:03 编辑 UMBR(Universal Master Boot Record),是一个简单的通用型的MBR引导程序,只支持LBA模式(BIOS不支持LBA的无法使用,目前除了很老的机子大部份都有支持). 使用创新的方案,和磁盘分区格式无关所以可以安装到MBR或GPT分区格式下,目前GPT磁盘一般都是配合EFI来启动,有了它就可以在BIOS模式下直接启动GPT磁盘上的系统(需要系统有支持)了. [使用方法] 目前该程序只能在GRUB4DOS环境下运行,请在最新版本GRUB4DOS环境下使用. 参数介绍: umbr [-d=D] [-p=P] [--test] [file1] [file2] [file3] -d=D 指定要安装的磁盘默认是当前ROOT的磁盘 -p=D 启动失败后要启动的分区默认是第一个分区. --test 测试模式,不写入磁盘,加这个参数会进入安装效果测试. file1-3 可以指定三个启动文件位置以防止启动失败. 注: 这个filex 可以是任意GRUB4DOS可以识别的文件格式(必须连续存放).比如(hdx,y)/path/file或(hdx)xxxx+yyyy/(hdx,y)xxx+yyy之类的. file1-file3 必须在同一磁盘上并且和-d指定的磁盘一致. file1-2 也可以是一是一个PBR比如(hd0,3)+1 file1是主启动文件,如果检验失败了会再尝试file2... 说明: 由于是直接使用绝对扇区位置来启动的,所以和文件系统无关. 使用指定文件也会被转换为绝对扇区位置,正常情况下改名不影响启动,删除了如果文件内容没有被覆盖之前也是可以启动的. 启动失败时会暂停并等待按键,这时按任意键可以尝试下一个. 一个实用的例子: 磁盘使用的是GPT格式,GRLDR有两个备份分别是ESP分区(hd0,0)/grldr和普通分区(hd0,3)/boot/grub/grldr,并且在分区间隙(hd0)6554433+63处有一个WEE63 装有系统的分区是(hd0,1) 这时就可以通过UMBR默认加载ESP分区的GRLDR或普通分区上的GRLDR,失败了再尝试WEE63,还是失败就直接启动(hd0,1)分区. 进入GRUB4DOS执行以下命令就可以了 umbr -d=0 -p=1 (hd0,3)/boot/grub/grldr (hd0,0)/grldr (hd0)6554433+63 也可以默认wee63,通过wee63来控制启动过程,因为本例wee63是写到分区间隙的,出问题的几率比较小 umbr -d=0 -p=1 (hd0)6554433+63 (hd0,3)/boot/grub/grldr (hd0,0)/grldr 当然了也可以直接启动指定分区而不通过其它引导程序,如下默认直接启动(hd0,1)上的系统,如果该分区被分区软件调整过启动失败了,会尝试启动wee,最后尝试启动grldr umbr -d=0 -p=1 (hd0,1)+1 (hd0)6554433+63 (hd0,0)/grldr [其它参考] UMBR 相关说明 0x8 4个字节 UMBR标志 0xC 1个字节 UMBR版本号 0x10-0X3F 48个字节 用户定义的启动区 0x40-0X4F 16个字节 保留的启动区(当用户定义的启动都失败时启动的分区) 0x40-0x1B7 启动代码. 启动区说明,目前0x10-0x4F,每一个启动项占用16个字节,为了编程方便使用的是和DiskAddressPacket一样的格式. WORD CRC; //启动项校验 WORD BlockCount; // 启动代码块数(以扇区为单位) DWORD BufferAddr; // 传输缓冲地址(segment:offset),也就是启动地址 QWORD BlockNum; // 启动代码在磁盘上的位置(LBA) BufferAddr 的值为0x07c00000(07c0:0000)时固定为PBR引导,启动时会自动修改0x7c1c处的值.其它值直接从该位置启动. 校验方法: 使用的是简单的XOR校验,最多校验127个扇区,按4个字节依次XOR得到的最后结果,再把低16位和高16位进行一次XOR得到最后的结果作为检验值. 具体的校验代码可以参考源码有ASM/C语言两个版本. WIN下安装UMBR http://bbs.wuyou.net/forum.php?mod=viewthread&tid=427013 umbr 测试(适用于BIOS+GPT磁盘的MBR程序) http://bbs.wuyou.net/forum.php?mod=viewthread&tid=374547&extra=&page=1 [求助] umbr的安装使用 http://bbs.wuyou.net/forum.php?mod=viewthread&tid=423508 其中:在第三篇里找到一个回复贴,里面跳到另一个帖子里 http://bbs.wuyou.net/forum.php?m ... &fromuid=586362 再定睛一看,那个帖子是我发的。 2020-9-1 就在问这个事了,怎么在GTP硬盘装G4D,当时应该是只是想装G4D就完事了,没想说从Legacy方式启动GTP硬盘里的系统吧。 兜兜转转又回来了! 在Umbr 测试这个帖子里, 有一个附件可下载。 http://bbs.wuyou.net/forum.php?mod=attachment&aid=NTAwOTM4fGIxOTM1YTdjfDE3MTQzMTk5MzJ8MTgxMHwzNzQ1NDc%3D 这个有详细的说明。 包括怎么在window下手工添加UMBR到0扇区,怎么计算引导区的那一行的各种参数。 我当时第一时间想到的问题这里都有答案的。 |
ko20010214 发表于 2024-4-28 00:40 UMBR相关问题建议问开发者@chenall GRUB的话还可以找@2011yaya2007777 |
本帖最后由 ko20010214 于 2024-4-28 00:46 编辑 就是这样实现的。 话说grub 的命令行真难用……不熟悉的人找命令都找不到。 我都不知道试了多少次,想知道你加载了几块硬盘吗?用find命令。而不是ls命令。 想知道怎么进目录吗? 好像没这个功能。 想知道怎么获取find这个命令的帮助信息吗? find --help? find /? find --? help --find 都不是。 就是find help. |
本帖最后由 ko20010214 于 2024-4-28 00:36 编辑 成功从Legacy启动EXFAT分区里的VHD(EXFAT格式)。 不从UEFI启动,这个选项就没用,提示“此功能仅在UEFI环境下可用” C盘为虚拟盘,VHD, EXFAT格式。 D盘为GPT格式的 EXFAT分区。 H盘本来是GPT格式的EFI分区(FAT32格式),因为用分区助手改小了一点容量,变成普通的FAT32盘了。 windows10.vhd , 位于EXFAT分区的D盘。 这就是神奇的UMBR。 是它,创造了这个奇迹。 在一块GPT硬盘上从Legacy方式启动了一个位于EXFAT分区的VHD(Exfat格式)的64位windows10. 这就是朱玛说的双EXFAT。 VHD(X)模式与传统模式的安装过程大致相同,但要注意选择的系统必须使用Win10 v1809以上版本。 VHD(X)启动目前仅支持双NTFS或双exFAT组合,不支持外NTFS+里exFAT或外exFAT+里NTFS组合 |
学习到了 |
如果可以支持Xp的启动就无敌了 |
本帖最后由 ko20010214 于 2024-4-26 15:47 编辑 LBA(相对扇区号)方式:以磁盘第一个扇区(0柱面、0磁头、1扇区)作为LBA的0扇区,后面的扇区依次编号 其实这个LBA, 就是傻傻地向后数... 可以在diskgenius里查看. |
用户定义的启动区 , 这个要手动去定义的话有什么方法吗? 照作者的意思是,在grub4dos环境下,运行umbr,会自动将UMBR启动扇区写入原MBR的位置,然后这四个启动文件的DAP会自动计算出来并写入启动区。 可我没这个环境,要手动计算出我要启动的文件所在的DAP,有公式吗? 源码我看不懂,本来看源码应该能知道怎么算这个DAP的。 |
UMBR 相关说明 0x8 4个字节 UMBR标志 0xC 1个字节 UMBR版本号 0x10-0X3F 48个字节 用户定义的启动区 0x40-0X4F 16个字节 保留的启动区(当用户定义的启动都失败时启动的分区) 0x40-0x1B7 启动代码. 启动区说明,目前0x10-0x4F,每一个启动项占用16个字节,为了编程方便使用的是和DiskAddressPacket一样的格式. WORD CRC; //启动项校验 WORD BlockCount; // 启动代码块数(以扇区为单位) DWORD BufferAddr; // 传输缓冲地址(segment:offset),也就是启动地址 QWORD BlockNum; // 启动代码在磁盘上的位置(LBA) BufferAddr 的值为0x07c00000(07c0:0000)时固定为PBR引导,启动时会自动修改0x7c1c处的值.其它值直接从该位置启动. 校验方法: 使用的是简单的XOR校验,最多校验127个扇区,按4个字节依次XOR得到的最后结果,再把低16位和高16位进行一次XOR得到最后的结果作为检验值. 具体的校验代码可以参考源码有ASM/C语言两个版本. |
磁盘地址数据包 Disk Address Packet (DAP) DAP 是基于绝对扇区地址的, 因此利用 DAP, Int13H 可以轻松地逾 越 1024 柱面的限制, 因为它根本就不需要 CHS 的概念. DAP 的结构如下: struct DiskAddressPacket { BYTE PacketSize; // 数据包尺寸(16字节) BYTE Reserved; // ==0 WORD BlockCount; // 要传输的数据块个数(以扇区为单位) DWORD BufferAddr; // 传输缓冲地址(segment:offset) QWORD BlockNum; // 磁盘起始绝对块地址 }; PacketSize 保存了 DAP 结构的尺寸, 以便将来对其进行扩充. 在 目前使用的扩展 Int13H 版本中 PacketSize 恒等于 16. 如果它小于 16, 扩展 Int13H 将返回错误码( AH=01, CF=1 ). BlockCount 对于输入来说是需要传输的数据块总数, 对于输出来说 是实际传输的数据块个数. BlockCount = 0 表示不传输任何数据块. BufferAddr 是传输数据缓冲区的 32 位地址 (段地址:偏移量). 数据 缓冲区必须位于常规内存以内(1M). BlockNum 表示的是从磁盘开始算起的绝对块地址(以扇区为单位), 与分区无关. 第一个块地址为 0. 一般来说, BlockNum 与 CHS 地址的关系 是: BlockNum = cylinder * NumberOfHeads + head * SectorsPerTrack + sector - 1; 其中 cylinder, head, sector 是 CHS 地址, NumberOfHeads 是磁盘 的磁头数, SectorsPerTrack 是磁盘每磁道的扇区数. 也就是说 BlockNum 是沿着 扇区->磁道->柱面 的顺序记数的. 这一顺 序是由磁盘控制器虚拟的, 磁盘表面数据块的实际排列顺序可能与此不同 (如为了提高磁盘速度而设置的间隔因子将会打乱扇区的排列顺序). |
ko20010214 发表于 2024-4-25 22:01 http://chenall.net/post/grub4dos_umbr |
朱玛12345678 发表于 2024-4-25 14:14 文章已拜读。方法很巧妙,不过得要两块硬盘…… 有没有可以直接搞定的?通过编辑扇区的方法? |
ko20010214 发表于 2024-4-25 07:33 http://bbs.wuyou.net/forum.php?m ... 15995&mobile=no |
本帖最后由 ko20010214 于 2024-4-26 23:35 编辑 朱玛12345678 发表于 2024-4-24 18:43 GPT格式的硬盘(前面一个EXFAT分区,后面一个EFI分区(FAT32)),EFI分区里有boot 目录及BCD文件,根目录下有 bootmgr , 能用Legacy启动系统吗? 我用winntsetup 查看 EFI分区时,只显示 EFI PART 是绿色的。 用bootice查看硬盘时,主引导分区是空白的,没装任何引导程序…… 两个分区的引导记录都是BOOTMGR。 请问一下如何才能 用Legacy方式启动这块硬盘。 是要重建MBR吗? GPT格式硬盘有这玩意吗? |
ko20010214 发表于 2024-4-24 07:04 你理解错了,替换已签名的exFAT驱动是用来解决老版本系统启动时间过长的问题,跟能否支持VHD(X)启动没有任何关系,这是两码事。 另外正常情况下Legacy和UEFI都是可以启动系统的,如果只有其中一个能启动那你就得去检查一下自己的分区和引导设置是否有问题了。 |
本帖最后由 ko20010214 于 2024-4-24 12:27 编辑 我的安装环境: 1. Windows版本选择的22H2 V19045,实验版本19041.vb_release.191206-1406 (不忘初心 精简版) 2. Soyo 1T 硬盘 (EXFAT分区(存放VHD(EXFAT格式))+ESP分区) , sumsung 128G (NTFS 分区(存放VHD(NTFS格式)+ESP分区) 3. WinPE 选择的 Kuer的 win10PE (4.21版) 4. 启动模式 选择的 UEFI。(关闭了 安全启动)(2014年的LENOVO电脑,BIOS升级到2021年的) 安装过程: 1. 进PE,用winntsetup将win10.wim安装到NTFS格式的VHD中。 2. 进系统,完成安装。 3. 进PE,挂载VHD,用wimtool进行WIM打包。 4. 把WIM释放到EXFAT分区的VHD(EXFAT格式) 5. 修改BCD,添加启动项,引导EXFAT分区的VHD。 6. 重启,启动EXFAT分区中的VHD(EXFAT)失败。 考虑到: 1. EXFAT驱动问题,可“高版本的64位系统还需要手动替换一次已签名的exFAT驱动(适用于Win8 RTM到Win10 v1909,对于Win10 v2004及更高版本的系统则不再需要替换驱动)” ,对于22H2(19045)应该是原生支持EXFAT启动“最新的Windows 10 1903版本已经能够原生支持从FAT/exFAT分区中挂载VHD/VHDX虚拟磁盘文件”,而且楼主提供的EXFAT驱动包里也没有高于 v18362的版本。 2. 考虑到 EXFAT驱动加载顺序的问题,可这不是WIN10PE而是windows10, 没有看到过要调整EXFAT驱动顺序…… 3. 难道是启动模式的问题? 不要选择UEFI,要选择Legacy引导? 请楼主指点一下。 另外,我也用过坏坏小生提供的三杰版win10, 版本号为V1607(14393),用EXFAT驱动包里的对应的14393的驱动替换后也启动失败。 Oh,shit! It Works! 我只是进入BIOS 更改了一项 : 由只引导UEFI 改成了 legacy 优先。 因为我本想看看重启时进 Legacy 引导 看看能不能启动。 但是并没有这么简单。我在ESP分区的BOOT目录下编辑了BCD,添加了启动项目,似乎没有效果,我在Legacy启动时还是没办法看到启动菜单, 然后它跳到了UEFI引导下的启动菜单,然后我选择了 启动win10 (exfat vhd uefi), 然后 没有报错,有了启动画面,就是那个lenovo图标,但下面没有转圈圈? (因为慢??),我出去转了一下,大概两三分钟,回来看到已经启动到桌面了,具体用了多少时间也不太清楚。待会重启一遍试试。 OK。已经是EXFAT格式下的Win10了! 40多秒的时候出现LOGO, 3分15秒完成启动到桌面。 坏坏小生提供的三杰版win10, 版本号为V1607(14393)的替换驱动到windows\system32\drivers里,启动后蓝屏。 VHD_BOOT_Inintialization_Failed. 朱版已经说了: “VHD(X)模式与传统模式的安装过程大致相同,但要注意选择的系统必须使用Win10 v1809以上版本。” 坏坏小生提供的三杰版win10, 版本号为V1607(14393)不符合要求。 但为啥EXFAT驱动包里有对应这个版本的驱动呢 |
纸上得来终觉浅 |
谢谢分享。 |
支持原创 |
牛人 |
学习并支持! |
谢谢分享 |
给力! |
支持原创 |
作为技术探讨,很不错! |
ventoy 链接过来的,感谢分享研究成果 |
Powered by Discuz! X3.3
© 2001-2017 Comsenz Inc.