Konwersja tablicy partycji MS-DOS na GPT
Spis treści
Od jakiegoś czasu nosiłem się z zamiarem utworzenia na swoim dysku tablicy partycji GPT. Problem w tym, że tam jest wgranych sporo cennych danych i nie mam gdzie ich przenieść. Jedyne co mi wpadło do głowy to konwersja tablicy MS-DOS (zwanej też MBR) na GPT. Nie żebym jakoś tego potrzebował ale tak z ciekawości chciałem zobaczyć czy da się to zrobić w sposób łatwy i bezproblemowy. Z tego co wyczytałem na necie, to taka konwersja nie powinna sprawić problemów, zarówno przy przechodzeniu z MS-DOS na GPT jak i odwrotnie, choć w tym drugim przypadku trzeba się trochę bardziej wysilić.
Struktura GPT
Do celów testowych wykorzystam mój stary dysk, na którym to są obecne 4 partycje, w tym jedna rozszerzona, na której to zostały ulokowane dwa dyski logiczne:
Tak z kolei wygląda dysk widziany oczami parted
, z tym, że z uwzględnieniem wolnych przestrzeni:
(parted) print free
Model: WDC WD80 0JB-00JJA0 (scsi)
Disk /dev/sdb: 156299375s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
63s 2047s 1985s Free Space
1 2048s 78125055s 78123008s primary ext4 boot
2 78125056s 99096575s 20971520s primary ext4
3 99096576s 156299263s 57202688s extended
5 99098624s 128458751s 29360128s logical ext4
6 128460800s 156299263s 27838464s logical ext4
156299264s 156299374s 111s Free Space
By przeprowadzić bezproblemowo konwersję tablicy partycji MS-DOS na GPT, trzeba mieć troszeczkę wolnego miejsca na początku i na końcu dysku. Ile? Struktura GPT wygląda tak jak na rysunku poniżej (zaczerpnięty z wiki):
Mamy tam zatem po jednym sektorze na MBR oraz nagłówek GPT, oraz 32 sektory na tablicę partycji.
Łącznie daje to 34 sektory 512 bajtowe, co przekłada się na 17408
bajtów wolnego miejsca na
początku dysku. Jak możemy zaobserwować, struktura tablicy partycji GPT ma jeszcze backup swojej
zawartości, który jest zlokalizowany na końcu dysku i w jego skład wchodzi kopia głównej tablicy
partycji (32 sektory) oraz kopia nagłówka (1 sektor). Łącznie 33 sektory co daje 16896
bajtów
potrzebnego miejsca na końcu dysku.
Obecnie większość narzędzi tworzących partycje na dysku ustawia równanie do 1MiB co przekłada się na
2048 wolnych sektorów na początku dysku, więc tutaj nie powinno być problemów ze spełnieniem wymagań
stawianych przez tablicę partycji GPT. W moim przypadku, jak widać powyżej, zostało 111 sektorów
wolnego miejsca na końcu dysku, co daje 56832
bajtów. Także u mnie wszystko jest w porządku. W
przypadku jednak gdyby jakaś partycja wypełniła dysk do samego końca, trzeba będzie ją skrócić.
Konwertowanie tablicy partycji na GPT
By dokonać konwersji tablicy partycji, odpalamy narzędzie gdisk
podając w argumencie ścieżkę do
dysku:
# gdisk /dev/sdb
GPT fdisk (gdisk) version 1.0.0
Partition table scan:
MBR: MBR only
BSD: not present
APM: not present
GPT: not present
***************************************************************
Found invalid GPT and valid MBR; converting MBR to GPT format
in memory. THIS OPERATION IS POTENTIALLY DESTRUCTIVE! Exit by
typing 'q' if you don't want to convert your MBR partitions
to GPT format!
***************************************************************
Jak widać wyżej, gdisk
wykrył, że ma do czynienia z tablicą partycji MS-DOS oraz poinformował nas,
że dokonał jej konwersji na GPT, z tym, że zmiany póki co są dokonane jedynie w pamięci operacyjnej.
Jeśli chcemy je wprowadzić w życie, wpisujemy w
:
Command (? for help): w
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!
Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sdb.
The operation has completed successfully.
Sprawdzamy, czy faktycznie tablica partycji uległa zmianie:
# gdisk /dev/sdb
GPT fdisk (gdisk) version 1.0.0
Partition table scan:
MBR: protective
BSD: not present
APM: not present
GPT: present
Found valid GPT with protective MBR; using GPT.
Czyli proces bez problemu się zakończył. Rzućmy jeszcze okiem na to jak wygląda struktura partycji w
gparted
:
Są widoczne jakieś dwie dziury. Może parted
nam coś więcej podpowie:
(parted) print free
Model: WDC WD80 0JB-00JJA0 (scsi)
Disk /dev/sdb: 156299375s
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
34s 2047s 2014s Free Space
1 2048s 78125055s 78123008s ext4 Linux filesystem
2 78125056s 99096575s 20971520s ext4 Linux filesystem
99096576s 99098623s 2048s Free Space
5 99098624s 128458751s 29360128s ext4 Linux filesystem
128458752s 128460799s 2048s Free Space
6 128460800s 156299263s 27838464s ext4 Linux filesystem
156299264s 156299341s 78s Free Space
Te dziury są w miejscach gdzie zaczynały się dyski logiczne partycji rozszerzonej. Jest to wynikiem
równania do 1MiB (2048 sektorów). Można te przestrzenie pokasować przez rozszerzenie partycji i
rozciągnięcie systemu plików, w tym przypadku EXT4. Można też zauważyć, że ilość wolnego
miejsca na początku i końcu dysku uległa zmianie. Trzeba jednak pamiętać, że po zmianie partycji
zostaną wygenerowane nowe numerki UUID, co pociąga za sobą edycję i dostosowanie pliku
/etc/fstab
. W przeciwnym razie system się nie odpali. Trzeba także wyznaczyć osobną partycję na
kod bootloader'a o rozmiarze minimum 1MiB, najlepiej dać tam 128MiB. Ważne jest by ta partycja miała
ustawioną flagę bios_grub
. Ja wyciąłem ten kawałek z pierwszej partycji. Cały układ powinien
zatem wyglądać tak jak na obrazku poniżej:
Jeśli na dysku mieliśmy system operacyjny, to trzeba także przeinstalować bootloader przy pomocy środowiska chroot, najlepiej z poziomu [systemu live].