KVM: Festplatte der VM und das physische Volumen in der VM vergrößern

Für eine bessere Performance können unter anderem bei der Virtualisierung mit KVM logische Volumen eines LVM als virtuelle Festplatte für die virtuellen Maschinen genutzt werden. Kommt zusätzlich in der VM ein weiteres LVM zum Einsatz ist es bei der Vergrößerung der virtuellen Festplatte nicht nur mit einer einfachen Neupartitionierung getan. Im Folgenden werden die benötigten Schritte beschrieben, durch die die volle Speicherkapazität der virtuellen Festplatte verwendet werden kann.

Zunächst muss das logische Volumen auf dem Host-System vergrößert werden. Das Vorgehen ist dabei dem in Artikel "Linux: Logisches Volumen bei LVM vergrößern" beschriebenen sehr ähnlich. Im folgenden Beispiel wird so die Größe der virtuelle Festplatte auf 20 Gigabyte festgelegt.

$ sudo lvresize -L20G /dev/volume_group/meine_vm

Anschließend muss die virtuelle Maschine neu gestartet werden. Ein einfacher Neustart reicht jedoch nicht aus, da die Änderung nur richtig an das Gast-System weitergegeben wird, wenn die virtuelle Maschine komplett ausgeschaltet und wieder eingeschaltet wurde. Nach dem Neustart wird im Gast-System weitergearbeitet. Dort wird das Programm fdisk verwendet um die Partition, auf der das physische Volumen liegt, zu vergrößern. Dafür wird das Programm unter Angabe der entsprechenden Festplatte und der Einstellung, dass alle Werte in Sektoren angezeigt werden, gestartet.

$ sudo fdisk -u=sectors /dev/vda

Anschließend kann die aktuelle Partitionstabelle angezeigt werden.

Command (m for help): p

Disk /dev/vda: 21.5 GB, 21474836480 bytes
16 heads, 63 sectors/track, 41610 cylinders, total 41943040 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: 0x000ecb4e

   Device Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048      391167      194560   83  Linux
/dev/vda2          391168    20969471    10289152   8e  Linux LVM

Zu sehen ist das auf der Partition /dev/vda2 das physische Volumen des LVM liegt. Diese Partition geht bis zum Sektor 20969471, durch die Vergrößerung der virtuellen Festplatte stehen jedoch 41943040 Sektoren zur Verfügung.

Achtung: Theoretisch sollte bei dem Folgenden nichts schief gehen, jedoch ist es wie immer empfehlenswert ein Backup der Daten anzulegen. Sollte es während des Vorgangs doch zu einem Fehler kommen könnten alle Daten verloren gehen.

Leider ist es nicht möglich die Partition einfach so zu vergrößern. Dazu wird die Partition zunächst gelöscht.

Hinweis: Unbedingt auf die richtige Nummer der Partition achten. Hier ist es die 2.

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

Anschließend wird die Partition neu angelegt. Wichtig ist, dass die Partition vom gleichen Type ist und die gleiche Nummer hat. Zusätzlich muss der erste Sektor dem der gelöschten Partition entsprechen. Im vorliegenden Fall ist das der Sektor 391168. Hinweis: Der Wert für den letzten Sektor darf nicht kleiner als der der original Partition sein.

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

Ist das geschafft, bietet es sich an die neue Partitionstabelle noch einmal genau anzuschauen.

Command (m for help): p

Disk /dev/vda: 21.5 GB, 21474836480 bytes
16 heads, 63 sectors/track, 41610 cylinders, total 41943040 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: 0x000ecb4e

   Device Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048      391167      194560   83  Linux
/dev/vda2          391168    41943039    20775936   83  Linux

Wichtig: Zu sehen ist, dass der Type der angelegten Partition auf Linux steht. Dies muss unbedingt noch geändert werden. Der richtige Typ ist 8e, welcher für Linux LVM steht.

Command (m for help): t
Partition number (1-4): 2
Hex code (type L to list codes): 8e
Changed system type of partition 2 to 8e (Linux LVM)

Noch einmal alles überprüfen.

Command (m for help): p

Disk /dev/vda: 21.5 GB, 21474836480 bytes
16 heads, 63 sectors/track, 41610 cylinders, total 41943040 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: 0x000ecb4e

   Device Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048      391167      194560   83  Linux
/dev/vda2          391168    41943039    20775936   8e  Linux LVM

Bis jetzt wurden alle Änderungen nur im Programm vorgenommen, aber noch nicht auf die Festplatte gespeichert. Daher muss dies abschließend noch gemacht werden.

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.

Damit der Kernel die neue Partitionstabelle richtig einließt sollte das System neu gestartet werden. Nach dem Neustart wird geschaut ob alle Änderungen an der Partitionstabelle erfolgreich waren und den Vorstellungen entsprechen.

$ sudo fdisk -l /dev/vda

Disk /dev/vda: 21.5 GB, 21474836480 bytes
16 heads, 63 sectors/track, 41610 cylinders, total 41943040 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: 0x000ecb4e

   Device Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048      391167      194560   83  Linux
/dev/vda2          391168    41943039    20775936   8e  Linux LVM

Ist alles in Ordnung wird mit dem Programm pvscan eine Übersicht über die im System vorhandenen physischen Volumen abgerufen.

$ sudo pvscan
  PV /dev/vda2   VG vg_system   lvm2 [9.81 GiB / 956.00 MiB free]
  Total: 1 [9.81 GiB] / in use: 1 [9.81 GiB] / in no VG: 0 [0   ]

Zusehen ist, dass der Speicher immer noch auf ca. 10 Gigabyte steht, was der Ausgangsgröße entspricht. Um dies zu ändern muss das physische Volumen vergrößert werden.

$ sudo pvresize /dev/vda2
  Physical volume "/dev/vda2" changed
  1 physical volume(s) resized / 0 physical volume(s) not resized

Wie zu sehen ist, war die Vergrößerung erfolgreich und ein erneuter Aufruf von pvscan zeigt, dass der voll Speicher jetzt in der Volume Group zur Verfügung ist.

$ sudo pvscan
  PV /dev/vda2   VG vg_system   lvm2 [19.81 GiB / 10.94 GiB free]
  Total: 1 [19.81 GiB] / in use: 1 [19.81 GiB] / in no VG: 0 [0   ]

Verwandte Artikel