WARNUNG: IMMER BACKUP VORHER MACHEN, und das ganze ist auf eigene Gefahr!
folgendes Szenario, ich habe einen KVM Host Server darauf laufen ein paar VMs. Für fast alle VMs habe ich eine Festplatten große von 20GB angelegt, mit der Zeit musste ich feststellen das 20GB war einfach zu viel und 10GB wurden vollkommen ausreichen, vor allem das ganze kostet zu viel Backup Speicher.
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
VM1 sunny -wi-ao---- 10.00g
VM2 sunny -wi-a----- 20.00g
backup-VM1 sunny -wi-a----- 20.00g
backup-VM2 sunny -wi-a----- 20.00g
home sunny -wi-ao---- 20.00g
root sunny -wi-ao---- 10.00g
swap sunny -wi-ao---- 4.00g
tmp sunny -wi-ao---- 5.00g
Vorbereitung
auf VM2 ist einen debian linux System mit LVM2 Partition installiert, bevor wir die VM verkleinern müssen wir die Machine runter fahren.
virsh shutdown VM2
Backup
wir erstellen erstmal eine neue LV für den Backup, die genau so groß wie die VM2
lvcreate -L 20G sunny -n backup-VM2
Jetzt machen wir einfach eine 1:1 Copy von die VM, mit dem dd Befehl
dd if=/dev/sunny/VM2 of=/dev/sunny/backup-VM2
Verkleinern
Jetzt müssen wir die VM2 auf dem Host mounten, da VM2 selber LVM ist benötigen wir das Tool kpartx, falls nicht vorhanden einfach mit apt installieren.
apt install kpartx
nun um die Logical Volumes, die Innerhalb unseren VM2 anzuzeigen, müssen wir folgendes Befehl ausführen:
kpartx -av /dev/sunny/VM2
add map sunny-VM21 (253:9): 0 497664 linear /dev/sunny/VM2 2048
add map sunny-VM22 (253:10): 0 2 linear /dev/sunny/VM2 501758
add map sunny-VM25 : 0 41439232 linear /dev/sunny/VM2 501760
und nun aktivieren wir die LVMs, die innerhalb VM2 sind
vgchange -ay
lvscan
Nun müssen wir, die LVM, die wir verkleinern wollen erstmal auf Fehlern überprüfen
e2fsck -f /dev/VM2-vg/root
Jetzt verkleinern wir die Root Partition
resize2fs /dev/VM2-vg/root 8G
danach verkleinern wir die Root LV
lvreduce -L 8.5G /dev/VM2-vg/root
Jetzt nochmal die Root Partition ändern
resize2fs /dev/VM2-vg/root
auf Fehlern überprüfen
e2fsck -f /dev/VM2-vg/root
Jetzt können wir die LVMs deaktivieren und entfernen
vgchange -an
kpartx -dv /dev/sunny/VM2
Nachher, die Machine booten und folgendes Befehl innerhalb VM2 eingeben:
pvs -v --segments /dev/sda5
root@VM2 ~ # pvs -v --segments /dev/sda5
DEGRADED MODE. Incomplete RAID LVs will be processed.
Wiping cache of LVM-capable devices
Using physical volume(s) on command line
PV VG Fmt Attr PSize PFree Start SSize LV Start Type PE Ranges
/dev/sda5 VM2-vg lvm2 a-- 19,76g 10,41g 0 2176 root 0 linear /dev/sda5:0-2175
/dev/sda5 VM2-vg lvm2 a-- 19,76g 10,41g 2176 2664 0 free
/dev/sda5 VM2-vg lvm2 a-- 19,76g 10,41g 4840 218 swap_1 0 linear /dev/sda5:4840-5057
root@VM2 ~ # sudo pvmove --alloc anywhere /dev/sda5:4840-5057
/dev/sda5: Moved: 0,0%
/dev/sda5: Moved: 50,5%
/dev/sda5: Moved: 100,0%
sudo pvmove --alloc anywhere /dev/sda5:yyyy-end
Nachher die VM2 mit GParted booten um die physikalischen Volumen zu verkleinern.
und am Schluss die LVM selber auf dem Host verkleinern.
lvreduce -L 10G /dev/VM2