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

23

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öst, einen sehr guten Hintergrund zum Problem der Sektorgröße liefert und mir die Gewissheit gibt, 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 im 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 Gehäuse 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 der folgenden Frage habe ich herausgefunden, dass es eine clevere Möglichkeit gibt, mit dd die Partition direkt zu verschieben: Wie verschiebe ich eine Partition unter GNU / Linux? Aber ich weiß 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 Auslegerpartition automatisch montiert! 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 die Blöcke nacheinander aus, indem ich die Daten kopiere und sie dann wieder an einer anderen Position einfüge.

Nichts ist unmöglich
quelle
Ich weiß es nicht, aber eine Bemerkung klingt so, als könnten Sie Unterricht in der Funktionsweise von Computern geben! (und wenn es dann hilft, das Problem zu lösen, kaufen Sie eine andere Festplatte mit dem Geld)
Barlop
@barlop Danke! Aber ich muss meinen Tag bereits zwischen meinem Job und dem College aufteilen, so dass ein zweiter Job momentan nicht möglich ist;) Ich muss diese Partitionen auf die harte
Tour
1
MANN ES IST 6 UHR UND ICH HABE DIE LETZTE NACHT UM DIESES PROBLEM VERBRINGT!
Leonel
1
Ok, ich habe das gegenteilige Problem: Ich habe eine 1-TB-Festplatte, die mit dem Gehäuse formatiert wurde. Es wurde also mit 4096 Bytes pro Sektoradressen formatiert. Ich kann den MBR nicht bequem von Hand bearbeiten. Und ich muss die Festplatte direkt auf SATA (512 Byte pro Sektor) verwenden. Irgendwelche Vorschläge?
Leonel
1
@Leonel Sie können fdiskden MBR unter Linux bearbeiten (das habe ich später erfahren, es sind keine Hex-Editoren erforderlich :)). Sie können den Startpunkt und die Größe jedes Eintrags ändern und die Änderungen überprüfen, bevor Sie sie anwenden. Also: Start fdisk, notieren Sie sich die aktuelle Konfiguration (oder sichern Sie den MBR mit dd), multiplizieren Sie die Werte für Startadresse und Größe mit 8 und ändern Sie sie. Überprüfen Sie alles mit einem Taschenrechner und verstehen Sie, was die Werte bedeuten. Sie werden sehen, dass Size = End - Start + 1 ist und dass fdiskdie Größe in Einheiten von 1000 Sektoren angezeigt wird. Daher müssen Sie möglicherweise den Expertenmodus aktivieren, um den tatsächlichen Wert usw. zu sehen.
NothingsImpossible

Antworten:

24

Fragen der Branchengröße werden immer komplexer. Bis Ende 2009 verwendete die überwiegende Mehrheit der Festplatten 512-Byte-Sektoren, und das war es auch. Ende 2009 begannen die Plattenhersteller mit der Einführung von sogenannten Advanced Format (AF) -Datenträgern, die 4096-Byte-Sektoren verwenden. Diese ersten AF-Festplatten (und AFAIK, heute alle AF-Festplatten) bieten eine Schnittstelle zum Computer, auf der jeder physikalische Sektor mit 4096 Byte in acht logische Sektoren mit 512 Byte aufgeteilt ist. Diese Konvertierung ermöglicht, dass ältere Tools, einschließlich vieler BIOSes, die mit 512-Byte-Annahmen erstellt wurden, weiterhin funktionieren. 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 mit einer Größe von mehr als 2 TB mit dem alten MBR-Partitionierungssystem verwendet werden können. Ein großer Nachteil besteht darin, 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), aber wenn Ihr Betriebssystem den Sektor 2048 (4096 Byte) verwenden würde,Finde den Anfang dieser Partition! Sie sind auf dieses Problem gestoßen. Als solches 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 habe noch nie 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 Idee der Sektorgröße anzupassen, aber wenn Sie über genügend Speicherplatz verfügen, kann es hilfreich sein, eine einfache Kopie auf eine andere Festplatte zu erstellen. Zum Beispiel:

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

Dadurch wird Ihre Festplatte von /dev/sdb(der USB-Festplatte; passen Sie sie nach Bedarf an) in die Datei kopiert ~/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 wie folgt mount_imageund verwenden Sie es:

./mount_image ~/image.img 2 /mnt

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

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 finden wahrscheinlich ein externes Gehäuse, 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 Ihr Übersetzungsgehäuse gegen eines eintauschen, das die Übersetzung nicht durchführt.

Eine andere Option, die mir einfällt, ist die Verwendung einer virtuellen Maschine wie VirtualBox. Solch ein Tool könnte 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 des Datenträgers (wie in dd if=/dev/sdc of=/dev/sdb) innerhalb der virtuellen Maschine kopieren, wodurch der Inhalt möglicherweise mit Komprimierung kopiert wird und das Image weniger Speicherplatz beansprucht als das Original.

Rod Smith
quelle
Sehr aufschlussreiche Antwort, aber nicht ganz das, wonach ich gesucht habe. Ich habe die Methode der virtuellen Maschine bereits ausprobiert, aber die Übersetzung wurde nicht rückgängig gemacht. Ich bin gerade zu Hause angekommen und werde versuchen, die erste Partition (eine kleinere, weniger wichtige) mit dd auszurichten und über Nacht laufen zu lassen. Bei Erfolg werde ich versuchen, den MBR von Hand zu bearbeiten, wenn niemand eine Antwort gibt.
Nichts
4
Versuchen Sie NICHT , den Inhalt der Festplatte über zu änderndd! Wenn Sie nicht sehr vorsichtig sind und die Dinge nicht sehr gutverstehen(oder außerordentlich viel Glück haben), ist es wahrscheinlicher, dass Sie das Problem in den Müll werfen, als es zu beheben. Mir fällt ein, dass Sie möglicherweise die Partitionstabelle anpassen können, indem SiefdiskFolgendesverwenden: Sichern Sie das Original und teilen Sie dann den Startpunkt jeder Partition durch 8 (und legen Sie die Endpunkte so fest, dass sie kurz vor dem Startpunkt der folgenden Partition enden). Dies hat nur dann eine Chance, wenn die Startpunktwerte der Partition ein Vielfaches von 8 sind.
Rod Smith,
1
Heilige Kuh! Danke für die Information. Ich habe seit einem Tag versucht, meine Mac / Windows-Festplatte auf eine SSD zu klonen, und konnte das Problem endlich identifizieren: Der Rosewill SATA / IDE auf USB-Adapter, den ich zum Anschließen der SSD verwendete, führte diese "Umkehrkonvertierung" durch "auf 4096-Byte-Sektoren! Daher sah der GPT + Hybrid MBR auf der SSD nach einem ddKlon aus, der über USB angeschlossen war, und ich dachte, der Klon sei fehlgeschlagen. Aber als ich die SSD anstelle meiner alten Festplatte direkt mit meinem Motherboard verband, funktionierte alles einwandfrei!
Eliot
1
Mein vorheriger Kommentar kann nicht bearbeitet werden, aber das Ausrichtungswerkzeug ist in diesem Fall unbrauchbar. Es dient nur Optimierungszwecken. Beachten Sie jedoch, dass Sie TestDisk verwenden können, und drücken Sie nach einem genaueren Scan P, um die Dateien aufzulisten und den Inhalt Ihrer Disc wiederherzustellen (auf diese Weise habe ich meine Daten wiederhergestellt, aber ich habe keine Möglichkeit gefunden, den Byte-Sektor zu korrigieren dieser Tag...).
Gaborous
1
Eine interessante Lektüre, die das Problem bestätigt und einen Hinweis auf die Lösung gibt (Emulation der Bridge-Übersetzung über ein Linux-Loopback-Gerät): goughlui.com/2013/10/02/… und this askubuntu.com/questions/337693/… . Und als zusätzliche Anmerkung habe ich auch versucht, die logische Größe mit Nachdruck so zu bearbeiten, dass sie der physischen Größe entspricht, aber das Laufwerk wurde immer noch nicht erkannt. Aber das Formatieren behebt das Einhängen, aber die Dateien gehen natürlich verloren, also stellen Sie sie besser vorher per Loopback-Einhängen oder Testdisk wieder her.
Gaborous
4

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
user302662
quelle
Whoa! Gute Arbeit!
NothingsImpossible
3

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, mit der die Partitionstabelle erstellt wurde, zu lesen:

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.

Johan Ehnberg
quelle
1
Dies funktionierte perfekt für mich, um meine Partitionstabelle von mbr nach gpt zu konvertieren. Auf diese Weise konnte ich eine geklonte 2-TB-Festplatte auf 4 TB erweitern. Ein bisschen nervös, wenn ich meine Trennwand dort hängen lasse, aber das geht so viel schneller als bei anderen Methoden.
OregonTrail
3

Ich hatte dieses Problem, als ich eine 4-TB-Festplatte aus einem externen Gehäuse von WD My Book 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-Datei 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 notiert fdisk -l /dev/sde.

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.

Duane
quelle