无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
12
返回列表 发新帖
楼主: fszqwl
打印 上一主题 下一主题

chainloader (hd0) 无法启动硬盘引导

[复制链接]
31#
发表于 2025-3-25 13:28:00 | 只看该作者
本帖最后由 不点 于 2025-3-25 14:05 编辑
hilsonma 发表于 2025-3-25 13:13
非常感谢。

总结一下:

我已经更新了帖子,补充了 “不可以 find Windows”的内容。

因为 Windows 所在分区,不一定是 ntldr 所在分区。

有这样的可能性:ntldr 位于一个较小的分区上,而 Windows 位于一个较大的分区上。两者不在同一分区。

因此您这个菜单,还需要继续锤炼。

【补充】关于 Fatal!Inconsistent data read from ... 的问题。这当然是属于 buggy BIOS 的问题。但这问题出现的频率比较高。只要用户触碰了 BIOS 的读盘极限,什么情况都会发生,包括死机!

因此,最科学的办法是,尽量不让 grub4dos 去触碰靠后的分区。

比如说,只让 find 命令搜索主分区,不去搜索逻辑分区。这样通常就可以避免搜索靠后的分区了。

由于搜索的分区数目变少了,因此这样也可以加快 find 的执行速度。


点评

玩vhd前,曾经将系统装在逻辑分区里,想装的系统太多,主分区不够用  详情 回复 发表于 2025-3-25 22:31
这个怎么去操作?我不懂  详情 回复 发表于 2025-3-25 14:11
这部分内容我已经看了,但是暂时是无解的。 gmy 想做通用的pe引导盘,但现在没有找到一个通用的确定win分区的做法,所以只能找最常用的 /Windows 了,bootmgr/ntldr 多数情况也是放在这个分区的,如果出现你说的  详情 回复 发表于 2025-3-25 14:01
回复

使用道具 举报

32#
发表于 2025-3-25 14:01:48 | 只看该作者
不点 发表于 2025-3-25 13:28
我已经更新了帖子,补充了 “不可以 find Windows”的内容。

因为 Windows 所在分区,不一定是 ntldr  ...

这部分内容我已经看了,但是暂时是无解的。

gmy 想做通用的pe引导盘,但现在没有找到一个通用的确定win分区的做法,所以只能找最常用的 /Windows 了,bootmgr/ntldr 多数情况也是放在这个分区的,如果出现你说的例外那就只能失败了,暂时没有更好的办法。

点评

办法总比问题多。 要查找 ntldr 的时候,设法跳过 U 盘即可。可以先确定 U 盘的特征,比如,卷标,或者序列号,或者 uuid 之类的。可以修改一下 find 命令,让它按照某个条件去查找 ntldr。目前 find 命令支持按  详情 回复 发表于 2025-3-25 14:12
回复

使用道具 举报

33#
发表于 2025-3-25 14:11:51 | 只看该作者
不点 发表于 2025-3-25 13:28
我已经更新了帖子,补充了 “不可以 find Windows”的内容。

因为 Windows 所在分区,不一定是 ntldr  ...
只让 find 命令搜索主分区

这个怎么去操作?我不懂
回复

使用道具 举报

34#
发表于 2025-3-25 14:12:18 | 只看该作者
hilsonma 发表于 2025-3-25 14:01
这部分内容我已经看了,但是暂时是无解的。

gmy 想做通用的pe引导盘,但现在没有找到一个通用的确定wi ...

办法总比问题多。

要查找 ntldr 的时候,设法跳过 U 盘即可。可以先确定 U 盘的特征,比如,卷标,或者序列号,或者 uuid 之类的。可以修改一下 find 命令,让它按照某个条件去查找 ntldr。目前 find 命令支持按照某个条件查找文件。

点评

已知当前U盘的情况下确实可以通过CONDITION来排除u盘。 但是,假如说用户同时插入了多个U盘呢?  详情 回复 发表于 2025-3-25 14:30
知道 find 后面有个参数 condition 但不懂怎么用,也没有见过这样的应用实例。  详情 回复 发表于 2025-3-25 14:25
回复

使用道具 举报

35#
发表于 2025-3-25 14:25:37 | 只看该作者
不点 发表于 2025-3-25 14:12
办法总比问题多。

要查找 ntldr 的时候,设法跳过 U 盘即可。可以先确定 U 盘的特征,比如,卷标,或 ...

知道 find 后面有个参数 condition 但不懂怎么用,也没有见过这样的应用实例。

点评

grub4dos 的 readme 文件,有一个小节,“conditional find”,里面有这样一个例子: find /ntldr checkrange 0x07 parttype This will list all partitions with ID=0x07 and existing /ntldr. 此处,c  详情 回复 发表于 2025-3-25 18:03
回复

使用道具 举报

36#
发表于 2025-3-25 14:30:00 | 只看该作者
不点 发表于 2025-3-25 14:12
办法总比问题多。

要查找 ntldr 的时候,设法跳过 U 盘即可。可以先确定 U 盘的特征,比如,卷标,或 ...
  "find [--set-root[=DIR]] [--devices=DEVLIST] [--ignore-floppies] [--ignore-cd] [FILENAME] [CONDITION]",
  "Search for the filename FILENAME in all of partitions and print the list of"
  " the devices which contain the file and suffice CONDITION. CONDITION is a"
  " normal grub command, which return non-zero for TRUE and zero for FALSE."
  " DEVLIST specify the search devices and order,the default DEVLIST is upnhcf."
  " DEVLIST must be a combination of these letters (u, p, n, h, c, f)."
  " If the option --set-root is used and FILENAME is found on a device, then"
  " stop the find immediately and set the device as new root."
  " If the option --ignore-floppies is present, the search will bypass all"
  " floppies. And --ignore-cd will skip (cd)."

已知当前U盘的情况下确实可以通过CONDITION来排除u盘。
但是,假如说用户同时插入了多个U盘呢?

点评

用户插入多个 U 盘时,只有一个 U 盘实际的启动盘。这个 U 盘会被分配盘符 (0x80) 或 (0x00)。每个 U 盘上的 grub4dos 都可以事先知道它自己所在 U 盘的卷标、序列号、uuid。因此,find 命令总是可以跳过启动 U 盘。  详情 回复 发表于 2025-3-25 16:59
回复

使用道具 举报

37#
发表于 2025-3-25 16:59:45 | 只看该作者
本帖最后由 不点 于 2025-3-25 17:13 编辑
wintoflash 发表于 2025-3-25 14:30
已知当前U盘的情况下确实可以通过CONDITION来排除u盘。
但是,假如说用户同时插入了多个U盘呢?

用户插入多个 U 盘时,只有一个 U 盘是实际的启动盘。这个 U 盘会被分配盘符 (0x80) 或 (0x00)。每个 U 盘上的 grub4dos 都可以事先知道它自己所在 U 盘的卷标、序列号、uuid。因此,find 命令总是可以跳过启动 U 盘。

那些多余的 U 盘如何跳过呢?这些 U 盘不是启动盘,它们不会被分配靠前的盘符 (0x80)。它们通常只会被分配为末端的盘符,比如 (0x82) 之类的。可以调整 find 的条件,让它不搜索 (0x82) 以后的盘符,只搜索 (0x80) 和 (0x81)。在 U 盘是启动盘 (0x80) 的情况下,第一硬盘通常就是 (0x81)。而在 U 盘是 (0x00) 的情况下,第一硬盘是 (0x80)。

find 会优先找到硬盘上的 ntldr,而不是优先找到其他那些多余的 U 盘上的 ntldr。因为那些 U 盘会被分配末端盘符。

以上说的是理论上可以实现,至于说实际中如何实现,还需要研究 grub4dos 现有的 find 的条件表达式能否做到,以及是否需要改进和加强。

【补充】以上所说,主要针对 ntldr,不可以用于 bootmgr。因为,bootmgr 能够适应 (0x80), (0x81) 等任意盘符。用户有可能拥有两个本地硬盘,而第一硬盘 (0x80) 很可能是数据盘,不含 bootmgr。真正的 Windows 是安装在 (0x81) 上;在 U 盘启动的情况下,Windows 所在的盘就可能是 (0x82) 了。

所以,ntldr 和 bootmgr 应该使用不同的菜单,不要让两者混合使用同一个菜单逻辑。

回复

使用道具 举报

38#
发表于 2025-3-25 17:02:16 | 只看该作者
U盘启动要UEFI引导WINDOWS,这是多年来的问题。
1.硬盘号法-缺点是无法确认在哪一盘号。
title 启动存在的硬盘(hd1)\n chainloader (hd1)
chainloader (hd1)


2.文件名法-把bootmgfwold.efi更名(任意一个文件名-gmy.efi皆可)来FIND定位,但是大众化得想办法放入此文件。这是最实在的方式-UEFI和Legacy BIOS皆可。
title 启动硬盘windows系统(find 方案2)\n find搜索到有bootmgfwold.efi的第一个硬盘启动
find --set-root --devices=h /efi/microsoft/boot/bootmgfwold.efi
chainloader /efi/microsoft/boot/bootmgfw.efi

3.BCD法
bootmgfw.efi有可能在任一多U盘或硬盘中,这是最差的方式,BCD还须设定分区定位。

回复

使用道具 举报

39#
发表于 2025-3-25 18:03:01 | 只看该作者
本帖最后由 不点 于 2025-3-25 18:19 编辑
hilsonma 发表于 2025-3-25 14:25
知道 find 后面有个参数 condition 但不懂怎么用,也没有见过这样的应用实例。

grub4dos 的 readme 文件,有一个小节,“conditional find”,里面有这样一个例子:

                find /ntldr checkrange 0x07 parttype

        This will list all partitions with ID=0x07 and existing /ntldr.

此处,checkrange 0x07 parttype 就是条件。通常,一条命令就是一个条件。命令执行成功,就是 true,失败就是 false。

parttype 命令返回 “当前”分区的类型字节值。checkrange 命令检查这个类型字节值是否位于集合 { 0x07 } 之中,如果是,就返回 true,否则,返回 false。

需要设法获取当前分区的分区号。你可以自己编写一条命令,获取当前分区的分区号,也就是 (hdx,y) 里面的 y 值。然后用 “checkrange 0:3 【你的命令】”作为条件,这样就限定 find 只对主分区进行操作,因为主分区的 分区号是 0,1,2,3。

我隐约记得 wee 里面的 find 命令支持只查找主分区。可以把代码拷贝过来,放在 grub4dos 中。不过,我的记忆力是靠不住的。开发者们可以重新写代码,强化 find 命令。或者干脆模仿 parttype 命令,增加 drivenum,partnum,partstart,partlength 等命令,方便用户自己编写菜单程序。


回复

使用道具 举报

40#
发表于 2025-3-25 19:07:58 | 只看该作者
hilsonma 发表于 2025-3-25 13:13
非常感谢。

总结一下:

测了这个新代码,没问题。敢用真人头像的大神
回复

使用道具 举报

41#
发表于 2025-3-25 22:31:21 来自手机 | 只看该作者
不点 发表于 2025-3-25 13:28
我已经更新了帖子,补充了 “不可以 find Windows”的内容。

因为 Windows 所在分区,不一定是 ntldr  ...

玩vhd前,曾经将系统装在逻辑分区里,想装的系统太多,主分区不够用

点评

您的发言,引起我的思考。 反而觉得,find 在搜索 ntldr 时,恰恰正是应该只搜索主分区! 为什么呢? 因为 ntldr 只能放在主分区。在历史上,微软的扇区引导代码,向来都是只搜索和引导主分区里的 io.sys,  详情 回复 发表于 2025-3-26 08:19
回复

使用道具 举报

42#
发表于 2025-3-26 08:19:54 | 只看该作者
szwp 发表于 2025-3-25 22:31
玩vhd前,曾经将系统装在逻辑分区里,想装的系统太多,主分区不够用

您的发言,引起我的思考。

反而觉得,find 在搜索 ntldr 时,恰恰正是应该只搜索主分区!

为什么呢?

因为 ntldr 只能放在主分区。在历史上,微软的扇区引导代码,向来都是只搜索和引导主分区里的 io.sys, ntldr, bootmgr,而不引导逻辑分区里的 io.sys, ntldr, bootmgr。

也就是说,把 ntldr 放在逻辑分区里是不行的。Windows 可以在逻辑分区里,但 ntldr 不可以。

所以,无论如何,ntldr 都只能在主分区。

这就得到一个推论:find Windows 文件夹是错误的!因为 Windows 能够放在逻辑分区,而 ntldr 却不在那个逻辑分区里面。

find 应该直接找到 ntldr 所在的分区。把它设为 root 之后,再执行 chainloader 命令,这就可以成功加载它了。

点评

当年用的引导软件是spfdisk,是一个分区软件,也是一个引导器。可以做到各系统之间,其它系统分区隐藏,互不干扰。  详情 回复 发表于 2025-3-26 08:46
回复

使用道具 举报

43#
发表于 2025-3-26 08:46:00 | 只看该作者
不点 发表于 2025-3-26 08:19
您的发言,引起我的思考。

反而觉得,find 在搜索 ntldr 时,恰恰正是应该只搜索主分区!

当年用的引导软件是spfdisk,是一个分区软件,也是一个引导器。可以做到各系统之间,其它系统分区隐藏,互不干扰。

点评

不管是哪个分区软件、引导软件,使用的规范都是同一个:是 PC 的总司令微软制定的规范。 无论 ntldr 所在分区是否隐藏,它必须是主分区。因为这是微软的习惯。 grub4dos 会忽略隐藏标志,找到里面的 ntldr。  详情 回复 发表于 2025-3-26 10:18
回复

使用道具 举报

44#
发表于 2025-3-26 10:18:49 | 只看该作者
szwp 发表于 2025-3-26 08:46
当年用的引导软件是spfdisk,是一个分区软件,也是一个引导器。可以做到各系统之间,其它系统分区隐藏, ...

不管是哪个分区软件、引导软件,使用的规范都是同一个:是 PC 的总司令微软制定的规范。

无论 ntldr 所在分区是否隐藏,它必须是主分区。因为这是微软的习惯。

grub4dos 会忽略隐藏标志,找到里面的 ntldr。

也就是说,如果遵从微软的规范(微软的习惯也算是规范),那么,ntldr 就是在主分区。

也就是说,即使是 Windows 系统被安装到了逻辑分区,其引导加载器 ntldr 文件也是在一个主分区里面。这个主分区可以小一点,能够放置 ntldr 相关的文件就够了。

那么,把微软的规范进行扩展,可以吗?

可以。其实,ntldr 放在逻辑分区,用 grub4dos 去加载它,是有可能成功启动它的。

然而要明白,微软自己的引导记录是不支持逻辑分区的,也就是说,无法引导逻辑分区里面的 ntldr。

如果你的启动 U 盘只需要针对你自己的电脑,你当然可以无视什么规范,只要能够启动成功,黑猫白猫,都是好猫。

然而如果你的软件、你的启动程序是想要让大众使用,你就不得不考虑各种可能性。比如,把 Windows 安装在逻辑分区里面的情况,而 ntldr 位于主分区。

点评

自用和给别人用区别太大,需要考虑的东西太多了  详情 回复 发表于 2025-3-26 10:29
回复

使用道具 举报

45#
发表于 2025-3-26 10:29:26 | 只看该作者
不点 发表于 2025-3-26 10:18
不管是哪个分区软件、引导软件,使用的规范都是同一个:是 PC 的总司令微软制定的规范。

无论 ntldr  ...

自用和给别人用区别太大,需要考虑的东西太多了

点评

其实这里讨论的重点是 hilsonma 的 find Windows 方案的可行性。 结论是不可行。当然了,如果对失败情况进行 “忽略”,那也算是可行。 然而,能够优化,为何不优化呢?提高成功率不好吗?提高程序代码的适应  详情 回复 发表于 2025-3-26 10:38
回复

使用道具 举报

46#
发表于 2025-3-26 10:37:48 | 只看该作者
这个比较难啊
回复

使用道具 举报

47#
发表于 2025-3-26 10:38:12 | 只看该作者
szwp 发表于 2025-3-26 10:29
自用和给别人用区别太大,需要考虑的东西太多了

其实这里讨论的重点是 hilsonma 的 find Windows 方案的可行性。

结论是不可行。当然了,如果对失败情况进行 “忽略”,那也算是可行。

然而,能够优化,为何不优化呢?提高成功率不好吗?提高程序代码的适应性不好吗?

即使 Windows 在主分区,ntldr 也可能是在另外一个主分区里面。

所以,不能武断地认为,只要找到了 Windows 所在的分区,就能够在同一分区下找到 ntldr 文件。

点评

引导分区和系统分区不需要在同一分区的,硬盘上可以只有系统没有引导。只用U盘引导,可以一定程度防止别人使用电脑。  详情 回复 发表于 2025-3-26 10:54
回复

使用道具 举报

48#
发表于 2025-3-26 10:54:49 | 只看该作者
不点 发表于 2025-3-26 10:38
其实这里讨论的重点是 hilsonma 的 find Windows 方案的可行性。

结论是不可行。当然了,如果对失败情 ...

引导分区和系统分区不需要在同一分区的,硬盘上可以只有系统没有引导。只用U盘引导,可以一定程度防止别人使用电脑。
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2025-4-4 09:47

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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