理论

理论

我有一个 1TB 的硬盘,扇区大小为 512 字节,我已经通过 USB 磁盘盒使用它很多年了。但是,磁盘盒现在已经坏了。

当我将它转移到新的机箱时,我发现 Windows 无法读取它 - 它只是显示为“本地磁盘”。

通过各种研究,我发现原因是原来的 USB 外壳将磁盘上的 512 字节扇区转换为 4k 扇区,并将其呈现给外界。新的外壳没有这样做,这就是无法读取磁盘的原因。

我发现了一个听起来像类似问题的问题(如何在 4096 字节扇区的磁盘上更正 512 字节扇区的 MBR?),但 (a) 从我的阅读来看,这听起来与我的情况相反;并且 (b) 它没有描述解决问题所需的实际步骤(只是一种一般方法)。


理论

除了尝试寻找另一个可以进行相同转换的外壳(感觉就像是在拖延问题,而且还会产生不必要的开支)之外,据我所知,解决方案是修复 MBR 中的值,使它们反映真实的 512 字节磁盘几何形状,而不是先前感知的 4k 几何形状。

由于分区表大小都是根据扇区数定义的,因此我需要转换现有值(这些值指定 4k 扇区的大小,即ByteOffset = N x 4096),以便它们包含N512 字节扇区的等效值(即ByteOffset = N x 512)。换句话说,我需要将这些值中的每一个乘以 8。

Q1:我是对的吗——这就是我需要做的全部吗,或者还有比这更复杂的事吗?


实践

假设上述解决方案是正确的,我真正想要的是是否有人可以提供一个工具或一组清晰的说明,以便我能够对磁盘进行这些更改。风险越小越好!(例如,通过输入十进制数直接编辑 MBR 字段的工具比直接在磁盘上处理十六进制值更好。)

Q2:我应该使用什么工具来实现这一点(基于上述标准)?

问题 3:我需要编辑哪些字段/偏移量?(该磁盘有一个占满整个磁盘的分区。)

请注意,我可以使用以下系统:Windows XP、Windows 10、Ubuntu 15.4。我更喜欢 Windows 解决方案,但如果有必要,Linux 解决方案也可以 - 我习惯使用命令行。

此外,我过去曾做过字节级手动磁盘编辑任务,所以如果真的没有更好的方法来解决这个问题,这是一种可能性。


更新

外部驱动器是 Dynamode 3.5 英寸 USB 2.0 外壳,就像这个

根据要求,这是来自 Linux 命令的输出fdisk

root@buttons:~# fdisk -l /dev/sdb

Disk /dev/sdb: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x000210df

Device     Boot Start        End    Sectors   Size Id Type
/dev/sdb1  *     2048 1953523711 1953521664 931.5G  7 HPFS/NTFS/exFAT

root@buttons:~# fdisk -l /dev/sdb1

Disk /dev/sdb1: 931.5 GiB, 1000203091968 bytes, 1953521664 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x2052474d

Device      Boot      Start        End    Sectors   Size Id Type
/dev/sdb1p1 ?       6579571 1924427647 1917848077 914.5G 70 DiskSecure Multi-Boot
/dev/sdb1p2 ?    1953251627 3771827541 1818575915 867.2G 43 unknown
/dev/sdb1p3 ?     225735265  225735274         10     5K 72 unknown
/dev/sdb1p4      2642411520 2642463409      51890  25.3M  0 Empty

Partition table entries are not in disk order.

答案1

这不是我的问题的直接答案,因为它没有对磁盘应用适当的修复(这是我最感兴趣的)。

然而,从实际角度来看,它解决问题的方式相当缓慢且迂回。

我发现了一个免费的工具叫测试磁盘由 CG Security 开发,似乎可以在几乎所有操作系统上运行。可以指示该工具使用任意扇区大小读取磁盘,这意味着我们可以覆盖驱动器报告的物理扇区大小并从中恢复数据。

如何使用

下载并安装此命令行实用程序后,运行它,决定如何创建日志文件,然后:

  1. 从列表中选择磁盘。确保选择物理磁盘而不是逻辑驾驶
  2. 选择Intel分区类型。
  3. 选择Geometry选项并将 更改为Sector Size。这将允许 TestDisk 正确读取磁盘。5124096
  4. 选择Advanced哪个文件实用程序,并且 - 如果有多个分区 - 选择您感兴趣的分区。如果您计划稍后重建磁盘,您还应该在此阶段记下分区大小。
  5. 选择List查看磁盘上的文件。
  6. 从这里您可以浏览文件系统,选择单个文件或文件组,并将它们复制到另一个位置(即不同的磁盘)。
  7. 要复制整个磁盘,请从根目录选择a所有文件,然后C按大写字母复制选定的文件,然后浏览到目标磁盘并C再次按大写字母复制所有文件。
  8. 如果有多个分区,请重复。

您现在已经备份了整个磁盘!因此,您可以使用标准操作系统工具按照以前的布局擦除和重新分区原始磁盘(现在没有磁盘外壳转换扇区,这将自动使用正确的几何结构)并将文件复制回来以完成重建。

请注意,上述说明仅恢复磁盘分区和文件结构,但如果您还需要引导扇区、使用非 NTFS 驱动器、需要将文件放置在特定磁盘位置(罕见)或使用其他更复杂的 gubbins(例如替代数据流),这可能还不够。所有这些问题都可能使用此工具解决,也可能不能解决,但上述说明无法解决。


(请注意,我并不想接受这个答案,因为它实际上是在回避我的问题而不是解决它。但是,我在这里将其作为一种替代方法。)

答案2

通过在 Linux 上创建大小相同且位于相同位置的分区,可以实现这一点fdisk。您需要根据扇区大小的差异转换起始值和结束值。看起来当前值与磁盘的大小相匹配(机柜是否也映射了分区表?),因此您只需要修复 NTFS 引导扇区。

FAT 和 NTFS 的文件系统元数据取决于磁盘扇区大小,因此您必须对其进行修改。如果 NTFS 簇大小小于 4K,则无法从 512 更改为 4096。

如果是 NTFS,您可以在 Linux 上编辑引导扇区(在分区的开始处),hexedit更改以下小端值(说明假定簇大小为 4K):

  • 0x0B(每个扇区字节数)0x0200(512)<-> 0x1000(4096)
  • 0x0D(每簇扇区数)0x08(8 * 512 = 4096 字节簇)<-> 0x01(1 * 4096 = 4096 字节簇)
  • 0x1C(隐藏扇区)分区前的扇区数
  • 0x28(总扇区数)分区大小(以扇区数减 1)

参考:NTFS 分区引导扇区

如果您要从此磁盘启动 Windows 10,则需要保留磁盘和分区 GUID。对于具有 512 字节扇区的磁盘,EFI 系统分区 (FAT32) 必须至少为 33MB(通常为 100MB),对于具有 4096 字节扇区的磁盘,EFI 系统分区 (FAT32) 必须至少为 257MB(通常为 260MB)(我建议重新创建它,因为它包含的文件很少并且易于复制)。

答案3

您可能需要考虑尝试更改磁盘接口上的逻辑扇区大小,以匹配通过已停用的 USB 接口管理的 4K 扇区大小:

hdparm --set-sector-size 4096 /dev/sdX    # for an appropriate value of X

您需要一个较新的版本hdparm才能找到此选项。我不知道 Ubuntu 15.4 是否足够新(如果不是,您可以下载 Live 版本)。

强制警告:我没有以同样的方式损坏的磁盘来测试此命令。

相关内容