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


23

最终更新:

我已经知道解决该问题所需采取的措施。我只是不知道该怎么做。我希望会有一些现成的工具自动执行此操作-但找不到任何工具。我接受Rod的回答是因为尽管没有直接解决我的问题,但是它为扇区大小问题提供了很好的背景,并且使我充满信心,这个问题确实是分区对齐和解决。对于遇到相同问题的人员,在进行任何操作之前,请仔细,仔细地阅读它,包括评论。


在一开始的时候

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

然后,悲剧

美好的一天,我的电脑决定不再打开。原来主板(无品牌,上面印有一个很大的中国制造)已经坏了。我一直将其用作文件服务器,而500GB的驱动器现在充满了我无法承受的数据丢失。我现在破产了,买不起新电脑,所以我唯一的希望是USB机箱“有缺陷”。

调查

配备了多个Linux发行版,一台笔记本电脑,VirtualBox和机箱,我对此问题进行了法医分析。dmesg报告的分区大小超出了驱动器末端。因此,我浏览了硬盘驱动器数据表,从头开始计算扇区计数,使用dd手动测试了驱动器边界,一切看起来都还不错,直到我启动fdisk并说:

    Note: Sector size is 4096 (not 512).

fdisk多么谦虚。此“注释”是所有问题的根源。经过一些摆弄之后,得出了这些结论:

  • USB外壳没有缺陷。

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

  • 现在,当我尝试访问分区时,操作系统尝试在4096字节的扇区驱动器上使用基于512字节的地址,当然,它将无法正常工作。

问题

  • 因此,除了在十六进制编辑器上手动编辑MBR之外,我如何才能校正MBR中的地址,使其在4096字节的扇区大小上有效,并且

  • 分区未针对4096字节的扇区对齐。除了将其复制到另一个驱动器中和从另一个驱动器中复制出来之外,是否有一些工具可以使它们对齐?(我没有备用驱动器),还是需要创建一些工具来一次将数据“移动”到一侧?分区是ext3。

谢谢!

更新:

我发现有一个聪明的方法可以使用dd在以下问题中移动分区如何在GNU / Linux中移动分区? 但是我不知道它是否可以在一个扇区的一部分上工作。我目前无法测试,但有时间会测试。

更新2:

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


不知道,但有句话,​​听起来像是您可以上课计算机的工作原理!(然后,如果可以解决问题,请用现金购买另一个硬盘)
barlop

@barlop谢谢!但是我已经不得不在工作和大学之间分配时间,所以第二项工作现在就
不行了

1
到了早上六点,我在这个问题上度过了最后一刻!
Leonel 2014年

1
好的,所以我遇到了相反的问题:我有一个使用机箱格式化的1TB磁盘。因此,它使用每个扇区地址4096字节进行格式化。我不习惯手动编辑MBR。而且我需要直接在SATA上使用HDD(每个扇区512字节)有什么建议吗?
Leonel 2014年

1
@Leonel您可以使用Linux fdisk编辑MBR(我稍后学习了此知识,无需使用十六进制编辑器:)。您可以更改每个条目的起点和大小,并在应用之前检查更改。所以:start fdisk,记下当前配置(或者更好的是,用备份MBR dd),将起始地址和大小值乘以8并更改它们。确保使用计算器检查所有内容,并了解这些值的含义。您会看到Size = End-Start + 1,并且fdisk以1000个扇区为单位显示大小,因此您可能需要打开专家模式才能看到实际值,等等
。– NothingsImpossible

Answers:


24

部门规模的问题变得非常复杂。直到2009年末,绝大多数硬盘都使用512字节的扇区,仅此而已。在2009年末,磁盘制造商开始引入使用4096字节扇区的所谓的高级格式(AF)磁盘。这些第一批AF磁盘(以及AFAIK,今天的所有AF磁盘)为计算机提供了一个接口,该接口显示每个4096字节的物理扇区被拆分为八个512字节的逻辑扇区。通过这种转换,旧工具(包括许多BIOS)(基于512字节假设构建)可以继续工作。我不知道您的磁盘是否使用AF,但是无论哪种情况,它几乎都可以使用512字节的逻辑扇区大小,这意味着操作系统的接口应该使用512字节的扇区。

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

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

dd if=/dev/sdb of=~/image.img

这会将您的磁盘从/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

将该脚本另存为,mount_image并按如下方式使用它:

./mount_image ~/image.img 2 /mnt

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

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

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


非常有见地的答案,但不是我想要的。.我已经尝试了虚拟机方法,但是并没有撤消翻译。我刚到家,将尝试使用dd对齐第一个分区(一个较小的,不太重要的分区),并使其运行一整夜。如果成功,如果没有人回答,我将尝试手动编辑MBR。
NothingsImpossible

4
请勿尝试通过dd!修改磁盘的内容。除非你非常小心和了解的东西非常好(或者是非常幸运的话),你就更有可能垃圾的事莫过于解决它。在我看来,您可以使用以下方法来调整分区表fdisk:备份原始分区,然后将每个分区的起点除以8(并将终点设置为在下一个分区的起点之前结束)。这代表一个机会,仅当分区起点值是8的倍数
罗德·史密斯

1
天啊!谢谢(你的)信息。我已经尝试将Mac / Windows HDD克隆到SSD上一天了,我终于能够确定问题所在:我用来连接SSD的Rosewill SATA / IDE到USB适配器正在执行此“反向转换”到4096字节的扇区!因此,当我dd通过USB连接进行克隆后,SSD上的GPT +混合MBR看起来像胡说八道。我以为克隆失败了。但是,当我将固态硬盘代替旧硬盘直接连接到主板时,一切正常!
艾略特

1
无法编辑我之前的评论,但是“对齐”工具在这种情况下是无用的,仅用于优化目的。但是,请注意,您可以使用TestDisk,并在进行更深入的扫描之后,按P列出文件并恢复光盘的内容(这是我恢复数据的方式,但是我没有找到任何方法可以将字节扇区修复为这天...)。
令人惊讶的2015年

1
有趣的读物确认了问题并给出了解决方案的提示(通过Linux回送设备模拟桥的翻译):goughlui.com/2013/10/02/…和此askubuntu.com/questions/337693/…。作为补充说明,我还尝试过强制编辑逻辑大小以匹配物理大小,但是仍然无法识别驱动器。但是格式化它可以解决安装问题,但是文件当然会丢失,因此最好在通过环回安装或测试磁盘之前恢复它们。
令人惊讶的2015年

4

当您进行突袭或加密时,该脚本会概括罗德·史密斯的建议。没有保修。随时进行改进!(已更新有关mdadm的最新发现)

#!/bin/sh
#
# This script solve the following problem:
#
# 1. create a GPT partition on a large disk while attached directly via SATA
#    when the device present itself with 512 bytes of block size:
#    sd 3:0:0:0: [sda] 5860533168 512-byte logical blocks: (3.00 TB/2.72 TiB)
#
# 2. try to use a SATA to USB adapter like ID 067b:2773 Prolific Technology, Inc.
#    this present the device with 4096 bytes of block size:
#    sd 19:0:0:0: [sdc] 732566646 4096-byte logical blocks: (3.00 TB/2.72 TiB)
#
# 3. The kernel is unable to read correctly the partition table with
#    the USB adaper.
#
#
# With the current tools (kernel and gdisk) in debian wheezy is
# possible to use losetup to remap the partitions to loop devices so
# you can use them as usual with any filesystem, raid or crypto
#
# I still do not know if this issue is originated by the adapter or by
# the disk and if there are any others workarounds.
#
# Known version of the software:
# $ apt-show-versions linux-image-3.2.0-4-amd64
# linux-image-3.2.0-4-amd64/wheezy uptodate 3.2.54-2
# $ apt-show-versions gdisk
# gdisk/wheezy uptodate 0.8.5-1


attach_device() {

    device="$1";

    MYTMPDIR=`mktemp -d`
    trap "rm -rf $MYTMPDIR" EXIT

    # gdisk on the device use the 4096 sector size
    # but we need to force it to 512
    # this is a knwon workaround from http://superuser.com/a/679800
    # basically we make a copy of the gpt partition table on a file
    dd if="/dev/$device" bs=16384 count=1 of="$MYTMPDIR/gpt" 2> /dev/null

    # we extract the offset and the size of each partition
    #
    # FIXME: the "+ 1" seems strange, but it is needed to get the same
    #        size value from:
    #
    #        blockdev --getsize64
    #
    #        without the "+ 1" some funny things happens, for example
    #        you will not be able to start a recognized md device:
    #
    #        md: loop1 does not have a valid v1.2 superblock, not importing!
    #        md: md_import_device returned -22
    #
    #        even if
    #
    #        mdadm --examine /dev/loop1
    #
    #        does not complaint

    gdisk -l \
     "$MYTMPDIR/gpt" 2> /dev/null | \
     awk '/^ *[0-9]/ {printf "%.0f %.0f\n", $2 * 512, ($3 - $2 + 1) * 512}' > $MYTMPDIR/offset-size

    # we create a loop device with the give offset and size
    while read line;
    do
        offset=$(printf "$line" | cut -d ' ' -f 1);
        size=$(printf "$line" | cut -d ' ' -f 2);
        losetup --verbose --offset "$offset" --sizelimit "$size" `losetup -f` /dev/$device;
    done < $MYTMPDIR/offset-size;
}

detach_device() {

    device="$1";

    for loopdevice in `losetup -a | grep "$device" | cut -d : -f 1`;
    do
        losetup --verbose --detach "$loopdevice";
    done;
}

usage() {
cat <<EOF
Usage:
- $0 -h to print this help
- $0 sda to attach the gpt partitions of sda
- $0 -d sda to detach the gpt partitions of sda
EOF
}


detach=0;

while getopts hd action
do
    case "$action" in
        d) detach=1;;
        h) usage;;
    esac
done
shift $(($OPTIND-1))

if [ $# -ne 1 ];
then
    usage;
fi

if [ "x$detach" = "x0" ]; then
    attach_device $1;
else
    detach_device $1;
fi

哇!不错的工作!
NothingsImpossible

3

另一种相当简单的方法是使用parted的抢救功能。但是,这需要您创建一个新的磁盘标签,因此会带来风险。分区直接作用在磁盘上,因此在运行分区之前根据需要进行备份。然后开始:

parted /dev/sdb

当尝试读取扇区大小不同于创建分区表的扇区大小的磁盘时,parted会告诉您以下内容:

Error: /dev/sdb: unrecognised disk label                                  

使用mklabel根据您先前使用的内容创建新的MBR或GPT

(parted) mklabel
New disk label type? mbr

然后进行救援以找到您的旧分区

(parted) rescue
Start? 0
End? 4001GB
Information: A ext4 primary partition was found at 1049kB -> 2000GB.  Do you
want to add it to the partition table?
Yes/No/Cancel? y

如果您有更多分区,请重复救援过程。现在完成。


1
这对于我将分区表从mbr转换为gpt来说非常有效。这样做是为了将克隆的2TB磁盘扩展到4TB。让我的分区挂在那里有点紧张,但这比其他方法快得多。
OregonTrail

3

当我从WD My Book外部机箱中取出4TB磁盘时遇到了这个问题。问题是:

  1. MBR分区表关闭了8倍,
  2. 扇区大小为512时,MBR分区表无法处理> 2TB。

解决方案:将分区表重写为GPT,将值转换为使用512字节的扇区。

在我的情况下,分区以1MB的偏移量开始,并在磁盘结尾之前结束(〜856kB)。这很好,因为这样就允许在分区之前的MBR + GPT(17408字节)和磁盘末尾的备份GPT(16896字节)。

我以防万一(使用dd)制作了两个区域的图像。

我注意到的输出fdisk -l /dev/sde

我用gdisk删除了第一个分区。如果需要,可以像我一样做,将align值更改为8(4096)以使用尽可能多的空间。然后,我创建了一个新分区,开始于2048,结束于磁盘的末尾。稍后我将扩展文件系统。

幸运的是,扇区大小的变化不会影响文件系统,LVM或LUKS。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.