How to Expand a Linux VM Disk and Filesystem Without Rebooting

How-to: Vergrößern einer Linux-VM-Festplatte und Dateisystems ohne Neustart

In Anleitungen, Linux, Virtualisierung by Kevin MaschkeLeave a Comment

Warst du schon mal in der Situation, dass auf einem Linux-Server der Speicherplatz ausgegangen ist und du diesen erweitern musstest, den Server aber nicht neu starten konntest? In diesem Artikel zeige ich dir, wie du die Größe der Root-Partition erhöhen kannst, ohne den Server neu starten zu müssen.

Die virtuelle Festplatte zu vergrößern ist in der Regel schnell erledigt. Damit das Betriebssystem den zusätzlichen Speicherplatz aber auch wirklich nutzen kann, musst du innerhalb der virtuellen Maschine noch ein paar Änderungen vornehmen. Die gute Nachricht ist, dass die meisten modernen Linux-Distributionen die Online-Erweiterung von Dateisystemen unterstützen. Dadurch kannst du den verfügbaren Speicherplatz erweitern, ohne den Server neu starten oder laufende Anwendungen unterbrechen zu müssen.

Diese Anleitung erklärt den grundsätzlichen Ablauf und behandelt die gängigsten Speicherlayouts von Linux-VMs auf Plattformen wie:

  • KVM / QEMU
  • VMware ESXi
  • Microsoft Hyper-V
  • Xen
  • VirtualBox
  • Cloud-Anbieter mit VirtIO-, SCSI- oder NVMe-Datenträgern

Welche Befehle du am Ende benötigst, hängt von deinem Festplattenlayout, dem verwendeten Dateisystem und der zugrunde liegenden Speichertechnologie ab.

Den Speicheraufbau einer Linux-VM verstehen

Bevor du loslegst, solltest du verstehen, an welcher Stelle der zusätzliche Speicherplatz überhaupt verfügbar wird. Der Speicher einer virtuellen Maschine besteht aus mehreren Ebenen:

Hypervisor
    |
    ↓
Virtuelle Festplatte (VMDK/QCOW2/VHDX/VHD)
    |
    ↓
Linux-Blockgerät (/dev/sda, /dev/vda, /dev/nvme0n1)
    |
    ↓
Partition / LVM / RAID
    |
    ↓
Dateisystem (ext4, XFS, Btrfs)
    |
    ↓
Eingehängtes Verzeichnis (/)

Wenn du die virtuelle Festplatte vergrößerst, ändert sich zunächst nur die erste Ebene. Zum Beispiel:

Vorher:

Virtuelle Festplatte: 50GB

/dev/vda
└── /dev/vda1
        └── ext4-Dateisystem (50GB)

Nach dem Vergrößern der Festplatte:

Virtuelle Festplatte: 100GB

/dev/vda
└── /dev/vda1
        └── ext4-Dateisystem (50GB)

Nicht zugewiesener Speicherplatz: 50GB

Der zusätzliche Speicherplatz steht dem Betriebssystem noch nicht automatisch zur Verfügung. Erst nachdem du die Partition und anschließend das Dateisystem erweitert hast, kann Linux die zusätzliche Kapazität auch nutzen.

Voraussetzungen

Bevor du Änderungen vornimmst, solltest du Folgendes bereithalten:

  • Administrativen Zugriff auf den Hypervisor der virtuellen Maschine.
  • Die Berechtigung, die Größe der virtuellen Festplatte auf dem Hypervisor zu ändern.
  • SSH-Zugriff auf die virtuelle Maschine.
  • Einen aktuellen Snapshot oder ein aktuelles Backup.
  • Einen Überblick über das aktuelle Speicherlayout.

1. Das aktuelle Festplattenlayout prüfen

Als Erstes solltest du dir ansehen, wie das System aktuell aufgebaut ist.

Beginne mit lsblk:

root@server01:~# lsblk

NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
vda    252:0    0   50G  0 disk
├─vda1 252:1    0    1G  0 part /boot
└─vda2 252:2    0   49G  0 part /

Dies zeigt:

  • Die Festplatte (vda) ist 50 GB groß.
  • Die Root-Partition (vda2) ist nur 49 GB groß.

Prüfe anschließend die Belegung des Dateisystems:

root@server01:~# df -h

Filesystem      Size  Used Avail Use% Mounted on
/dev/vda2        49G   43G  4.0G  92% /
/dev/vda1       974M  120M  854M  13% /boot

2. Die virtuelle Festplatte vergrößern

Der erste Schritt erfolgt auf der Hypervisor-Seite. Vergrößere die virtuelle Festplatte auf die gewünschte Endgröße. Hat die Festplatte beispielsweise aktuell 50 GB und du benötigst weitere 50 GB, solltest du sie auf insgesamt 100 GB erweitern.

VMware

Vergrößere die Festplatte über:

  • Virtual Machine → Edit Settings → Hard Disk → Increase Capacity

Powershell:

Resize-VHD 
  -Path "LinuxServer01.vhdx" 
  -SizeBytes 100GB

VBoxManage modifymedium disk LinuxServer01.vdi --resize 102400

Weil:

100GB × 1024MB = 102400MB

qemu-img resize verhält sich etwas anders. Ohne ein + gibst du die endgültige Größe an:

qemu-img resize linux-server.qcow2 100G

Mit einem + wird die angegebene Größe zusätzlich hinzugefügt:

qemu-img resize linux-server.qcow2 +50G

Beide Befehle führen zum gleichen Ergebnis:

50GB + 50GB = 100GB

Läuft die VM bereits, kannst du stattdessen Folgendes verwenden:

virsh blockresize linux-server /var/lib/libvirt/images/linux-server.qcow2 100G

Der genaue Befehl hängt vom verwendeten Storage-Backend ab. Nutzt die virtuelle Festplatte beispielsweise LVM, kannst du sie so vergrößern:

lvextend -L +50G /dev/vg/vm-disk

An diesem Punkt ist die virtuelle Festplatte auf dem Hypervisor zwar größer, Linux hat diese Änderung aber möglicherweise noch nicht erkannt.

3. Die Festplatte unter Linux neu einlesen

Nachdem du die virtuelle Festplatte vergrößert hast, erkennt Linux den zusätzlichen Speicherplatz möglicherweise nicht sofort.

root@server01:~# lsblk

NAME   SIZE TYPE MOUNTPOINTS
vda     50G disk
├─vda1   1G part /boot
└─vda2  49G part /

Wie du siehst, wird noch die alte Größe angezeigt. Deshalb müssen wir das Blockgerät zunächst neu einlesen.

Je nach Festplattentyp unterscheidet sich der Befehl:

Für SCSI-Festplatten:

echo1 > /sys/class/block/sda/device/rescan

Für VirtIO-Festplatten:

echo1 > /sys/class/block/vda/device/rescan

Für NVMe:

nvme rescan

Überprüfen

Prüfe anschließend mit lsblk, ob Linux die neue Größe erkannt hat:

root@server01:~# lsblk

NAME   SIZE TYPE MOUNTPOINTS
vda    100G disk
├─vda1   1G part /boot
└─vda2  49G part /

Linux erkennt jetzt den zusätzlichen Speicherplatz. Die Partition selbst wurde allerdings noch nicht vergrößert.

4. Das Speicherlayout bestimmen

Wie du den Speicherplatz erweiterst, hängt davon ab, wie die Festplatte aufgebaut ist.

Zu den gängigsten Speicherlayouts gehören:

  • Standardpartitionen
  • LVM
  • Software-RAID
  • ZFS
  • Verschlüsselte Datenträger

Am häufigsten kommen unter Linux Standardpartitionen und LVM zum Einsatz.

Standardpartitionen

Beispiel:

/dev/vda1 → /

Typische Werkzeuge::

  • fdisk
  • parted
  • resize2fs
  • xfs_growfs

LVM

Beispiel:

/dev/vda
 └── partition
      └── volume group
            └── logical volume /

Typische Werkzeuge:

  • pvresize
  • lvextend
  • resize2fs
  • xfs_growfs

LVM ist in der Regel das am einfachsten zu erweiternde Speicherlayout.

Weitere Speichertechnologien

In manchen Umgebungen kommen außerdem folgende Technologien zum Einsatz:

  • RAID
  • ZFS
  • Btrfs
  • Verschlüsselte Datenträger

Für diese gelten jeweils eigene Vorgehensweisen zur Speichererweiterung.

5. Das Root-Dateisystem mit LVM erweitern

LVM wird häufig in Enterprise-Linux-Distributionen und vielen Cloud-Images verwendet.

LVM-Konfiguration prüfen

Prüfe zunächst, ob dein System LVM verwendet:

root@server01:~# lsblk

NAME                 SIZE TYPE MOUNTPOINTS
vda                   50G disk
└─vda2                50G part
  └─ubuntu--vg-root   50G lvm  /

Nachdem du die virtuelle Festplatte auf 100 GB vergrößert und das Blockgerät neu eingelesen hast, sieht die Ausgabe so aus:

root@server01:~# lsblk

NAME                 SIZE TYPE MOUNTPOINTS
vda                  100G disk
└─vda2               100G part
  └─ubuntu--vg-root   50G lvm  /

Die Festplatte und die Partition wurden bereits vergrößert, das logische Volume verwendet aber noch immer die ursprünglichen 50 GB.

Prüfe die Volume Groups:

root@server01:~# vgdisplay

  VG Name               ubuntu-vg
  VG Size               98.00 GiB
  Alloc PE / Size       49.00 GiB
  Free PE / Size        49.00 GiB

Physical Volume vergrößern

root@server01:~# pvresize /dev/vda2

Physical volume "/dev/vda2" changed
1 physical volume(s) resized or updated

Logical Volume erweitern

root@server01:~# lvextend -l +100%FREE /dev/ubuntu-vg/root

Size of logical volume ubuntu-vg/root changed from 49.00 GiB to 98.00 GiB.
Logical volume ubuntu-vg/root successfully resized.

Alternativ kannst du auch eine feste Größe angeben:

lvextend -L +50G /dev/mapper/root

Dateisystem vergrößern

Für ext4:

root@server01:~# resize2fs /dev/ubuntu-vg/root

resize2fs 1.46.5 (30-Dec-2021)
Filesystem at /dev/ubuntu-vg/root is mounted on /; on-line resizing required
The filesystem on /dev/ubuntu-vg/root is now 25690112 (4k) blocks long.

Für XFS:

root@server01:~# xfs_growfs /

data blocks changed from 12845056 to 25690112

Überprüfen

Kontrolliere abschließend mit df, ob der zusätzliche Speicherplatz verfügbar ist:

root@server01:~# df -h /

Filesystem                   Size Used Avail Use%
/dev/mapper/ubuntu--vg-root   98G  43G   51G  46% /

6. Eine Standardpartition erweitern

Manche Linux-Installationen verwenden ein klassisches Partitionslayout ohne LVM.

Beispiel:

root@server01:~# fdisk -l /dev/vda

Device      Start     End        Sectors    Size
/dev/vda1   2048      96471039   96468991   46G
/dev/vda2   96471040  104857599  8386559    4G

Der wichtigste Wert ist der Start-Sektor.

Beim Neuerstellen der Partition muss dieser Start-Sektor exakt gleich bleiben. Ist das nicht der Fall, kann das Dateisystem beschädigt werden und die Daten sind möglicherweise nicht mehr erreichbar.

Swap deaktivieren (falls erforderlich)

Falls deine Swap-Partition als eigene Partition eingerichtet ist, solltest du sie zunächst deaktivieren. (⚠️ Hinweis: Stelle sicher, dass dein System eine Zeit lang auch ohne Swap stabil weiterlaufen kann.):

swapoff -a

Partitionen löschen

Jetzt erstellen wir die Partitionstabelle neu. Dazu löschen wir zunächst die beiden vorhandenen Partitionen.

Starte fdisk /dev/vda, lösche anschließend mit d zuerst Partition 2 und danach Partition 1:

root@prod-deb-01:~# fdisk /dev/vda

Command (m for help): d
Partition number (1,2, default 2):

Partition 2 has been deleted.

Command (m for help): d
Selected partition 1
Partition 1 has been deleted.

⚠️ Wichtig: Bei diesem Schritt wird die Partitionstabelle geändert. Die vorhandenen Partitionen werden gelöscht und anschließend mit neuen Grenzen neu erstellt. Die Daten bleiben nur deshalb erhalten, weil die Partitionen mit genau denselben Start-Sektoren neu angelegt werden. Prüfe die Start-Sektoren deshalb sorgfältig, bevor du die Änderungen speicherst, und stelle sicher, dass du über ein aktuelles Backup oder einen Snapshot verfügst.

Partitionen neu erstellen

Anschließend legen wir die Partitionen wieder an. Da unsere Swap-Partition bisher 4 GB groß war, behalten wir diese Größe bei. Du kannst sie bei Bedarf natürlich auch vergrößern.

Zuerst /dev/vda1 erstellen:

  • Drücke n, um eine neue Partition anzulegen.
  • Wähle p für eine primäre Partition.
  • Übernimm den vorgeschlagenen First sector (2048), indem du einfach Enter drückst.
  • Gib anschließend die gewünschte Partitionsgröße an. Wenn du die Festplatte beispielsweise auf 100 GB erweitert hast und 4 GB für Swap reservieren möchtest, gibst du +96G ein.
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-209715199, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-209715199, default 209715199): +96G

Created a new partition 1 of type 'Linux' and of size 96 GiB.

Anschließend die Swap-Partition erstellen

  • Drücke erneut n und anschließend p.
  • Übernimm den vorgeschlagenen Wert für First sector mit Enter.
  • Übernimm auch den Standardwert für Last sector, indem du erneut Enter drückst.
Command (m for help): n
Partition type
   p   primary (1 primary, 0 extended, 3 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (2-4, default 2): 2
First sector (201328640-209715199, default 201328640):
Last sector, +sectors or +size{K,M,G,T,P} (201328640-209715199, default 209715199):

Created a new partition 2 of type 'Linux' and of size 4 GiB.

Da diese Partition als Swap verwendet werden soll, musst du jetzt noch ihren Typ in fdisk ändern.

  • Drücke t.
  • Wähle anschließend Partition 2.
  • Mit L kannst du dir alle verfügbaren Partitionstypen anzeigen lassen. Gib anschließend 82 ein, um Linux swap / Solaris auszuwählen.
Command (m for help): t
Partition number (1,2, default 2): 2
Partition type (type L to list all types): L

 0  Empty           24  NEC DOS         81  Minix / old Lin bf  Solaris
 1  FAT12           27  Hidden NTFS Win 82  Linux swap / So c1  DRDOS/sec (FAT-
 2  XENIX root      39  Plan 9          83  Linux           c4  DRDOS/sec (FAT-
 3  XENIX usr       3c  PartitionMagic  84  OS/2 hidden or  c6  DRDOS/sec (FAT-
 4  FAT16 <32M      40  Venix 80286     85  Linux extended  c7  Syrinx
 5  Extended        41  PPC PReP Boot   86  NTFS volume set da  Non-FS data
 6  FAT16           42  SFS             87  NTFS volume set db  CP/M / CTOS / .
 7  HPFS/NTFS/exFAT 4d  QNX4.x          88  Linux plaintext de  Dell Utility
 8  AIX             4e  QNX4.x 2nd part 8e  Linux LVM       df  BootIt
 9  AIX bootable    4f  QNX4.x 3rd part 93  Amoeba          e1  DOS access
 a  OS/2 Boot Manag 50  OnTrack DM      94  Amoeba BBT      e3  DOS R/O
 b  W95 FAT32       51  OnTrack DM6 Aux 9f  BSD/OS          e4  SpeedStor
 c  W95 FAT32 (LBA) 52  CP/M            a0  IBM Thinkpad hi ea  Rufus alignment
 e  W95 FAT16 (LBA) 53  OnTrack DM6 Aux a5  FreeBSD         eb  BeOS fs
 f  W95 Ext'd (LBA) 54  OnTrackDM6      a6  OpenBSD         ee  GPT
10  OPUS            55  EZ-Drive        a7  NeXTSTEP        ef  EFI (FAT-12/16/
11  Hidden FAT12    56  Golden Bow      a8  Darwin UFS      f0  Linux/PA-RISC b
12  Compaq diagnost 5c  Priam Edisk     a9  NetBSD          f1  SpeedStor
14  Hidden FAT16 <3 61  SpeedStor       ab  Darwin boot     f4  SpeedStor
16  Hidden FAT16    63  GNU HURD or Sys af  HFS / HFS+      f2  DOS secondary
17  Hidden HPFS/NTF 64  Novell Netware  b7  BSDI fs         fb  VMware VMFS
18  AST SmartSleep  65  Novell Netware  b8  BSDI swap       fc  VMware VMKCORE
1b  Hidden W95 FAT3 70  DiskSecure Mult bb  Boot Wizard hid fd  Linux raid auto
1c  Hidden W95 FAT3 75  PC/IX           bc  Acronis FAT32 L fe  LANstep
1e  Hidden W95 FAT1 80  Old Minix       be  Solaris boot    ff  BBT
Partition type (type L to list all types): 82

fdisk bestätigt anschließend die Änderung:

Changed type of partition 'Linux' to 'Linux swap / Solaris'.

Speichere die Änderungen anschließend mit w:

Command (m for help): w

Vor dem Beenden kann folgende Meldung erscheinen:

The partition table has been altered.
Calling ioctl() to re-read partition table.
Re-reading the partition table failed.: 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).

Partitionstabelle ohne Neustart neu einlesen

Damit der Kernel die neue Partitionstabelle übernimmt, kannst du partprobe ausführen:

root@prod-deb-01:~# partprobe

Dateisystem vergrößern

Nachdem die Partition erweitert wurde, musst du noch das Dateisystem vergrößern.

ext4

resize2fs /dev/vda2

Beispiel:

resize2fs 1.47.0
Filesystem at /dev/vda2 is mounted on /; on-line resizing required
The filesystem on /dev/vda2 is now 39062500 blocks long.

XFS

xfs_growfs /

Beispiel:

meta-data=/dev/vda2
data blocks changed from 12800000 to 39062500

BTRFS

btrfs filesystem resize max /

Neue Swap-Partition initialisieren

Da wir die Swap-Partition neu erstellt haben, muss sie jetzt neu initialisiert werden:

root@prod-deb-01:~# mkswap /dev/vda2
Setting up swapspace version 1, size = 4193276 KiB
no label, UUID=c55c25a2-a386-4653-8455-4d9030586dd2

Anschließend musst du die Datei /etc/fstab bearbeiten und die alte UUID durch die neue ersetzen, die von mkswap ausgegeben wurde. Die betreffende Zeile hat keinen Einhängepunkt (mount point) und verwendet den Typ swap.

# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
UUID=332f8fb5-ff1f-4297-b512-f2c93a277296 /               ext4    errors=remount-ro 0       1
/dev/fd0        /media/floppy0  auto    rw,user,noauto,exec,utf8 0       0
UUID=c55c25a2-a386-4653-8455-4d9030586dd2       none    swap    sw      0       0

Swap wieder aktivieren

Nachdem du /etc/fstab angepasst hast, kannst du die Swap-Partition wieder aktivieren:

root@prod-deb-01:~# swapon -a

7. ZFS-Speicher erweitern

ZFS funktioniert etwas anders als herkömmliche Partitionen oder LVM. Nachdem du die virtuelle Festplatte vergrößert hast, musst du den zusätzlichen Speicherplatz dem ZFS-Pool zur Verfügung stellen.

Prüfe zunächst den Status des Pools:

zpool status

Erweitere anschließend das entsprechende Gerät:

zpool online -e pool_name device_name

Überprüfe zum Schluss, ob die neue Größe übernommen wurde:

zpool list

8. Überprüfen, ob die Erweiterung erfolgreich war

Prüfe zuerst die Größe des Dateisystems:

df-h /

Filesystem      Size Used Avail Use%
/dev/vda2       96G   43G   49G47% /

Kontrolliere anschließend das Partitionslayout:

lsblk

NAME   SIZE TYPE MOUNTPOINTS
vda    100G disk
├─vda1   1G part /boot
└─vda2  96G part /

Zum Schluss kannst du noch die Uptime überprüfen, um sicherzugehen, dass der Server während der gesamten Erweiterung nicht neu gestartet wurde:

uptime14:32:51 up147 days,4:21,2 users, load average:0.05,0.02,0.00

Damit ist die Festplatte erfolgreich erweitert worden – ganz ohne Neustart.

Wann trotzdem ein Neustart erforderlich sein kann

Die Online-Erweiterung funktioniert auf den meisten modernen Linux-Systemen problemlos. In einigen Fällen lässt sich ein Neustart jedoch nicht vermeiden:

  • Der Kernel kann die neue Partitionstabelle nicht neu einlesen.
  • Das Layout der Root-Partition ändert sich unerwartet.
  • Es werden ältere Dateisysteme verwendet.
  • Verschlüsselte Datenträger erfordern zusätzliche Schritte.
  • RAID-Metadaten müssen neu aufgebaut werden.
  • Der Hypervisor unterstützt keine Online-Vergrößerung von Festplatten.

References

1. KVM / QEMU / libvirt

2. VMware ESXi & vSphere

3. Microsoft Hyper-V

  • Microsoft Learn PowerShell-Modul:Microsoft Learn – Resize-VHD
    • Beschreibt die Syntax und Parameter des Resize-VHD-Cmdlets zum Vergrößern von .vhdx-Dateien – sowohl online als auch offline.

4. VirtualBox

5. Xen / XenServer / XCP-ng

Leave a Comment

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre, wie deine Kommentardaten verarbeitet werden.