On-line fájlrendszer átméretezés

Munkám és hobbim során is rendszeresen használok Linuxos virtuális gépeket valamilyen cloud rendszerben. Ilyenkor időnként felmerül az igény, hogy egy fix rendszerképből létrehozott VM alá nagyobb diszk kerüljön. Hasonló eset természetesen otthoni környezetben is előfordulhat, ha idővel rendszerint betelő merevlemezünket nagyobbra cseréltük, vagy egész egyszerűen csak nem teljesen megfelelően partícionáltuk telepítéskor.

Virtualizált környezetben esetenként lehetőség van VM létrehozására az alapul szolgáló lemezképben szereplőnél nagyobb kapacitású diszkkel is, azonban ettől az operációs rendszer még nem fogja látni az extra területet, az csak a lemez végén fog üresen figyelni.

Ahhoz, hogy ez a terület is használatba kerülhessen még a fájlrendszert is át kell méretezni. Szerencsére megfelelő kernel támogatottság esetén lehetőségünk van on-line átméretezésre is. Cloud környezetben ennek kettős jelentőssége van: nem kell megoldani a "külső" eszközről bootolás problémáját, illetve ilyen módon az átméretezés folyamata a felhasználók számára nagyrészt rejtve is tud maradni.

Miután gondoskodtunk a megnövelt lemez behelyezéséről és az adatoknak a régi lemezről való átmozgatásáról, első lépésként indítsunk egy root jogosultságokkal rendelkező sheelt:

# sudo su

A gépünkben lévő diszk méretét a következőképpen tudjuk ellenőrizni:

# fdisk -l

Disk /dev/sda: 10.7 GB, 10737418240 bytes
64 heads, 32 sectors/track, 10240 cylinders, total 20971520 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: 0x0001f436

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048    14680063     7339008   83  Linux
/dev/sda2        14682110    16775167     1046529    5  Extended
/dev/sda5        14682112    16775167     1046528   82  Linux swap / Solaris

A felcsatolt partíciók méretét pedig így:

# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       6.9G  958M  5.7G  15% /
udev            241M   12K  241M   1% /dev
tmpfs           100M  212K  100M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            249M     0  249M   0% /run/shm
none            100M     0  100M   0% /run/user

Ezzel sikeresen megtudtuk, hogy a gépben egy 10.7GB kapacitású HDD van, mely három partícióra van bontva. Azt is megtudtuk, hogy az sda1 a boot partíció és van még egy swap is. Ezekből látható, hogy az sda1 méretét kellene megnövelnünk, kihasználandó az összes rendelkezésreálló lemezterületet. Az egyedüli gond csak az, hogy a szabad hely és a megnövelendő partíció között van még másik partíció is. Szerencsére azonban ez a terület csak lapozásra van használva, így ez nem okoz különösebb extra fejfájást.

Annyit azonban okoz, hogy a következő lépésben le kell tiltsuk az operációs rendszer swappelését:

# swapoff /dev/sda5

Most ismét előtérbe kerül az fdisk. Segítségével kitöröljük, majd újra létrehozzuk a partíciókat. Mindezt anélkül tehetjük meg, hogy az adatokhoz hozzányúlnánk, elegendő csupán a partíciós táblát módosítani. Fontos, hogy az sda1 kezdő pozíciója azonos helyen legyen a módosítás előtt és után is.

# fdisk /dev/sda

Töröljük az sda5, sda2 majd az sda1 partíciókat:

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

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

Command (m for help): d
Selected partition 1

Azonos kezdőpozícióval hozzuk újra létre az sda1-et. A partíció utolsó szektorát adjuk meg úgy, hogy a lemez végén maradjon még swap terület is.

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

A fennmaradó terülere hozzuk létre a swap partíciót:

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

Ha mindent helyesen csináltunk, akkor a következő partíciós táblának kell jelenleg lennie (jelenleg még csak a memóriában):

Command (m for help): p

Disk /dev/sda: 10.7 GB, 10737418240 bytes
64 heads, 32 sectors/track, 10240 cylinders, total 20971520 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: 0x0001f436

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048    19922944     9960448+  83  Linux
/dev/sda2        19922945    20971519      524287+  83  Linux

Mivel az sda2-t lapozásra szeretnénk használni, állítsuk be ennek megfelelően "Linux swap / Solaris" értékre:

Command (m for help): t
Partition number (1-4): 2
Hex code (type L to list codes): 82
Changed system type of partition 2 to 82 (Linux swap / Solaris)

Command (m for help): p

Disk /dev/sda: 10.7 GB, 10737418240 bytes
64 heads, 32 sectors/track, 10240 cylinders, total 20971520 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: 0x0001f436

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048    19922944     9960448+  83  Linux
/dev/sda2        19922945    20971519      524287+  82  Linux swap / Solaris

Ahhoz, hogy az eddigi módosításaink ténylegesen végrehajtásra is kerüljenek, ki kell azokat írni a lemezre:

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

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.

Szükséges még egy gyors újraindítás:

# reboot

Broadcast message from gabor@ubuntu
(/dev/pts/0) at 6:40 ...

The system is going down for reboot NOW!

Bár a partíciós tábla már a megfelelő adatokat tartalmazza, ezt a fájlrendszernek is követnie kell. Ennek eléréséhez adjuk ki a következő parancsot:

# resize2fs /dev/sda1
resize2fs 1.42.5 (29-Jul-2012)
Filesystem at /dev/sda1 is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/sda1 is now 2490112 blocks long.

A sikeres átméretezésről a legegyszerűbben a szabad terület lekérdezésével tudunk meggyőződni:

# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       9.4G  958M  8.0G  11% /
udev            241M   12K  241M   1% /dev
tmpfs           100M  212K  100M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            249M     0  249M   0% /run/shm
none            100M     0  100M   0% /run/user

Mivel a rendezkedésünk elején kikapcsolásra került a memória lapozása, ezt célszerű visszaállítani. Ezt a swapon paranccsal tehetnénk meg, azonban mivel új helyre került a partíció, ezért elősször inicializálni kell a lapozó területet:

# mkswap /dev/sda2
Setting up swapspace version 1, size = 524280 KiB
no label, UUID=68f662e0-4eeb-463e-aa18-bd591dcee142
# swapon /dev/sda2

Egyetlen utolsó feladatunk maradt még a végére: az /etc/fstab fájl módosítása. Erre a swap partíció bolygatása során keletkezett új UUID miatt van szükség.

# vim /etc/fstab

# swap was on /dev/sda5 during installation
UUID=68f662e0-4eeb-463e-aa18-bd591dcee142   none   swap   sw   0  0