Notatki z partycjonowania dysków, cz.1 - fdisk
Linux

Notatki z partycjonowania dysków, cz.1 - fdisk

Spis treści

Żeby móc wykorzystać dysk w systemie operacyjnym, najpierw musi być przygotowany. Oto moje notatki z obsługi programu fdisk do partycjonowania dysków w Linuxie.

Testowy dysk

Żeby nie ruszać żadnego fizycznego dysku, do zabawy z partycjonowaniem chcę użyć pliku obrazu dysku, zamontowanego jako urządzenie blokowe.

Najpierw tworzę plik o określonym rozmiarze, np. 1Gb:

truncate -s 1G fake_disk.img

Lokalizacja pliku dowolna, w moim przypadku jest to /home/andrzej/testing/fake_disk.img.

W następnej kolejności trzeba zamontować plik jako urządzenie blokowe. Używam losetup do utworzenie urządzenia typu loop:

sudo losetup --find --show /home/andrzej/testing/fake_disk.img

W odpowiedzi dostaję nazwę urządzenia, np. /dev/loop0. Jeżeli potrzebuję wyświetlić wszystkie urządzenia loop, mogę użyć:

losetup -a

Dostaję wtedy listę urządzeń loop, wraz z plikami które są przez nie zamontowane.

Partycjonowanie fdisk

Dobra, to mając już gotowy dysk do zabawy, mogę zacząć partycjonowanie. Zacznę od fdisk, ponieważ jest prostszy w obsłudze, i służy do podstawowych operacji.

Jedna partycja na cały dysk

Zacznijmy od prostego przypadku: jedna partycja na całym dysku.

sudo fdisk /dev/loop0

Na całkowicie czystym pliku widzę, że nie zawiera on żadnej tablicy partycji:

Welcome to fdisk (util-linux 2.37.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x5f9d5e8b.

Command (m for help):

A przy okazji wszedłem do trybu interaktywnego.

Za pomocą opcji m można pokazać pomoc (przydaje się).

Za pomocą dwóch opcji: g oraz n tworzę tablicę partycji typu GPT i jedną partycję na całym dysku.

Przez F wyświetlam co zrobiłem do tej pory:

Command (m for help): F
Unpartitioned space /dev/loop0: 1022.98 MiB, 1072676352 bytes, 2095071 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes

Start     End Sectors  Size
 2048 2097118 2095071 1023M

Opcją p mogę wyświetlić aktualną tablicę partycji:

Command (m for help): p
Disk /dev/loop0: 1 GiB, 1073741824 bytes, 2097152 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 1FD9AAE4-C2EB-E647-A737-A3C2D36DD6F8

A następnie v sprawdzić czy jest wszystko w porządku.

Command (m for help): v
No errors detected.
Header version: 1.0
Using 0 out of 128 partitions.
A total of 2095071 free sectors is available in 1 segment.

Brak błędów, więc zapisuję partycję na dysku przez w:

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Re-reading the partition table failed.: Invalid argument

The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or partx(8).

I błąd.

Ale chwila. Przecież fdisk wypisał, że tablica została zmodyfikowana. Sprawdźmy czy faktycznie tak jest:

$ sudo fdisk -l /dev/loop0
Disk /dev/loop0: 1 GiB, 1073741824 bytes, 2097152 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: B50E488E-A665-4041-B257-AFD42B8EDAE8

Device       Start     End Sectors  Size Type
/dev/loop0p1  2048 2097118 2095071 1023M Linux filesystem

Po dłuższej chwili szukania, udało mi się znaleźć, że błąd był spodowowany tym, że kernel nie mógł odczytać tablicy partycji, a dostał takie polecenie po jej zmodyfikowaniu.

Prawdopodobnie jest to kwestia samego urządzenia loop.

Po utorzeniu partycji, standardowo spodziewam się pojawienia nowego urządzenia w katalogu /dev, np. /dev/loop0p1. Niestety nie pojawiło się ono.

$ ls /dev | grep loop0
loop0

Powód? Znowu urządzenie loop. Żeby to naprawić, odmontowuję loop0 i montuje je ponownie, dodając przełącznik --partscan:

sudo losetup -d /dev/loop0
sudo losetup --find --show --partscan /home/andrzej/testing/fake_disk.img

Następnie sprawdzam katalog /dev:

$ ls /dev | grep loop0
loop-control
loop0
loop0p1

Tym razem wszystko okej, cel osiągnięty.

Wiele partycji na dysku

Zrealizuję dwa scenariusze:

  • dwie partycje po 512Mb każda
  • trzy partycje: 256Mb, 512Mb i reszta dysku

Dwie partycje po 512Mb

W katalogu roboczym tworzę nowy plik o rozmiarze 1Gb i montuję go jako urządzenie loop:

truncate -s 1G fake_disk_2.img
sudo losetup --find --show --partscan fake_disk_2.img

Zamontowane urządzenie ma identyfikator: /dev/loop1. Teraz tworzymy partycje:

sudo fdisk /dev/loop1

Za pomocą opcji g tworzę tabliće partycji GPT, a następnie n tworzę partycję nr. 1 o rozmiarze 512mb:

Command (m for help): g
Created a new GPT disklabel (GUID: F800D377-953A-5243-8193-47D19A066CA6).

Command (m for help): n
Partition number (1-128, default 1): 1
First sector (2048-2097118, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-2097118, default 2097118): +512M

Created a new partition 1 of type 'Linux filesystem' and of size 512 MiB.

Następnie druga partycja zajumjąca resztę dysku:

Command (m for help): n
Partition number (2-128, default 2): 2
First sector (1050624-2097118, default 1050624):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (1050624-2097118, default 2097118):

Created a new partition 2 of type 'Linux filesystem' and of size 511 MiB.

Zapisuję partycje na dysku przez w:

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

Przy okazji, wygląda na to, że --partscan rozwiązuje wcześniejszy problem z odczytem talbicy przez kernel. Super.

Sprawdzam /dev/:

$ ls /dev | grep loop1
loop1
loop1p1
loop1p2

Wszystko się zgadza.

Trzy partycje

Pierwotnie, chciałem to zrelaizować na osobnym pliku obrazu, ale skoro mamy już dysk z dwiema partycjami, to żeby było ciekawiej, zmodyfikuję go.

Dysk jest zamontowany, więc przechodzę od razu do fdisk:

sudo fdisk /dev/loop1

fdisk nie posiada opcji modyfikacji istniejących partycji, więc najpierw usuwam te już istniejące:

Command (m for help): d
Partition number (1,2, default 2): 2

Partition 2 has been deleted.

Command (m for help): d
Selected partition 1
Partition 1 has been deleted.

Następnie sprawdzam aktualną tablicę:

Command (m for help): p
Disk /dev/loop1: 1 GiB, 1073741824 bytes, 2097152 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: F800D377-953A-5243-8193-47D19A066CA6

Command (m for help): i
No partition is defined yet!

W porządku, mamy czystą tablicę GPT. Teraz ponowanie tworzę partycje:

  • nr 1 - 256Mb
  • nr 2 - 512Mb
  • nr 3 - reszta dysku
Command (m for help): n
Partition number (1-128, default 1): 1
First sector (2048-2097118, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-2097118, default 2097118): +256M

Created a new partition 1 of type 'Linux filesystem' and of size 256 MiB.

Command (m for help): n
Partition number (2-128, default 2):
First sector (526336-2097118, default 526336): +512M
Value out of range.
First sector (526336-2097118, default 526336):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (526336-2097118, default 2097118): +512M

Created a new partition 2 of type 'Linux filesystem' and of size 512 MiB.

Command (m for help): n
Partition number (3-128, default 3): 3
First sector (1574912-2097118, default 1574912):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (1574912-2097118, default 2097118):

Created a new partition 3 of type 'Linux filesystem' and of size 255 MiB.

Sprawdzam tablicę partycji:

Command (m for help): p
Disk /dev/loop1: 1 GiB, 1073741824 bytes, 2097152 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: F800D377-953A-5243-8193-47D19A066CA6

Device         Start     End Sectors  Size Type
/dev/loop1p1    2048  526335  524288  256M Linux filesystem
/dev/loop1p2  526336 1574911 1048576  512M Linux filesystem
/dev/loop1p3 1574912 2097118  522207  255M Linux filesystem

Wszystko się zgadza, więc zapisuję zmiany, i sprawdzam katalog /dev:

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

$ ls -la /dev | grep loop1
brw-rw----  1 root disk      7,   1 Jul 15 12:50 loop1
brw-rw----  1 root disk    259,   6 Jul 15 12:50 loop1p1
brw-rw----  1 root disk    259,   7 Jul 15 12:50 loop1p2
brw-rw----  1 root disk    259,   8 Jul 15 12:50 loop1p3

Partycje ponownie są widoczne.

Żeby wszystko było całkowicie zgodnie ze sztuką, po zakończeniu partycjonowania odmontowuję wszystkie urządzenia loop:

sudo losetup -D

Podsumowanie

Fdisk to bardzo proste narzędzie do partycjonowania. Nie poruszyłem tutaj wszystkich możliwych opcji, ale do podstawowych operacji, nie potrzeba więcej.

Dodatkowym plusem jest to, że bardzo ciężko jest tutaj coś zepsuć.

W kolejnej części opiszę narzędzie parted które jest bardziej zaawansowane.