Festplatte und Partition einer Linux-VM ohne Neustart vergrößern

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

Tobi

Hallo, mein Name ist Tobias und ich habe diesen Blog im April 2009 ins Leben gerufen. Seitdem blogge ich hier über Software, Internet, Windows und andere Themen, die mich interessieren. SSDblog ist mein zweiter Blog, indem es rund um das Thema SSDs geht. Ich würde mich freuen, wenn ihr meinen Feed abonniert oder mir auf Twitter und Facebook folgt.

Eine Antwort

  1. Celine sagt:

    Ich arbeite derzeit viel mit Linux im Rahmen eines IT-Projekts und habe aus diesem Grund diesen interessanten Fachartikel gelesen. Dank dieses tollen Artikels habe ich neues Know-how erworben.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.