如何更正 4096 字节扇区磁盘上的 512 字节扇区 MBR?

Not*_*ble 24 linux hard-drive mbr partitioning

最终更新:

我已经知道我需要做什么来解决这个问题;我只是不知道该怎么做。我希望有一些现成的工具可以自动执行此操作 - 但找不到任何工具。我接受 Rod 的回答,因为尽管没有直接解决我的问题,但它为扇区大小问题提供了非常好的背景,并使我相信该问题确实是分区对齐和寻址。对于那些遇到同样问题的人,在做任何事情之前,请彻底仔细地阅读它,包括评论。


在一开始的时候

我有一台电脑,需要更多空间,我买了一个新的 500GB 驱动器和一个 USB 外壳。很快我就注意到,如果我对机箱上的驱动器进行分区并将其移动到计算机上,它就无法识别这些分区(反之亦然)。我认为这是外壳的问题,并没有担心。

那么,悲剧

美好的一天,我的电脑决定不再打开。结果发现主板(没有品牌,只是上面印着一个很大的 MADE IN CHINA)已经死了。我一直将它用作文件服务器,而那个 500GB 的驱动器现在充满了我不能丢失的数据。我现在破产了,买不起新电脑,所以我唯一的希望是“有缺陷的”USB 外壳。

调查

配备了几个 Linux 发行版、一台笔记本电脑、VirtualBox 和机箱,我对这个问题进行了取证分析。dmesg 报告分区大小超出驱动器末端。所以我查看了硬盘数据表,从头开始计算扇区数,用 dd 手动测试驱动器边界,一切看起来都很好,直到我启动 fdisk 并说:

    Note: Sector size is 4096 (not 512).
Run Code Online (Sandbox Code Playgroud)

多么谦虚的fdisk。这个“笔记”是所有问题的根源。经过一番折腾,得出了以下结论:

  • USB 外壳没有缺陷。

  • 至少现在已经死了的主板上的 SATA 控制器是一个“奇怪的”控制器。它没有向操作系统报告 4096 字节的扇区,因此操作系统愉快地使用 512 字节的扇区地址创建了 MBR。

  • 现在,当我尝试访问分区时,操作系统会尝试在 4096 字节的扇区驱动器上使用基于 512 字节的地址,当然,这是行不通的。

问题

  • 那么,除了在十六进制编辑器上手动编辑 MBR 之外,如何更正 MBR 中的地址,使它们在 4096 字节扇区大小上有效,以及

  • 分区未针对 4096 字节扇区对齐。除了复制进出另一个驱动器之外,还有一些工具可以用来对齐它们吗?(我没有备用驱动器),或者我是否需要创建一些工具将数据一次“转移”到一边一小块?分区是ext3。

谢谢!

更新:

我发现有一种聪明的方法可以使用 dd 在这个问题中就地移动分区How to move a partition in GNU/Linux? 但我不知道它是否适用于一个部门的一部分。我现在无法测试,但有时间时会测试。

更新 2:

所以我已经使用上述方法成功地对齐了分区,并在十六进制编辑器上手动编辑了 MBR。我一重新插上硬盘,吊杆分区就自动挂载了!不过,我不建议这样做,在此过程中出现 I/O 错误,我可能会丢失所有内容,请参阅对 Rod 回答的评论。对于另一个分区,我不会冒险,将使用旧硬盘并通过复制数据然后将其粘贴回不同位置来一次对齐块。

Rod*_*ith 26

部门规模问题正变得相当复杂。直到 2009 年底,绝大多数硬盘使用 512 字节扇区,仅此而已。2009 年底,磁盘制造商开始推出所谓的高级格式(AF) 磁盘,它使用 4096 字节扇区。这些第一批 AF 磁盘(以及 AFAIK,今天的所有 AF 磁盘)为计算机提供了一个界面,显示每个 4096 字节的物理扇区被分成八个 512 字节的逻辑扇区。这种转换使旧工具(包括许多 BIOS 以 512 字节假设构建)能够继续工作。我不知道您的磁盘是否使用 AF,但在任何一种情况下,它几乎肯定使用 512 字节的逻辑扇区大小,这意味着操作系统的接口应该使用 512 字节的扇区。

更复杂的是某些USB磁盘盒。其中一些机箱的功能与 AF 的功能相反:它们采用 8 个磁盘扇区并将它们捆绑到一个新的 4096 字节扇区中。我不确定这一举动背后的原因是什么,但一个实际优势是大于 2TiB 的磁盘可以与旧的 MBR 分区系统一起使用。一个主要缺点是分区在这些机箱之一中的磁盘不能直接使用,也不能在不进行此类转换的机箱中使用。同样,未经此转换准备的磁盘在传输到此类机箱时无法使用。请注意,这个问题远远超出了 MBR 本身;您的磁盘可能会将第一个分区识别为从(512 字节)扇区 2048 开始,但是如果您的操作系统要寻找(4096 字节)扇区 2048,找到那个分区的开始!你遇到了这个问题。因此,您最初认为是 USB 外壳的故障比您最近认为是主板搞砸了更接近标记。我从未听说过以这种方式转换扇区大小的主板。(不过,某些硬件 RAID 设备会这样做。)

我不知道有什么方法可以强制 Linux 调整其扇区大小的想法,但是如果您有足够的磁盘空间,将低级磁盘复制到另一个磁盘可能会有所帮助。例如:

dd if=/dev/sdb of=~/image.img
Run Code Online (Sandbox Code Playgroud)

这会将您的磁盘从/dev/sdb(USB 磁盘;根据需要进行调整)复制到文件~/image.img. 然后,您可以使用以下脚本挂载映像的分区:

#!/bin/bash
gdisk -l $1 > /tmp/mount_image.tmp
let StartSector=`egrep "^   $2|^  $2" /tmp/mount_image.tmp | fmt -u -s | sed -e 's/^[ \t]*//' | head -1 | cut -d " " -f 2`

let StartByte=($StartSector*512)

echo "Mounting partition $2, which begins at sector $StartSector"

mount -o loop,offset=$StartByte $1 $3

rm /tmp/mount_image.tmp
Run Code Online (Sandbox Code Playgroud)

将脚本另存为,比如说,mount_image像这样使用它:

./mount_image ~/image.img 2 /mnt
Run Code Online (Sandbox Code Playgroud)

这将挂载分区2image.img/mnt。请注意,该脚本依赖于GPT fdisk( gdisk),大多数发行版都将其包含在名为gptfdiskor的包中gdisk

从长远来看,更好的解决方案是找到一种方法来连接不会进行扇区大小转换的磁盘。直接连接到新主板应该可以解决问题;或者您可能会找到一个不进行翻译的外部外壳。事实上,有些机箱在 USB 端口上进行转换,但不在 eSATA 端口上进行转换,因此如果您的机箱有 eSATA 端口,您可以尝试使用它。我意识到这些解决方案都可能要花钱,你说你没有,但也许你可以用你的翻译附件换一个不做翻译的。

我想到的另一个选择是尝试使用像 VirtualBox 这样的虚拟机。这样的工具在访问磁盘设备时可能会假设一个 512 字节的扇区大小,从而有效地撤消转换;或者,您可以dd if=/dev/sdc of=/dev/sdb在虚拟机中复制磁盘的原始内容(如 中所示),这可能会通过压缩复制内容,从而使映像能够容纳的磁盘空间比原始占用的磁盘空间少。

  • ***不要***尝试通过`dd`修改磁盘内容!除非你*非常*小心并且*非常*好地理解事物(或者*非常**幸运),否则你更有可能把事情弄糟而不是修复它。我突然想到您可以使用 `fdisk` 调整分区表:备份原始分区,然后将每个分区的起点除以 8(并将终点设置为紧接在下一个分区的起点之前)。仅当分区起始点值都是 8 的倍数时才有可能。 (4认同)
  • 一个有趣的读物,它确认了问题并暗示了解决方案(通过 Linux 环回设备模拟网桥的翻译):http://goughlui.com/2013/10/02/experiment-usb-to-sata-bridge-chips-and- 2tb-drives/ 和这个 http://askubuntu.com/questions/337693/how-to-format-a-4k-sector-hard-drive 。作为附加说明,我还尝试强行编辑逻辑大小以匹配物理大小,但仍然无法识别驱动器。但是格式化它修复了挂载,但文件当然丢失了,所以最好在通过环回挂载或测试盘之前恢复它们。 (2认同)