MBR, EBR i tablica partycji dysku twardego

Spis treści

MBR to pierwszy sektor dysku twardego, który może ma jedynie 512 bajtów ale jest to bardzo krytyczny obszar nośnika, po którego uszkodzeniu czy nadpisaniu tracimy dostęp do wszystkich partycji znajdujących się na dysku. Ci bardziej przezorni użytkownicy robią sobie backup tego kluczowego punktu, tak by w przypadku problemów mogli go sobie przywrócić. Nie zawsze jednak potrzebujemy przywracać cały sektor MBR, w większości przypadków będziemy potrzebować jedynie kodu bootloadera lub samej tablicy partycji.

Struktura MBR i EBR

Jak już nadmieniłem we wstępie, MBR ma 512 bajtów długości, z czego pierwsze 446 bajtów zajmuje program rozruchowy (bootloader). Druga część MBR, to tablica partycji i zwykle zawiera 1-4 pozycje opisujące poszczególne partycje podstawowe. Każdy wpis ma 16 bajtów, razem 64 bajty. Na końcu MBR znajdują się 2 bajty sygnatury rozruchu. W sumie daje to 512 bajtów. Poniżej milusia fotka (źródło) przestawiająca strukturę MBR, na wypadek gdyby ktoś miał problemy z wyobraźnią:

struktura-mbr

Wraz ze wzrostem pojemności dysków i zapotrzebowaniem na kolejne partycje, pojawił się problem ograniczenia ich liczby jedynie do 4. Jako tymczasowe rozwiązanie zaproponowano EBR , który znalazł wykorzystanie w przypadku partycji rozszerzonej, na której można ulokować dowolną liczbę dysków logicznych. EBR również posiada 512 bajtów i praktycznie niczym nie różni się od MBR, za wyjątkiem sposobu działania. Rzućmy zatem okiem na poniższą fotkę (źródło):

struktura-mbr-ebr

Wyżej mamy rozrysowaną dokładnie partycję rozszerzoną. Jej wpis w MBR niczym nie różni się od pozostałych partycji podstawowych. Generalnie rzecz biorąc, to z punktu widzenia maszyny, ten powyższy dysk ma tylko 4 partycje. Mamy tam jednak 3 sektory EBR. Lokalizacja każdego z nich znajduje się zawsze w pierwszym sektorze logicznego dysku. Wyżej wspomniałem, że EBR niczym nie różni się od MBR, przynajmniej jeśli chodzi o strukturę. Gdybyśmy zajrzeli do środka EBR, to się okazuje, że miejsce na kod bootloadera (pierwsze 446 bajtów) jest niewykorzystywane, a ponadto, każdy EBR ma zaprogramowane linkowanie do następnego EBR -- taki swojego rodzaju łańcuch. I w powyższym przykładzie pozycja nr 8 linkuje do 11, a ta z kolei do 14. Jak one to robią? Za pomocą tablicy partycji, a konkretnie dwóch jej pozycji. Pierwsza z nich określa początkowy sektor i ich ilość (tak samo jak w przypadku tych podstawowych partycji), natomiast druga wskazuje położenie następnego sektora EBR, chyba, że jest to ostatni dysk logiczny, wtedy będzie zajmować 0 bajtów. A co linkuje do pierwszego dysku logicznego? Nic. On jest oznaczany przez partycję rozszerzoną, choć z technicznego punktu widzenia jest to partycja podstawowa.

Rzućmy okiem jeszcze na to co zwykle nam zwraca fdisk :

Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    45641727    22819840   83  Linux
/dev/sdb2        45641728    80166911    17262592   83  Linux
/dev/sdb3        80166912   104224767    12028928   83  Linux
/dev/sdb4       104224768   156299263    26037248    5  Extended
/dev/sdb5       104226816   119328767     7550976   83  Linux
/dev/sdb6       119330816   128720895     4695040   83  Linux
/dev/sdb7       128722944   156299263    13788160   83  Linux

W przypadku pierwszego dysku logicznego sdb5 , sektor EBR jest na pozycji parametru "start" partycji rozszerzonej sdb4. Natomiast w przypadku kolejnych dysków logicznych, sektor EBR znajduje się zaraz za końcem poprzedniej partycji. Między tymi dyskami logicznymi jest trochę wolnego miejsca. W przypadku równania do 1MiB, jest to 2048 sektorów, w tym 1 sektor na EBR. Jeśli byśmy wykonali kopię tej pozycji co jest w parametrze "start", skopiujemy pierwszy sektor systemu plików, a nie EBR. Zatem by mieć jasność, pierwszy sektor EBR jest na pozycji 104224768 , drugi na 119328768 i trzeci na 128720896 .

Backup MBR oraz tablicy partycji

Większość problemów z dyskiem czy pendrive dotyczy sfery programowej. Zatem nośnikowi niby nic nie dolega z fizycznego punktu widzenia, np. nie ma na nim uszkodzonych sektorów, ale z jakichś powodów nie możemy uzyskać dostępu do partycji na nim się znajdujących. Jeśli do tej pory nasz twardziel działa bez zarzutu, to przydałoby się zrobić backup całego sektora MBR oraz, w przypadku posiadania partycji rozszerzonej, kopi wpisów całej tablicy partycji. Wszystko sprowadza się do wydania tych dwóch poniższych poleceń:

# dd if=/dev/sdb of=./mbr bs=512 count=1
# sfdisk -d /dev/sdb > sdb_table

Trzeba jednak pamiętać, że zapisany sektor MBR nie posiada żadnych informacji na temat wszystkich sektorów EBR, a jedynie wskazuje na pierwszy z nich. Także jeśli z jakiegoś powodu nie będzie można odnaleźć kolejnego sektora EBR, część partycji może zaginąć.

Przywracanie MBR

Jak widzieliśmy wyżej na schemacie MBR, ten sektor składa się z dwóch części. Jeśli jakiś system operacyjny nam nadpisał kod bootloadera, to możemy tylko tę część MBR przywrócić.

# dd if=mbr of=/dev/sdb bs=446 count=1

W przypadku gdybyśmy chcieli przywrócić cały MBR, to wpisujemy poniższe polecenie:

# dd if=mbr of=/dev/sdb bs=512 count=1

Przywracanie tablicy partycji

Jeśli chodzi o samą tablicę partycji, to mamy dwa wyjścia. Pierwsze z nich zakłada wycięcie określonego obszaru z wcześniej utworzonego backupu sektora MBR i wklejenie go w odpowiednie miejsce na dysku przy pomocy:

# dd if=./mbr of=/dev/sdb bs=1 count=64 skip=446 seek=446

Drugie rozwiązanie polega na zaprzęgnięciu do pracy narzędzia sfdisk :

# sfdisk /dev/sdb < sdb_table

W taki oto sposób możemy zabezpieczyć się na wypadek programowego uszkodzenia dysku.

Mikhail Morfikov avatar
Mikhail Morfikov
Po ponad 10 latach spędzonych z różnej maści linux'ami (Debian/Ubuntu, OpenWRT, Android) mogę śmiało powiedzieć, że nie ma rzeczy niemożliwych i problemów, których nie da się rozwiązać. Jedną umiejętność, którą ludzki umysł musi posiąść, by wybrnąć nawet z tej najbardziej nieprzyjemniej sytuacji, to zdolność logicznego rozumowania.