Bei der Installation von Linux-VMs wird in vielen Fällen auf LVM verzichtet und das Standard-Paritionslayout verwendet. Dieses besteht üblicherweise aus einer großen Hauptpartition und einer erweiterten Partition mit einem Swap-Volume darauf.
Wenn nachträglich die Festplatte vergrößert werden soll, ist dies nicht ohne weiteres möglich, da das Swap-Volume am Ende der Festplatte eine Vergrößerung der Root-Partition verhindert. Ich bin die letzten Tage auf dieses Problem bei meiner Docker-VM mit Debian 11 gestoßen. Da ich weder die VM neu aufsetzen oder neustarten wollte, war eine einfache Vergrößerung via GParted nicht möglich. Stattdessen habe ich auf die Bordmittel und etwas Handarbeit zurückgegriffen.
Die Ausgangslage sah so aus:
fdisk -l
Disk /dev/sda: 20 GiB, 10737418240 bytes, 20971520 sectors
Disk model: QEMU HARDDISK
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: dos
Disk identifier: 0x55ab4db2
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 18970623 18968576 9G 83 Linux
/dev/sda2 18972670 20969471 1996802 975M 5 Extended
/dev/sda5 18972672 20969471 1996800 975M 82 Linux swap / Solaris
Die Festplatte im Hypervisor kann direkt vergrößert werden. In meinem Beispiel habe ich diese in Proxmox VE von 10 auf 20 GByte vergrößert.
Der Linux Kernel bekommt von der Vergrößerung allerdings nichts mit. Folgender Befehl löst einen Rescan von sda aus:
echo 1 > /sys/class/block/sda/device/rescan
Über die Kernel-Logs kann geprüft werden, ob der Kernel die größere Festplatte erkannt hat:
dmesg | tail -n 10
[54513.146032] sd 2:0:0:0: Capacity data has changed
[54513.146199] sd 2:0:0:0: [sda] 41943040 512-byte logical blocks: (21.5 GB/20.0 GiB)
[54513.146296] sda: detected capacity change from 10737418240 to 21474836480
Die neue Festplattengröße von 20 GByte wurde erfolgreich erkannt. Im nächsten Schritt muss jetzt die Partition vergrößert werden, da diese nach wie vor unverändert ist.
Ohne nachgelagerte Swap-Partition wäre das mit growpart schnell erledigt und wir könnten sda1 auf die maximal mögliche Größe expandieren:
growpart /dev/sda 1
In unserem Fall funktioniert das leider nicht, da ja noch das Swap-Volume existiert.
Zunächst muss also das Swap-Volume temporär deaktiviert werden.
swapoff /dev/sda5
Jetzt können sowohl Swap (sda5) als auch die Extended-Partition (sda2) gelöscht werden.
fdisk /dev/sda
Welcome to fdisk (util-linux 2.36.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): d
Partition number (1,2,5, default 5): 5
Partition 5 has been deleted.
Command (m for help): d 2
Partition number (1,2, default 2): 2
Partition 2 has been deleted.
Command (m for help): w
The partition table has been altered.
Syncing disks.
Anschließend muss die Root-Partition sda1 vergrößert werden. Mit fdisk können Partitionen leider nicht direkt vergrößert werden. Aus diesem Grund muss sda1 gelöscht und mit der richtigen Größe neu erstellt werden. Die Daten bleiben dabei erhalten! Allerdings müsst ihr gut aufpassen, dass ihr den identischen Block als Startposition (wie bei der bisherigen Partition) verwendet. Ebenso müsst ihr noch genügend Platz für das Swap-Volume übrig lassen.
fdisk /dev/sda
Welcome to fdisk (util-linux 2.36.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): d
Selected partition 1
Partition 1 has been deleted.
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-41943039, default 2048): 2048
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-41943039, default 41943039): 40000000
Created a new partition 1 of type 'Linux' and of size 19.1 GiB.
Partition #1 contains a ext4 signature.
Do you want to remove the signature? [Y]es/[N]o: N
Command (m for help): w
The partition table has been altered.
Syncing disks.
Danach kännen die Extended-Partition sda2 und die logische Swap-Partition sda5 wieder angelegt werden. Zum Schluss bekommt sda5 den Typ 82, welcher “Linux swap” entspricht.
fdisk /dev/sda
Welcome to fdisk (util-linux 2.36.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): n
Partition type
p primary (1 primary, 0 extended, 3 free)
e extended (container for logical partitions)
Select (default p): e
Partition number (2-4, default 2):
First sector (40000001-41943039, default 40001536):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (40001536-41943039, default 41943039):
Created a new partition 2 of type 'Extended' and of size 948 MiB.
Command (m for help): n
All space for primary partitions is in use.
Adding logical partition 5
First sector (40003584-41943039, default 40003584):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (40003584-41943039, default 41943039):
Created a new partition 5 of type 'Linux' and of size 947 MiB.
Command (m for help): t
Partition number (1,2,5, default 5):
Hex code or alias (type L to list all): 82
Changed type of partition 'Linux' to 'Linux swap / Solaris'.
Command (m for help): w
The partition table has been altered.
Syncing disks.
An dieser Stelle muss die Partitionstabelle neu geladen werden. fdisk macht dies unter Debian 11 offensichtlich automatisch. Falls nicht könnt ihr dies folgendermaßen von Hand erledigen:
partprobe /dev/sda
Nun können wir endlich das Dateisystem auf die Partitionsgröße vergrößern.
resize2fs -p /dev/sda1
resize2fs 1.46.2 (28-Feb-2021)
Filesystem at /dev/sda1 is mounted on /; on-line resizing required
old_desc_blocks = 2, new_desc_blocks = 3
The filesystem on /dev/sda1 is now 4999744 (4k) blocks long.
Um die Swap-Partition müssen wir uns natürlich auch noch kümmern.
mkswap /dev/sda5
Setting up swapspace version 1, size = 947 MiB (992997376 bytes)
no label, UUID=05e1dce8-3798-46c7-b161-e28051c91268
Die neue UUID muss in den beiden Dateien “/etc/fstab” und “/etc/initramfs-tools/conf.d/resume” eingetragen werden.
Zum Abschluss kann die Swap-Partition wieder aktiviert werden:
swapon /dev/sda5
update-initramfs -u
Fertig! Wie ihr seht ist es zwar eine Menge Arbeit, aber so könnt ihr die Root-Partition einer Linux-VM ohne Neustart vergrößern.
Zur Vollständigkeit noch der Output von fdisk, nachdem alles erledigt ist:
fdisk -l
Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors
Disk model: QEMU HARDDISK
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: dos
Disk identifier: 0x55ab4db2
Device Boot Start End Sectors Size Id Type
/dev/sda1 2048 40000000 39997953 19.1G 83 Linux
/dev/sda2 40001536 41943039 1941504 948M 5 Extended
/dev/sda5 40003584 41943039 1939456 947M 82 Linux swap / Solaris
Neueste Kommentare