Zmiana rozmiaru partycji EXT4

Spis treści

Jeśli jeszcze nie dokonaliśmy migracji systemu plików z EXT2/3 na EXT4, to powinniśmy rozważyć tę kwestię z przyczyn czysto praktycznych. W tym wpisie nie będziemy sobie głowy zawracać migracją między poszczególnymi wersjami systemu plików z rodziny EXT, a raczej skupimy się na tym jak zmienić rozmiar partycji, której systemem plików jest właśnie EXT4. Bawienie się rozmiarem partycji w tym przypadku niczym zbytnio się nie różni w stosunku do omawianego wcześniej systemu plików NTFS. Będziemy wykorzystywać tylko nieco inne narzędzia.

Przygotowanie systemu plików EXT4

Procedura zmiany rozmiaru każdego systemu plików jest mniej więcej taka sama. Musimy posiadać partycję, a na niej system plików. Przed przystąpieniem do pracy, system plików należy odmontować i przeskanować go w poszukiwaniu ewentualnych błędów. Nie musimy instalować dodatkowych pakietów, bo wszystkie niezbędne narzędzia powinniśmy już mieć w systemie. System plików EXT4 skanujemy w poniższy sposób:

# fsck.ext4 -f -v /dev/sdb2

Zmniejszanie rozmiaru partycji EXT4

Jeśli chcemy skurczyć system plików do możliwe małego, to możemy użyć opcji -M . Z kolei, by ustalić najmniejszy możliwy rozmiar systemu plików na danej partycji, korzystamy z opcji -P . My jednak ustawimy określony rozmiar:

# resize2fs -p /dev/sdb2 10G
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/sdb2 to 2621440 (4k) blocks.
Begin pass 2 (max = 85252)
Relocating blocks             XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Begin pass 3 (max = 274)
Scanning inode table          XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Begin pass 4 (max = 430)
Updating inode references     XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
The filesystem on /dev/sdb2 is now 2621440 blocks long.

Cóż to jest te 2621440 bloków? To jest właściwy rozmiar systemu plików: 2621440*4096/1024/1024/1024=10GiB . Przy czym, rozmiar bloku (4096) może być inny, w zależności od wielkości partycji. Rozmiar bloku możemy ustalić wydając poniższe polecenie:

# tune2fs -l /dev/sdb2 | grep -i "block size"
Block size:               4096

Wartość tego bloku oraz wartość ta, która widnieje w fdisk na pozycji block nie są tożsame. Dla fdisk'a rozmiar bloku jest równy 1024 (przynajmniej u mnie). Także nie możemy kierować się powyższą wartością 2621440 i trzeba przyjąć liczbę czterokrotnie wyższą, czyli 10485760. Tylko, że to są bloki. Trzeba je przeliczyć na sektory: (10485760*2)-1=20971519, albo sprecyzować wielkość partycji przez +10G. W obu przypadkach ( resize2fs i fdisk ) używana jest 2 jako podstawa potęgi. Odpalamy fdisk'a, kasujemy partycję i robimy nową. Z tym, że trzeba uważać. U mnie partycja druga nie zaczyna się zaraz po pierwszej. Zawsze dobrze jest sprawdzić i spisać sobie początek zmienianej partycji:

# fdisk /dev/sdb

Command (m for help): p

Disk /dev/sdb: 80.0 GB, 80025280000 bytes
255 heads, 63 sectors/track, 9729 cylinders, total 156299375 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
Disk identifier: 0x000c741d

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    41945087    20971520    7  HPFS/NTFS/exFAT
/dev/sdb2        84713472   156299263    35792896   83  Linux

Liczbę 84713472 trzeba będzie wpisać jako pierwszy sektor przy tworzeniu nowej partycji. Kasujemy partycję sdb2 i tworzymy nową podając albo +10G, albo +20971519 jako ostatni sektor:

Command (m for help): d
Partition number (1-4): 2

Command (m for help): n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): p
Partition number (1-4, default 2): 2
First sector (41945088-156299374, default 41945088): 84713472
Last sector, +sectors or +size{K,M,G} (84713472-156299374, default 156299374): +20971519

Command (m for help): t
Partition number (1-4): 2
Hex code (type L to list codes): 83

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

I to wszystko jeśli chodzi o kurczenie rozmiaru partycji EXT4. Wyżej zmieniliśmy także typ partycji ustawiając odpowiedni kod (83). Ten krok jest opcjonalny, bo wszystkie tworzone za sprawą fdisk'a partycje mają domyślnie ten typ.

Zwiększanie rozmiaru partycji EXT4

Po sprawdzeniu systemu plików w poszukiwaniu błędów, odpalamy fdisk'a i kasujemy odpowiednią partycję:

# fdisk /dev/sdb

Command (m for help): p

Disk /dev/sdb: 80.0 GB, 80025280000 bytes
255 heads, 63 sectors/track, 9729 cylinders, total 156299375 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
Disk identifier: 0x000c741d

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    41945087    20971520    7  HPFS/NTFS/exFAT
/dev/sdb2        84713472   105684991    10485760   83  Linux

Command (m for help): d
Partition number (1-4): 2

Na jej miejscu tworzymy nową uwzględniając większy rozmiar. W tym przypadku chcemy rozciągnąć starą partycję z 10G do 15G. Zatem w fdisk wpisujemy n , ustawiamy odpowiednio pierwszy sektor i precyzujemy rozmiar partycji na +15G :

Command (m for help): n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): p
Partition number (1-4, default 2): 2
First sector (41945088-156299374, default 41945088): 84713472
Last sector, +sectors or +size{K,M,G} (84713472-156299374, default 156299374): +15G

Precyzujemy także typ partycji 83 (EXT4) i zapisujemy nową tablice partycji:

Command (m for help): t
Partition number (1-4): 2
Hex code (type L to list codes): 83

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

Teraz powiększamy system plików przy pomocy resize2fs :

# resize2fs -p /dev/sdb2
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/sdb2 to 3932160 (4k) blocks.
The filesystem on /dev/sdb2 is now 3932160 blocks long.

Można sprecyzować oczywiście i rozmiar ale, gdy w grę wchodzi powiększanie partycji, tak by wypełniła całą dostępną przestrzeń, to można ominąć ten parametr. W ten sposób system będzie wiedział, że ma rozciągnąć system plików, tak by wypełnił całą partycję.

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.