it-swarm.com.de

Wie korrigiere ich den 512-Byte-Sektor-MBR auf einer 4096-Byte-Sektor-Festplatte?

Letzte Aktualisierung:

Ich wusste bereits, was ich tun musste, um dieses Problem zu beheben. Ich wusste einfach nicht , wie ich es machen sollte. Ich hatte gehofft, dass es ein fertiges Tool geben würde, das das automatisch erledigt - aber ich konnte keines finden. Ich akzeptiere Rods Antwort, da sie, obwohl sie mein Problem nicht direkt löste, einen sehr guten Hintergrund zum Problem der Sektorgröße bietet und mir die Zuversicht gab, dass das Problem wirklich die Ausrichtung und Adressierung der Partitionen war. Wenn Sie zu dieser Frage mit demselben Problem kommen, lesen Sie sie gründlich und sorgfältig durch, einschließlich Kommentaren, bevor Sie etwas unternehmen.


Am Anfang

Ich hatte einen Computer und brauchte mehr Platz. Ich habe ein neues 500-GB-Laufwerk und ein USB-Gehäuse gekauft. Bald habe ich festgestellt, dass wenn ich das Laufwerk auf dem Gehäuse partitioniert und auf den Computer verschoben habe, es die Partitionen nicht erkennt (und umgekehrt). Ich nahm an, dass es ein Problem mit dem Gehäuse war und machte mir darüber keine Sorgen.

Dann die Tragödie

Ein wunderschöner Tag, mein Computer hat beschlossen, sich nicht mehr einzuschalten. Es stellt sich heraus, dass das Motherboard (ohne Marke, nur ein großer MADE IN CHINA-Aufdruck) tot ist. Ich habe es als Dateiserver verwendet und dieses 500-GB-Laufwerk ist jetzt voll mit Daten, die ich mir nicht leisten kann, zu verlieren. Ich bin jetzt pleite und kann mir keinen neuen Computer leisten, daher war meine einzige Hoffnung das "defekte" USB-Gehäuse.

Die Ermittlung

Ausgerüstet mit mehreren Linux-Distributionen, einem Laptop, VirtualBox und dem Enclosure habe ich eine forensische Analyse zu diesem Thema durchgeführt. dmesg meldete, dass die Partitionsgröße das Laufwerksende überschritten hat. Also habe ich die Datenblätter der Festplatte durchgesehen, die Anzahl der Sektoren von Grund auf berechnet, die Laufwerksgrenzen manuell mit dd getestet und alles sah in Ordnung aus, bis ich fdisk gestartet habe und es stand:

    Note: Sector size is 4096 (not 512).

Wie bescheiden von fdisk. Diese "Notiz" war die Wurzel aller Probleme. Nach einigem Hin und Her wurden folgende Schlussfolgerungen gezogen:

  • Das USB-Gehäuse ist nicht defekt.

  • Der SATA-Controller auf dem nun toten Motherboard war zumindest "komisch". Es wurden keine 4096-Byte-Sektoren an das Betriebssystem gemeldet, daher erstellte das Betriebssystem den MBR mit 512-Byte-Sektoradressen.

  • Wenn ich jetzt versuche, auf die Partition zuzugreifen, versucht das Betriebssystem, die 512-Byte-basierten Adressen auf einem 4096-Byte-Sektorenlaufwerk zu verwenden, und das wird natürlich nicht funktionieren.

Die Frage

  • Wie kann ich also die Adressen im MBR korrigieren, damit sie für eine Sektorgröße von 4096 Byte gültig sind, abgesehen von der manuellen Bearbeitung des MBR in einem Hex-Editor, und

  • Die Partitionen sind nicht für 4096-Byte-Sektoren ausgerichtet. Gibt es ein Werkzeug, um sie auszurichten, abgesehen vom Kopieren in und aus einem anderen Laufwerk? (Ich habe keine Ersatzlaufwerke), oder muss ich ein Tool erstellen, mit dem die Daten Stück für Stück zur Seite verschoben werden? Partitionen sind ext3.

Vielen Dank!

Aktualisieren:

In dieser Frage habe ich herausgefunden, dass es eine clevere Möglichkeit gibt, die Partition mit dd an die richtige Stelle zu verschieben: Wie verschiebe ich eine Partition unter GNU/Linux? Aber Ich weiß allerdings nicht, ob es auf einem Sektorabschnitt funktionieren wird. Ich kann es momentan nicht testen, werde es aber tun, wenn ich etwas Zeit habe.

Update 2:

Also habe ich die Partition mit der obigen Methode erfolgreich ausgerichtet und den MBR auf einem Hex-Editor von Hand bearbeitet. Sobald ich die Festplatte wieder eingesteckt habe, wird die Boom Partition automatisch gemountet! Ich kann dies jedoch nicht empfehlen, da während des Vorgangs E/A-Fehler aufgetreten sind und ich möglicherweise alles verloren habe (siehe Kommentar zu Rods Antwort). Für die andere Partition gehe ich kein Risiko ein und verwende eine alte Festplatte und richte Blöcke nacheinander aus, indem ich die Daten kopiere und sie dann an einer anderen Position wieder einfüge.

23

Branchenprobleme werden immer komplexer. Bis Ende 2009 verwendete die überwiegende Mehrheit der Festplatten 512-Byte-Sektoren, und das war es auch. Ende 2009 begannen die Festplattenhersteller, sogenannteAdvanced Format(AF) -Datenträger einzuführen, die 4096-Byte-Sektoren verwenden. Diese ersten AF-Festplatten (und, AFAIK, heute alle AF-Festplatten) bieten eine Schnittstelle zum Computer, die jeden 4096-Byte-Sektorphysicalals in acht 512-Sektoren aufgeteilt anzeigt. BytelogischSektoren. Durch diese Konvertierung können ältere Tools, einschließlich vieler BIOSes, die mit 512-Byte-Annahmen erstellt wurden, weiterhin ausgeführt werden. Ich weiß nicht, ob Ihre Festplatte AF verwendet oder nicht, aber in beiden Fällen wird mit ziemlicher Sicherheit eine logische Sektorgröße von 512 Byte verwendet, was bedeutet, dass die Schnittstelle zum Betriebssystem 512-Byte-Sektoren verwenden sollte.

Komplizierende Faktoren sind bestimmte USB-Festplattengehäuse. Einige dieser Gehäuse machen das Gegenteil von dem, was AF macht: Sie nehmen acht Plattensektoren und bündeln sie in einen neuen 4096-Byte-Sektor. Ich bin mir nicht sicher, was die Gründe für diesen Schritt sind, aber ein praktischer Vorteil ist, dass Festplatten, die größer als 2 TB sind, mit dem alten MBR-Partitionierungssystem verwendet werden können. Ein großer Nachteil ist, dass eine in einem dieser Gehäuse partitionierte Festplatte nicht direkt oder in einem Gehäuse verwendet werden kann, in dem diese Art der Übersetzung nicht möglich ist. Ebenso kann eine ohne diese Übersetzung vorbereitete Festplatte nicht verwendet werden, wenn sie in ein solches Gehäuse übertragen wird. Beachten Sie, dass dieses Problem weit über den MBR hinausgeht. Ihre Festplatte erkennt die erste Partition möglicherweise als den Beginn des Sektors 2048 (512 Byte). Wenn Ihr Betriebssystem jedoch den Sektor 2048 (4096 Byte) sucht, wirdnotIch finde den Anfang dieser Partition! Sie sind auf dieses Problem gestoßen. Daher ist Ihre anfängliche Annahme, dass es der Fehler des USB-Gehäuses ist, näher an der Marke als Ihre neuere Annahme, dass Ihr Motherboard es durcheinander gebracht hat. Ich habenievon 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 Idee der Sektorgröße anzupassen, aber wenn Sie über genügend Festplattenspeicher verfügen, kann es hilfreich sein, eine einfache Kopie auf eine andere Festplatte zu erstellen. Zum Beispiel:

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

Dies kopiert Ihre Festplatte von /dev/sdb (der USB-Festplatte; passen Sie sie nach Bedarf an) in die Datei ~/image.img. Sie können dann das folgende Skript verwenden, um die Partitionen des Images bereitzustellen:

#!/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 als mount_image und verwenden Sie es folgendermaßen:

./mount_image ~/image.img 2 /mnt

Dadurch wird Partition 2 von image.img in /mnt eingebunden. Beachten Sie, dass das Skript auf GPT fdisk (gdisk) basiert, die die meisten Distributionen in einem Paket mit dem Namen gptfdisk oder gdisk enthalten.

Auf lange Sicht besteht eine bessere Lösung darin, einen Weg zu finden, um die Festplatte anzuschließen, die die Übersetzung in Sektorgröße nicht durchführt. Eine direkte Verbindung zu einem neuen Motherboard sollte den Trick tun. oder Sie können wahrscheinlich ein externes Gehäuse finden, das die Übersetzung nicht durchführt. In der Tat führen einige Gehäuse die Übersetzung an USB-Anschlüssen durch, jedoch nicht an eSATA-Anschlüssen. Wenn Ihr Gehäuse über einen eSATA-Anschluss verfügt, können Sie dies versuchen. Mir ist klar, dass diese Lösungen wahrscheinlich alle Geld kosten, was Sie sagen, dass Sie nicht haben, aber vielleicht können Sie Ihre Übersetzungsbeilage gegen eine eintauschen, die die Übersetzung nicht macht.

Eine andere Option, die mir einfällt, ist die Verwendung einer virtuellen Maschine wie VirtualBox. Ein solches Tool kann eine Sektorgröße von 512 Byte annehmen, wenn auf das Plattengerät zugegriffen wird, wodurch die Übersetzung effektiv rückgängig gemacht wird. Möglicherweise können Sie den unformatierten Inhalt der Festplatte (wie in dd if=/dev/sdc of=/dev/sdb) innerhalb der virtuellen Maschine kopieren, wodurch der Inhalt unter Umständen komprimiert wird und das Image auf weniger Speicherplatz passt, als das Original benötigt.

24
Rod Smith

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 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
4
user302662

Ein anderer, recht einfacher Weg, dies zu tun, ist die Verwendung der Rettungsfunktion von parted. Hierfür müssen Sie jedoch ein neues Plattenetikett erstellen, was mit Risiken verbunden ist. Parted wird direkt auf der Festplatte ausgeführt. Erstellen Sie daher bei Bedarf Backups, bevor Sie Parted ausführen. Dann fang an:

parted /dev/sdb

parted sagt Ihnen etwas in diese Richtung, wenn Sie versuchen, eine Festplatte mit einer anderen Sektorgröße als der zu lesen, mit der die Partitionstabelle erstellt wurde:

Error: /dev/sdb: unrecognised disk label                                  

Verwenden Sie mklabel, um einen neuen MBR oder eine neue GPT gemäß Ihrer vorherigen Verwendung zu erstellen

(parted) mklabel
New disk label type? mbr

Führen Sie dann rescue aus, um Ihre alte Partition zu finden

(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

Wiederholen Sie den Rettungsvorgang, wenn Sie mehr Partitionen haben. Sie sind jetzt fertig.

3
Johan Ehnberg

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 und 8 versetzt
  2. die MBR-Partitionstabelle kann nicht mehr als 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 so, dass 512-Byte-Sektoren verwendet werden.

In meinem Fall begann die Partition mit einem Versatz von 1 MB und endete (~ 856 kB) vor dem Ende der Festplatte. Dies ist gut, da dann MBR + GPT (17408 Bytes) vor der Partition und GPT-Backup (16896 Bytes) am Ende des Datenträgers zulässig sind.

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

Ich habe 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 wie bisher vorgehen und den Ausrichtungswert in 8 (4096) ändern, um so viel Platz wie möglich zu belegen. Dann habe ich eine neue Partition mit dem Start um 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.

3
Duane