什么原因导致“发生磁盘读取错误,请按 Ctrl + Alt + Del 重新启动”?

什么原因导致“发生磁盘读取错误,请按 Ctrl + Alt + Del 重新启动”?

我有一个包含 Windows XP SP3 的虚拟机。

当我调整 VHD 文件(和嵌入分区)的大小并尝试启动时,我得到:

A disk read error occurred
Press Ctrl + Alt + Del to restart

一些说明:

  • FixBoot并且FixMBR不提供帮助。

  • ChkDsk没有帮助。

  • 该分区确实处于活动状态。

  • 该分区从第 63 扇区开始(它也是这样问题)位于 1 柱面、1 磁头,标记为类型 0x07 (NTFS)

  • 我的主机操作系统读取 VHD 和分区非常好

  • 我有兴趣知道原因而不是使固定。因此“重新格式化磁盘”、“重新安装 Windows”等都不是有效的解决方案。

    毕竟这是虚拟机……我没什么可失去的,所以我不在乎修复它。
    我只是想知道是什么导致了这个问题,以防我在物理机上再次遇到它(我以前遇到过)。


更多信息:

我制作了一个示例 VHD 文件,说明了(几乎)相同的问题,您可以下载这里

重现此问题:

  • 下载文件(高度压缩,小心!),然后尝试在 VirtualBox(或其他虚拟机)中启动它。请注意,系统会提示您“加载操作系统时出错”。(虽然错误不同,但问题是一样的。)

  • 现在尝试在 Windows 的磁盘管理中安装 VHD,然后运行BootSect.exe /NT60 X: /MBR​​,其中X:是安装卷的驱动器号。(该工具的位置可能是C:\boot\bootsect.exe,但如果您的系统上没有,则需要在其他地方找到它...)现在卸载它,然后尝试启动。现在启动应该可以正确进行。(虽然它找不到 Hal.dll,但至少您知道它在工作。)

  • 现在执行与上一步相同的操作,但使用/NT52而不是/NT60。现在您将看到第一个错误 - 表明 Windows XP 加载程序不喜欢这个磁盘
    所以我的问题是:为什么?

答案1

原因要么是引导加载程序正在调用 BIOS 来读取其他磁盘扇区,而该调用失败,要么是引导加载程序认为分区表无效。

如果我没记错的话,Windows 格式化磁盘时,不是会在磁盘的最后创建一个小分区,还是会在那里留下一个未分区的区域?您的调整大小实用程序是否重新创建了该分区?听起来很傻,但这可能是它抱怨的原因。很奇怪,但我认为 Windows(可能还有新版本中的某些东西)有这样的怪癖是可以理解的。

答案2

文件系统是错综复杂、难以捉摸的东西。例如,Partition Magic 的旧版本会抱怨我的某个磁盘上的分区存在一些小的数字不一致或其他问题,而 Windows (XP) 和 Easeus Partition Master 等软件都可以顺利运行。即使是 Norton Disk Editor 的旧版本也不会抱怨该磁盘。

事实上,很多小事都可能出错,甚至更糟的是,可能会“不是错误”但仍然不正确(即,不正确的值可能不显示任何症状)。


可能发生的情况是,当您调整 VHD 文件大小时,您使用的工具有一个错误并且没有(正确地?)更新磁盘文件系统中某个字段(分区表?引导记录?引导扇区?NTFS 元文件?)

正如其他人指出的那样,您收到的错误通常是BIOS错误,而不是操作系统错误。可能发生的情况是,未正确更新的字段位于磁盘的早期(例如,在引导记录或分区表中),因此当 VM BIOS 尝试读取磁盘时,它会找到不正确/不一致的值并引发异常。您没有提到您进行了哪种大小调整。您缩小了还是扩大了它?

我的假设是你调整了它的大小向下,并且 BIOS 正在读取分区表并尝试读取磁盘以外的内容(不存在的扇区),因为磁盘的大小未正确更新。

至于主机,我推测它之所以能够正确读取磁盘,是因为挂载 VHD 文件的软件以某种方式掩盖了错误。毕竟,对于主机而言,“磁盘”不是真正的磁盘,实际上只是一个 ( .vhd) 文件,而对于客户机而言,磁盘应该是真正的物理磁盘。因此,主机可以纠正客户机无法纠正的问题。


您可以检查是否有该工具的更新版本,或者使用 CloneZilla 等启动盘(或找到 PTEdit 的副本)在虚拟机中运行并从主机内部检查“磁盘”。

答案3

╒═════════════════════════════════════════════════════════════════════════════╕
│   Sectors:     3149824          Disk Signature:  0xEE3EEE3E                 │
├─────────────────────────────────────────────────────────────────────────────┤
│Pos Idx Type/Name Size Boot Hide  Start Sector  Total Sectors  DL Vol Label  │
├─── ─── ───────── ──── ──── ──── ────────────── ────────────── ── ───────────┤
│ 1   1  07-NTFS   1.5G  Yes  No              63      3,148,677 F: <None>     │
╘═════════════════════════════════════════════════════════════════════════════╛

3,148,677 / 3,149,824 = 0.999636 = 1 - 0.000364

1.5G * 0.000364 = 0.000546G

似乎只有大约 546 KB 可用空间,可能无法在启动时写入文件。

答案4

(添加另一个略有不同的答案。)

您说使用 NT52 引导扇区进行引导不起作用,但 NT60 可以。

区别可能在于启动过程。NT52 是使用 NTLDR 的 XP 启动,而 NT60 是使用 Bootmgr 的 Vista 方式。

NTLDR 使用 boot.ini 文件来定位硬盘和分区。它会查询计算机的固件 (BIOS),找出哪个硬盘被视为驱动器 0,然后查看该驱动器上的分区表,找出哪个分区是 1。一旦知道分区的位置,它就可以找到要求启动的操作系统的 Windows\system32 文件夹。

Bootmgr 会查阅 Boot 文件夹中的 BCD 文件,以获取查找正确驱动器和分区所需的信息,但它不使用固件来查找硬盘驱动器,也不使用分区表来查找分区。相反,它使用硬盘驱动器 MBR 中唯一的磁盘签名和分区的分区偏移量(起始扇区)。

显然,在调整磁盘大小时,您破坏了用于 NTLDR 启动过程但 Bootmgr 未使用的元素。这可能是 BIOS,因为它保存的有关硬盘的信息不再正确,例如柱面数或扇区数,或者 boot.ini 本身中的某些内容。

此外,bootsect 更新卷引导代码,而不是主引导代码。主引导代码是主引导记录 (MBR) 的一部分,每个物理磁盘只有一个。卷引导代码是卷引导记录的一部分,每个卷只有一个。在您尝试使磁盘可引导的过程中,两者之间可能出现了一些不兼容性,需要比我更了解引导过程才能进行分析。

由于 Bootmgr 不使用 BIOS 或 boot.ini,它显然设法使用 MBR 进行启动。

相关内容