GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie korrigiert man den 512-Byte-Sektor-MBR auf einer 4096-Byte-Sektor-Festplatte?

Fragen der Sektorgröße werden immer komplexer. Bis Ende 2009 verwendete die überwiegende Mehrheit der Festplatten 512-Byte-Sektoren, und das war es. Ende 2009 begannen Festplattenhersteller mit der Einführung des sogenannten Advanced Format (AF)-Festplatten, die 4096-Byte-Sektoren verwenden. Diese ersten AF-Festplatten (und, AFAIK, alle AF-Festplatten heute) bieten eine Schnittstelle zum Computer, die jede 4096-Byte physisch anzeigt Sektor als in acht logische 512-Byte aufgeteilt Sektoren. Durch diese Konvertierung können ältere Tools, einschließlich vieler BIOS, die mit 512-Byte-Annahmen erstellt wurden, weiterhin funktionieren. Ich weiß nicht, ob Ihre Festplatte AF verwendet oder nicht, aber in jedem Fall verwendet sie mit ziemlicher Sicherheit eine logische Sektorgröße von 512 Byte, was bedeutet, dass die Schnittstelle zum Betriebssystem 512-Byte-Sektoren verwenden sollte.

Erschwerend kommt hinzu, dass bestimmte USB-Festplattengehäuse vorhanden sind. Einige dieser Gehäuse machen das Gegenteil von dem, was AF macht:Sie nehmen acht Festplattensektoren und bündeln sie in einem neuen 4096-Byte-Sektor. Ich bin mir nicht sicher, was hinter diesem Schritt steckt, aber ein praktischer Vorteil besteht darin, dass Festplatten mit mehr als 2 TiB mit dem alten MBR-Partitionierungssystem verwendet werden können. Ein großer Nachteil besteht darin, dass eine Festplatte, die in einem dieser Gehäuse partitioniert ist, nicht direkt oder in einem Gehäuse verwendet werden kann, das diese Art der Übersetzung nicht durchführt. Ebenso kann eine ohne diese Übersetzung vorbereitete Platte nicht verwendet werden, wenn sie in ein solches Gehäuse übertragen wird. Beachten Sie, dass dieses Problem weit über den MBR selbst hinausgeht; Ihre Festplatte erkennt möglicherweise, dass die erste Partition im (512-Byte)-Sektor 2048 beginnt, aber wenn Ihr Betriebssystem nach dem (4096-Byte)-Sektor 2048 suchen würde, würde es nicht Finden Sie den Anfang dieser Partition! Sie sind auf dieses Problem gestoßen. Daher ist Ihr anfänglicher Gedanke, dass das USB-Gehäuse schuld ist, näher an der Sache als Ihr neuerer Gedanke, dass Ihr Motherboard es vermasselt hat. Ich habe nie Ich habe von einem Motherboard gehört, das die Sektorgröße auf diese Weise übersetzt. (Einige Hardware-RAID-Geräte tun dies jedoch.)

Ich kenne keine Möglichkeit, Linux zu zwingen, seine Vorstellung von der Sektorgröße anzupassen, aber wenn Sie über genügend Speicherplatz verfügen, kann es hilfreich sein, eine Low-Level-Festplattenkopie auf eine andere Festplatte zu erstellen. Zum Beispiel:

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

Dadurch wird Ihre Festplatte von /dev/sdb kopiert (dem USB-Datenträger; ggf. anpassen) in die Datei ~/image.img . Sie können dann das folgende Skript verwenden, um die Partitionen des Abbilds einzuhängen:

#!/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

Speichern Sie das Skript beispielsweise unter mount_image und verwenden Sie es wie folgt:

./mount_image ~/image.img 2 /mnt

Dadurch wird Partition 2 von image.img gemountet bis /mnt . Beachten Sie, dass das Skript auf GPT fdisk (gdisk ), die die meisten Distributionen in einem Paket namens gptfdisk enthalten oder gdisk .

Auf lange Sicht ist es eine bessere Lösung, einen Weg zu finden, die Festplatte anzuschließen, die die Sektorgrößenübersetzung nicht durchführt. Eine direkte Verbindung zu einem neuen Motherboard sollte ausreichen; oder Sie können wahrscheinlich ein externes Gehäuse finden, das die Übersetzung nicht durchführt. Tatsächlich führen einige Gehäuse die Übersetzung an USB-Anschlüssen durch, aber nicht an eSATA-Anschlüssen. Wenn Ihr Gehäuse also einen eSATA-Anschluss hat, können Sie versuchen, diesen zu verwenden. Mir ist klar, dass diese Lösungen wahrscheinlich alle Geld kosten werden, was Sie, wie Sie sagen, nicht haben, aber vielleicht können Sie Ihr Übersetzungsgehäuse gegen eines eintauschen, das die Übersetzung nicht übernimmt.

Eine andere Option, die mir einfällt, ist die Verwendung einer virtuellen Maschine wie VirtualBox. Ein solches Tool könnte eine Sektorgröße von 512 Byte annehmen, wenn es auf das Plattengerät zugreift, wodurch die Übersetzung effektiv rückgängig gemacht wird; oder Sie können den Inhalt der Festplatte roh kopieren (wie in dd if=/dev/sdc of=/dev/sdb ) innerhalb der virtuellen Maschine, die den Inhalt möglicherweise komprimiert kopiert, sodass das Image auf weniger Speicherplatz passt, als das Original verbraucht.


Dieses Skript verallgemeinert den Vorschlag von Rod Smith, wenn Sie einen Überfall oder eine Krypto haben. Keine Garantie. Fühlen Sie sich frei, es zu verbessern! (Aktualisiert mit den neuesten Erkenntnissen über 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

Ich hatte dieses Problem, als ich eine 4-TB-Festplatte aus einem externen WD My Book-Gehäuse entfernte. Das Problem ist:

  1. die MBR-Partitionstabelle ist um den Faktor 8 daneben und
  2. Die MBR-Partitionstabelle kann nicht>2 TB verarbeiten, wenn die Sektorgröße 512 beträgt.

Lösung: Schreiben Sie die Partitionstabelle in eine GPT um und konvertieren Sie die Werte, um 512-Byte-Sektoren zu verwenden.

In meinem Fall begann die Partition mit einem Versatz von 1 MB und endete (~ 856 KB) vor dem Ende der Festplatte. Das ist gut, weil es dann den MBR+GPT (17408 Bytes) vor der Partition und das Backup-GPT (16896 Bytes) am Ende der Festplatte zulässt.

Ich habe für alle Fälle Bilder von beiden Regionen gemacht (mit dd).

Ich habe mir die Ausgabe von fdisk -l /dev/sde notiert .

Ich habe gdisk verwendet, um die erste Partition zu löschen. Wenn Sie möchten, können Sie es wie ich tun und den Ausrichtungswert auf 8 (4096) ändern, um so viel Platz wie möglich zu nutzen. Dann habe ich eine neue Partition mit dem Start bei 2048 und dem Ende am Ende der Festplatte erstellt. Ich werde das Dateisystem später erweitern.

Glücklicherweise wirkt sich die Änderung der Sektorgröße nicht auf das Dateisystem, LVM oder LUKS aus.


Linux
  1. So partitionieren Sie eine Festplatte unter Linux

  2. Wie finde ich eine Festplatte als SSD oder HDD in Linux?

  3. Wie kann ich die Zuordnung meiner Festplatte zu unlesbaren Sektoren aufheben?

  4. Wie kann ich meine HDD Benchmarken?

  5. Wie konvertiere ich meine Linux-Festplatte mit UEFI von MBR in GPT?

So erhöhen Sie den virtuellen Speicherplatz der VM auf VirtualBox

So stellen Sie VDO auf einer Festplatte bereit | Roter Hut

So mounten Sie eine NTFS-Festplatte unter Linux

So verschlüsseln Sie eine Partition unter Linux

So formatieren Sie Festplattenpartitionen unter Linux

So erstellen Sie Festplattenpartitionen unter Linux