tl;dr:跳至问题部分
背景
我有一个安装了 Windows 7 的驱动器。它有一个 100MB 的 Windows 7 启动分区,后面跟着一个占据驱动器其余空间的分区。不久前,我缩小了主分区,这样我就可以为文件创建一个单独的卷,而不是将它们存储在安装 Windows、游戏和程序的同一卷上。
最近我清除了辅助分区并使用 EASEUS Parition Master (Home) 将其删除,并像以前一样使用主分区来占用整个磁盘。
问题
不幸的是,EASEUS 成功完成其工作后(在 Windows Native-API 模式下),我再也无法使用该驱动器启动系统。每当我尝试启动时,BIOS 都会检测到驱动器,读取并打印 SMART 数据(STAUS OK
),然后就挂起了。
起初我担心驱动器在重新调整大小操作和重新启动之间莫名其妙地坏掉了,但在将其放入外部机箱后,我发现驱动器实际上很好,甚至更好,分区完好无损,所有文件都可以访问。另一个分区消失了,主分区已根据需要扩展到驱动器的整个长度。它在 Windows 中完全可以正常工作,只是不能在 BIOS 中工作。
测试和观察
我以只读模式运行了磁盘管理 MMC 管理单元、chkdsk、TestDisk、(新版本)EASEUS Partition Master(免费)、EASEUS Partition Recovery、PC Inspector Drive Recovery 和一些其他工具,发现它们大多数都无法解决驱动器问题。唯一显示有问题的是 TestDisk,它显示驱动器几何结构不匹配。
诊断
我得出的结论是,Windows 能够读取驱动器并正常检测分区(它可能忽略了不相关的向后兼容性)分区表中的值,但是当 BIOS 尝试从驱动器读取启动文件时,它会因错误的值而绊倒并挂起。
问题
我现在需要的是一种方法来纠正分区表(和 MBR?)以与 BIOS(表面上是 DOS)向后兼容,而不会丢失任何数据。
限制
我知道您可以重写 MBR 而不会丢失任何数据,但我不确定如何在不弄乱现有分区的情况下重新构建分区表。
不幸的是,我没有足够大的备用驱动器来复制所有内容(我也不想格式化并复制回所有这些东西),所以我需要一种安全的方法来进行就地修复。我已经转储了驱动器的第一个兆字节左右的副本以及 Windows 分区的开头部分。因此,我有 100MB 启动分区和 Windows 分区的 MBR、分区表和启动扇区的副本。
工具和技能
我熟悉低级磁盘工具,包括十六进制和磁盘编辑器(我曾多次在 FAT 卷上进行数据恢复,包括重建 FAT 链和目录),但对 NTFS 的经验并不多。
TestDisk 分析后给出以下错误:
Disk /dev/sdf - 500 GB / 465 GiB - CHS 60801 255 63
Current partition structure:
Partition Start End Size in sectors
Warning: number of heads/cylinder mismatches 224 (NTFS) != 255 (HD)
Warning: number of sectors per track mismatches 19 (NTFS) != 63 (HD)
1 * HPFS - NTFS 0 32 33 12 223 19 204800
Bad relative sector.
2 P HPFS - NTFS 12 223 20 60801 76 27 976566032
Bad relative sector.
备份日志如下:
#1420342168 Disk /dev/sdf - 500 GB / 465 GiB - CHS 60801 255 63
1 : start= 2048, size= 204800, Id=07, *
2 : start= 206848, size=976566032, Id=07, P
#1420342211 Disk /dev/sdf - 500 GB / 465 GiB - CHS 60801 255 63
1 : start= 2048, size= 204800, Id=07, *
2 : start= 206848, size=976566032, Id=07, P
答案1
BIOS 通常不应该读取任何启动文件,MBR 中只有 440 字节的引导代码,其余的就是您的引导加载程序的事了……(尽管也有不幸的例外。)
所以你可能只需要重新安装使用 Windows 引导加载程序bootrec /fixmbr
。
要重新创建分区表,可以使用 Linux CD。运行fdisk /dev/sd…
,记下分区布局(类型、起始扇区、大小),使用o
创建一个空分区表,使用完全相同的布局重新添加所有分区,然后w
写出新表。
答案2
这看起来像一个旧错误(除法整数溢出)在英特尔芯片组 SATA 控制器的 AHCI/RAID 固件中 — 启动停止并显示邮政 代码 23在枚举连接到 SATA 控制器的设备时(“有问题的” SATA 设备连接到“端口 01”):
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
Serial ATA AHCI BIOS, Version iSrc 1.20E
Copyright (c) 2003-2008 Intel Corporation 23
** This version supports only Hard Disk and CDROM drives **
Please wait. This will take few seconds.
Controller Bus#00, Device#1F, Function#02: 06 Ports, 02 Devices
Port-00: No device detected
_
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
有关错误的详细描述以及 AHCI/RAID 固件的具体信息:
- 解决方案:GA-P35-DS3 Rev 1.0 BIOS F14 SATA AHCI 本机模式在 HDD 检测时挂起
- 在 AHCI 模式下,根据第一个分区的结束 CHS 地址重新计算(翻译)磁盘几何形状(设备参数表)(该链接应打开来自“[RU] Ivan”的消息模范 软件集团)
- 译文设备参数表: 固件的伪代码以及各个固件版本中错误的详细描述(串行 ATA AHCI BIOS,版本 iSrc 1.20_E.*)
以下几个链接可帮助您了解 MBR 结构并手动修复问题:
- 维基百科
- 经典通用 MBR 的结构
分区表条目 - LBA ↔︎ CHS 转换
- CHS 地址:头部&CHS 到 LBA 映射
- 经典通用 MBR 的结构
- MBR 备忘单(这是 MBR 在十六进制编辑器中的样子)
笔记:在里面2020-05-26文档版本,表 2“起始扇区和起始柱面...”不正确(请注意位 6 和 7)。 - 磁盘几何计算器 (JavaScript)
- 星人的领域
- 检查 Windows 7、8/8.1 或 10 MBR— 参见图 1 “典型的 Windows 7 分区表” & “示例磁盘签名和分区表的位置记忆“(十六进制编辑器)
- MBR/EBR 分区表
解码 CHS 值(解码扇区和柱面位) - 真实分区表示例:带有三个操作系统的 20 GB 硬盘在十六进制编辑器中
- HxD 十六进制编辑器—下载 便携的版
- 如何使用 HxD 作为磁盘编辑器将扇区保存为二进制文件(到备份 MBR— 滚动至上方查看“重要信息”)
- OSDev:使用 BIOS 进行磁盘访问 (INT 13h) —获取扇区/轨道、总头部值(“驱动几何”)
- 增强的磁盘驱动器 BIOS 服务 — 工作 T13 草案 1126DT
让我澄清一下康德拉意思是当他写道:
如果您对磁盘进行多次分区,并且驱动器几何结构被 diskpar、diskpart 和 Windows 安装 CD 更改,则可能会导致控制器挂起,因为 CHS 值有时会变得更加损坏。
考虑全新安装 Windows 7 的情况,例如技嘉台式机主板。
笔记:以下列表中的每个项目代表一次系统启动。
SATA‑AHCI BIOS(翻译设备参数表):255 个磁头,63 个扇区/磁道
安装 Windows 7(分区表中分区的CHS值):- 开始:(
0 32 33
十六进制20 21 00
:),结束:(12 223 19
十六进制DF 13 0C
:) - 开始:(
12 223 20
十六进制DF 14 0C
:),结束:(1023 254 63
十六进制FE FF FF
:)
- 开始:(
SATA‑AHCI BIOS (TDPT):224 个磁头,19 个扇区/磁道
添加 2 个分区后:- 开始:
0 107 16
,结束:48 134 14
- 开始:
48 134 15
,结束:1023 223 19
??? - 开始:
1023 223 19
???,结束:1023 223 19
??? - 开始:
1023 223 19
???,结束:1023 223 19
???
笔记:对于已经存在的分区(前两个),只有 CHS 值会改变,而 LBA 保持不变。
- 开始:
SATA‑AHCI BIOS (TDPT):135 个磁头,14 个扇区/磁道
删除第 4 个分区后:- 开始:
1 11 5
,结束:109 59 12
- 开始:
109 59 13
,结束:1023 134 14
??? - 开始:
1023 134 14
???,结束:1023 134 14
???
- 开始:
SATA‑AHCI BIOS (TDPT):60 个磁头,12 个扇区/磁道
添加第 4 个分区后:- 开始:(
2 50 9
十六进制32 09 02
:),结束:(287 17 4
十六进制11 44 1F
:) - 开始:(
287 17 5
十六进制11 45 1F
:),结束:(1023 59 12
十六进制3B CC FF
:) - 开始:(
1023 59 12
十六进制3B CC FF
:),结束:(1023 59 12
十六进制3B CC FF
:) - 开始:(
1023 59 12
十六进制3B CC FF
:),结束:(1023 59 12
十六进制3B CC FF
:)
- 开始:(
SATA‑AHCI BIOS:POST 代码 23 …
??? — 假定值。
剧透:为了生成后续的 CHS 地址(第一个分区中最后一个绝对扇区的地址),我使用了以下 JavaScript 代码调查的影响分析一下这个具体的DPT Translation对CHS地址的影响:
(function(){"use strict"; // https://en.wikipedia.org/wiki/Logical_block_addressing?oldid=1061258642#CHS_conversion var LBA_to_c = function(LBA, TDPT_H, TDPT_S){ return LBA/(TDPT_H*TDPT_S) |0; }; var LBA_to_h = function(LBA, TDPT_H, TDPT_S){ return (LBA/TDPT_S |0) % TDPT_H; }; var LBA_to_s = function(LBA, TDPT_S){ return LBA % TDPT_S + 1; }; var print = function(i, c,h,s){ console.log( ( " "+i).slice(-2) +": "+ (" "+c).slice(-5) +" "+ ( " "+h).slice(-3) +" "+ ( " "+s).slice(-2) ); }; var LBA = 206847; var c = LBA_to_c(LBA, 255, 63), h = LBA_to_h(LBA, 255, 63), s = LBA_to_s(LBA, 63); print(0, c,h,s); for(var i=1; i<=16; i++){ c = LBA_to_c(LBA, h+1, s), h = LBA_to_h(LBA, h+1, s), s = LBA_to_s(LBA, s); print(i, c,h,s); } })();
输出:
频道 0:12223 19 1:48 134 14 2:109 59 12 3:287 17 4 4:2872 15 4 5:3231 15 4 6:3231 15 4 7:3231 15 4 …如你所见,在 CHS 值稳定下来之前,除法整数溢出发生了i : (3)⇥4。
事实证明,安装系统后,我们只能更改分区表(包括重启)2次。
可能的解决方案
数学解决方案
我们需要找到这样一个 CHS 地址(第一个分区中的最后一个绝对扇区的地址),该地址在考虑 DPT 转换后保持不变。即:
寻找
答案3
过去,Christophe Grenier 的 PhotoRec 给我留下了深刻的印象。显然,他真的知道自己在做什么,并且对文件系统和文件类型进行了大量研究。因此,我决定相信他的专业知识,并让测试磁盘做它的事情(特别是因为它是唯一真正检测到任何问题的工具)。
出现错误消息后,我继续操作,直到它让我选择写入我正在查看的分区表或搜索更多分区。由于列出的分区已经正确,我允许它写入分区表并重新启动。驱动器仍被识别,所有文件均可访问(仍在外部机箱中),因此我做了一个chkdsk
安心的操作,检查结果正常。
最后一步是将其插入系统,看看它是否能通过 BIOS。果然,它通过了。chkdsk
为了更加确定,我又做了一次,结果再次检查无误。事实上,我现在正在写这篇文章,而驱动器正在电脑里快乐地旋转。
因此,如果有人调整分区大小并发现其 BIOS 在检测到驱动器后挂起,请将其放入外部机箱或放入具有不同 BIOS 的另一个系统中,然后让 TestDisk 重写分区表。它应该调整参数以再次与旧 BIOS(可能还有 DOS)兼容。它将使用正确的参数写入正确的分区表,并应保持驱动器上所有其他数据完好无损。
(我要指出的是,一旦 TestDisk 重写了分区表,它就不再显示错误,因为它在分区表仍在外壳中时重写了分区表,但是在将驱动器放回系统后,TestDisk 再次显示错误,一些是旧的,一些是新的,一些是不同的,但驱动器仍然工作正常。我在下面列出了新的错误,以防有人想尝试调试 BIOS 挂起的确切原因,因为它似乎只与几何参数部分相关。)
Disk /dev/sdb - 500 GB / 465 GiB - CHS 229504 224 19
Current partition structure:
Partition Start End Size in sectors
1 * HPFS - NTFS 0 107 16 48 134 14 204800
Warning: Bad starting sector (CHS and LBA don't match)
Warning: number of heads/cylinder mismatches 255 (NTFS) != 224 (HD)
Warning: number of sectors per track mismatches 63 (NTFS) != 19 (HD)
2 P HPFS - NTFS 48 134 15 229504 215 11 976566272
Warning: Bad starting sector (CHS and LBA don't match)