Jak poprawić MBR sektora 512-bajtowego na dysku sektora 4096-bajtowym?

23

Ostatnia aktualizacja:

Wiedziałem już, co muszę zrobić, aby rozwiązać ten problem; Po prostu nie wiedziałem, jak to zrobić. Miałem nadzieję, że będzie jakieś gotowe narzędzie, które zrobi to automatycznie - ale nie znalazłem żadnego. Akceptuję odpowiedź Rod, ponieważ pomimo tego, że nie rozwiązałem bezpośrednio mojego problemu, daje on bardzo dobre podstawy na temat rozmiaru sektora i dał mi pewność, że tak naprawdę chodziło o wyrównanie partycji i rozwiązanie. Dla tych, którzy mają to samo zagadnienie, przeczytaj je dokładnie i uważnie, łącznie z komentarzami, zanim cokolwiek zrobisz.


Na początku

Miałem komputer i potrzebowałem więcej miejsca. Kupiłem nowy dysk 500 GB i obudowę USB. Wkrótce zauważyłem, że gdybym podzielił dysk na obudowę i przeniósł go do komputera, nie rozpoznałby partycji (i vice versa). Zakładałem, że to problem z obudową i nie martwiłem się o to.

Potem tragedia

Cudowny dzień, mój komputer postanowił już się nie włączać. Okazuje się, że płyta główna (niemarkowa, tylko wydrukowana na niej duża WYKONANA W CHINACH) jest martwa. Używałem go jako serwera plików i ten dysk 500 GB jest teraz pełen danych, których nie mogę stracić. Jestem teraz spłukany i nie stać mnie na nowy komputer, więc moją jedyną nadzieją była „wadliwa” obudowa USB.

Dochodzenie

Uzbrojony w kilka dystrybucji Linuksa, laptopa, VirtualBox i obudowę przeprowadziłem analizę kryminalistyczną tego problemu. dmesg zgłosił, że rozmiar partycji był poza końcem dysku. Przejrzałem więc arkusze danych dysku twardego, oblicziłem liczbę sektorów od zera, ręcznie przetestowałem granice dysku za pomocą dd i wszystko wyglądało OK, dopóki nie uruchomiłem fdisk i powiedział:

    Note: Sector size is 4096 (not 512).

Jak skromny z fdisk. Ta „notatka” była źródłem wszystkich problemów. Po dalszych drobiazgach wyciągnięto następujące wnioski:

  • Obudowa USB nie jest uszkodzona.

  • Kontroler SATA na martwej płycie głównej był tym, który był co najmniej „dziwny”. Nie zgłosił systemowi operacyjnemu 4096-bajtowych sektorów, więc system operacyjny z radością utworzył MBR przy użyciu 512-bajtowych adresów sektorów.

  • Teraz, gdy próbuję uzyskać dostęp do partycji, system operacyjny próbuje użyć adresów opartych na 512 bajtach na dysku sektorowym 4096 bajtów i oczywiście to nie zadziała.

Pytanie

  • W jaki sposób mogę poprawić adresy w MBR, aby były one poprawne dla rozmiaru sektora 4096 bajtów, oprócz ręcznej edycji MBR w edytorze szesnastkowym i

  • Partycje nie są wyrównane dla sektorów 4096 bajtów. Czy jest jakieś narzędzie do wyrównania ich oprócz kopiowania do i z innego napędu? (Nie mam zapasowych dysków), czy też muszę utworzyć jakieś narzędzie, które „przesuwa” dane na bok, po kawałku? Partycje to ext3.

Dzięki!

Aktualizacja:

Odkryłem, że istnieje sprytny sposób na użycie dd do przesunięcia partycji na miejscu w tym pytaniu: Jak przenieść partycję w GNU / Linux? Ale nie wiem, czy to zadziała na kawałku sektora. Nie mogę tego teraz przetestować, ale zrobię to, gdy będę miał trochę czasu.

Aktualizacja 2:

Udało mi się więc wyrównać partycję za pomocą powyższej metody i ręcznie edytować MBR w edytorze szesnastkowym. Po ponownym podłączeniu dysku twardego partycja wysięgnika jest automatycznie montowana! Nie polecam tego jednak, podczas procesu wystąpiły błędy We / Wy i mogłem wszystko stracić, patrz komentarz do odpowiedzi Rod. W przypadku drugiej partycji nie podejmę ryzyka i użyję starego dysku twardego i wyrównam porcje, kopiując dane, a następnie wklejając je z powrotem w innym miejscu.

Nic nie jest niemożliwe
źródło
nie wiem, ale uwaga - wygląda na to, że możesz dać lekcje na temat działania komputerów! (a jeśli to pomoże rozwiązać problem, kup inny dysk twardy za gotówkę)
barlop
@barlop Dzięki! Ale muszę już podzielić swój dzień między pracą a studiami, więc teraz druga praca jest teraz nie do przyjęcia;) Będę musiał naprawić te partycje na poważnie =)
NothingsImpossible
1
MĘŻCZYZNA, JEST 6 AM, A SPOTKAŁEM CAŁĄ OSTATNĄ NOC NA TYM PROBLEMIE!
Leonel,
1
Ok, więc mam odwrotny problem: mam dysk 1 TB sformatowany przy użyciu obudowy. Został więc sformatowany przy użyciu 4096 bajtów na adresy sektorów. Nie lubię ręcznie edytować MBR. I muszę używać dysku twardego bezpośrednio na SATA (512 bajtów na sektor) Jakieś sugestie?
Leonel,
1
@Leonel Możesz użyć Linuksa fdiskdo edycji MBR (dowiedziałem się tego później, nie ma potrzeby edytorów szesnastkowych :)) Możesz zmienić punkt początkowy i rozmiar każdego wpisu i przejrzeć zmiany przed zastosowaniem. Więc: zacznij fdisk, zanotuj bieżącą konfigurację (lub lepiej, wykonaj kopię zapasową MBR dd), pomnóż adres początkowy i wartości rozmiaru przez 8 i zmień je. Pamiętaj, aby sprawdzić wszystko za pomocą kalkulatora i zrozumieć, co oznaczają te wartości. Zobaczysz, że Rozmiar = Koniec - Początek + 1, i fdiskpokazuje rozmiar w jednostce 1000 sektorów, więc może być konieczne włączenie trybu eksperta, aby zobaczyć prawdziwą wartość itp.
NothingsImpossible

Odpowiedzi:

24

Problemy wielkości sektorów stają się dość złożone. Do końca 2009 r. Zdecydowana większość dysków twardych używała sektorów 512-bajtowych i tyle. Pod koniec 2009 r. Producenci dysków zaczęli wprowadzać tak zwane dyski Advanced Format (AF), które wykorzystują sektory 4096 bajtów. Te pierwsze dyski AF (i AFAIK, wszystkie dzisiejsze dyski AF) stanowią interfejs do komputera, który pokazuje każdy 4096-bajtowy sektor fizyczny jako podzielony na osiem 512-bajtowych sektorów logicznych . Dzięki tej konwersji starsze narzędzia, w tym wiele systemów BIOS, które zostały zbudowane przy założeniu 512 bajtów, mogą nadal działać. Nie wiem, czy twój dysk używa AF, czy nie, ale w każdym przypadku prawie na pewno używa 512-bajtowego rozmiaru sektora logicznego, co oznacza, że ​​interfejs do systemu operacyjnego powinien używać 512-bajtowych sektorów.

Komplikuje to pewne obudowy dysków USB. Niektóre z tych obudów robią odwrotność tego, co robi AF: biorą osiem sektorów dysku i łączą je w jeden nowy sektor 4096 bajtów. Nie jestem pewien, jakie jest uzasadnienie tego ruchu, ale jedną praktyczną zaletą jest to, że dyski większe niż 2 TB mogą być używane ze starym systemem partycjonowania MBR. Jedną z głównych wad jest to, że dysk podzielony na partycje w jednej z tych obudów nie może być używany bezpośrednio lub w obudowie, która nie wykonuje tego rodzaju tłumaczenia. Podobnie, dysk przygotowany bez tego tłumaczenia nie może być użyty, gdy zostanie przeniesiony do takiej obudowy. Zauważ, że ten problem wykracza daleko poza sam MBR; twój dysk może zidentyfikować pierwszą partycję jako rozpoczynającą się na sektorze (512 bajtów) 2048, ale jeśli twój system operacyjny będzie szukał sektora (4096 bajtów) 2048,znajdź początek tej partycji! Natrafiłeś na ten problem. W związku z tym twoja początkowa myśl, że to wina obudowy USB, jest bliższa znaku niż późniejsza myśl, że Twoja płyta główna popsuła go. Nigdy nie słyszałem o płycie głównej tłumaczącej w ten sposób rozmiar sektora. (Jednak niektóre sprzętowe urządzenia RAID to robią.)

Nie znam sposobu, aby zmusić Linuksa do dostosowania jego koncepcji wielkości sektora, ale jeśli masz wystarczającą ilość miejsca na dysku, pomocne może być skopiowanie dysku niskiego poziomu na inny dysk. Na przykład:

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

Spowoduje to skopiowanie dysku z /dev/sdb(dysku USB; dostosuj w razie potrzeby) do pliku ~/image.img. Następnie możesz użyć następującego skryptu, aby zamontować partycje obrazu:

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

Zapisz skrypt jako, powiedzmy, mount_imagei użyj go w następujący sposób:

./mount_image ~/image.img 2 /mnt

Spowoduje to zamontowanie partycji 2 image.imgna /mnt. Zauważ, że skrypt opiera się na fdisk ( gdisk) GPT , które większość dystrybucji zawiera w pakiecie o nazwie gptfdisklub gdisk.

W dłuższej perspektywie lepszym rozwiązaniem jest znalezienie sposobu podłączenia dysku, który nie wykona translacji wielkości sektora. Bezpośrednie połączenie z nową płytą główną powinno załatwić sprawę; lub prawdopodobnie możesz znaleźć zewnętrzną obudowę, która nie wykonuje tłumaczenia. W rzeczywistości niektóre obudowy wykonują tłumaczenie na portach USB, ale nie na portach eSATA, więc jeśli Twoja obudowa ma port eSATA, możesz spróbować tego użyć. Zdaję sobie sprawę, że wszystkie te rozwiązania mogą kosztować pieniądze, których, jak twierdzisz, nie masz, ale może możesz wymienić swoją szafę tłumaczeniową na taką, która nie wykonuje tłumaczenia.

Inną opcją, która przychodzi mi do głowy, jest próba użycia maszyny wirtualnej, takiej jak VirtualBox. Takie narzędzie może przyjmować rozmiar sektora 512-bajtowego podczas uzyskiwania dostępu do urządzenia dyskowego, skutecznie cofając tłumaczenie; lub możesz skopiować zawartość dysku na surowo (jak w dd if=/dev/sdc of=/dev/sdb) na maszynie wirtualnej, co może skopiować zawartość z kompresją, dzięki czemu obraz zmieści się na mniejszej ilości miejsca na dysku niż zużywa oryginał.

Rod Smith
źródło
Bardzo wnikliwa odpowiedź, ale nie do końca to, czego szukałem. Próbowałem już metody maszyny wirtualnej, ale nie cofnęło to tłumaczenia. Właśnie wróciłem do domu i spróbuję wyrównać pierwszą partycję (mniejszą, mniej ważną) za pomocą dd i pozwolić jej działać przez noc. Jeśli się powiedzie, spróbuję ręcznie edytować MBR, jeśli nikt nie udzieli odpowiedzi.
Nic nie można
4
NIE próbuj modyfikować zawartości dysku za pomocądd! O ile nie jesteś bardzo ostrożny i nie rozumiesz rzeczy wyjątkowo dobrze (lub masz wyjątkowe szczęście), istnieje większe prawdopodobieństwo, że coś wyrzucisz niż naprawisz. Przyszło mi do głowy, że możesz dostosować tabelę partycji za pomocąfdisk: Wykonaj kopię zapasową oryginału, a następnie podziel punkt początkowy każdej partycji przez 8 (i ustaw punkty końcowe na zakończenie tuż przed punktem początkowym następnej partycji). Ma to szansę tylko wtedy, gdy wszystkie wartości początkowe partycji są wielokrotnościami 8.
Rod Smith,
1
Święta krowa! Dzięki za informację. Przez jeden dzień próbowałem sklonować dysk twardy Mac / Windows na dysk SSD i wreszcie udało mi się zidentyfikować problem: adapter SATA / IDE na USB Rosewill, którego użyłem do podłączenia dysku SSD, przeprowadzał tę „konwersję wsteczną” „do sektorów 4096-bajtowych! Tak więc GPT + Hybrid MBR na SSD wyglądało jak bzdury po tym, jak zrobiłem z nim ddklon podczas połączenia przez USB, i pomyślałem, że klon się nie powiódł. Ale kiedy podłączyłem dysk SSD bezpośrednio do mojej płyty głównej zamiast mojego starego dysku twardego, wszystko działało dobrze!
Eliot
1
Nie mogę edytować mojego poprzedniego komentarza, ale narzędzie Wyrównaj jest w tym przypadku bezużyteczne, służy tylko do optymalizacji. Pamiętaj jednak, że możesz użyć TestDisk i po głębszym skanowaniu naciśnij P, aby wyświetlić listę plików i odzyskać zawartość dysku (w ten sposób odzyskałem swoje dane, ale nie znalazłem żadnego sposobu, aby naprawić sektor bajtów na ten dzień...).
gaboryczny
1
Ciekawym odczytu co potwierdza problem i podpowiedź w roztworze (emulacji tłumaczenie most za pośrednictwem urządzenia Linux sprzężenia zwrotnego): goughlui.com/2013/10/02/... i ten askubuntu.com/questions/337693/... . I jako dodatkowa uwaga, próbowałem również wymusić edycję rozmiaru logicznego, aby dopasować go do rozmiaru fizycznego, ale dysk wciąż nie został rozpoznany. Ale formatowanie go naprawia montaż, ale pliki są oczywiście tracone, więc lepiej je odzyskać przed montażem pętli zwrotnej lub dyskiem testowym.
gaboryczny
4

Ten skrypt uogólnił propozycję Rod Smitha, gdy masz nalot lub krypto. Bez gwarancji. Możesz to poprawić! (Zaktualizowany o najnowsze ustalenia dotyczące 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
użytkownik302662
źródło
Zaraz! Dobra robota!
NothingsImpossible
3

Innym, dość prostym sposobem na to jest użycie funkcji ratunkowej parted. Wymaga to jednak utworzenia nowej etykiety dysku, więc wiąże się to z ryzykiem. Parted działa bezpośrednio na dysku, więc wykonaj kopie zapasowe w razie potrzeby przed uruchomieniem parted. Następnie zacznij:

parted /dev/sdb

parted powie ci coś wzdłuż tych linii podczas próby odczytu dysku o innym rozmiarze sektora niż ten, z którym utworzono tablicę partycji:

Error: /dev/sdb: unrecognised disk label                                  

Użyj mklabel, aby utworzyć nowy MBR lub GPT zgodnie z tym, co wcześniej używałeś

(parted) mklabel
New disk label type? mbr

Następnie uruchom ratowanie, aby znaleźć starą partycję

(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

Powtórz proces ratowania, jeśli masz więcej partycji. Skończyłeś.

Johan Ehnberg
źródło
1
Pomogło mi to przekonwertować tabelę partycji z mbr na gpt. Robię to, aby móc rozszerzyć sklonowany dysk 2 TB do 4 TB. Trochę się denerwuję, zostawiając zawieszoną partycję, ale jest to o wiele szybsze niż inne metody.
OregonTrail
3

Miałem ten problem, gdy wyjąłem dysk 4 TB z zewnętrznej obudowy WD My Book. Problemem jest:

  1. tablica partycji MBR jest wyłączona 8 razy
  2. tablica partycji MBR nie może obsłużyć> 2 TB, gdy rozmiar sektora wynosi 512.

Rozwiązanie: Przepisz tabelę partycji do GPT, konwertując wartości na sektory 512-bajtowe.

W moim przypadku partycja rozpoczęła się z przesunięciem o 1 MB i zakończyła (~ 856kB) przed końcem dysku. Jest to dobre, ponieważ pozwoliło to na MBR + GPT (17408 bajtów) przed partycją i zapasowy GPT (16896 bajtów) na końcu dysku.

Zrobiłem zdjęcia obu regionów na wszelki wypadek (używając dd).

Zauważyłem wynik z fdisk -l /dev/sde.

Użyłem gdisk, aby usunąć pierwszą partycję. Jeśli chcesz, możesz zrobić tak jak ja i zmienić wartość wyrównania na 8 (4096), aby użyć jak największej ilości miejsca. Następnie utworzyłem nową partycję z początkiem 2048 i końcem na końcu dysku. Rozwijam system plików później.

Na szczęście zmiana rozmiaru sektora nie wpływa na system plików, LVM ani LUKS.

Duane
źródło