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