Hintergrund
Bei einem meiner virtuellen Xen-Server musste seine 400-GB-Festplatte über das Wochenende aufgeteilt und in der Größe angepasst werden, und ich wollte die Ausfallzeit auf ein Minimum beschränken. Auf der Festplatte wurden 240 GB verwendet, von denen 235 GB ein /backup-Verzeichnis waren und die restlichen 5 GB einer regulären Debian-Linux-Installation gewidmet waren. Ich wollte die Festplatte in zwei Festplatten aufteilen - eine 20-GB-Festplatte mit dem Linux-System und eine 300-GB-Festplatte zum Mounten als /backup. Dann könnte ich mein DRBD-Setup anwenden, um diese 300-GB-Sicherungspartition auf eine separate zweite Sicherungsmaschine zu replizieren.
Ich wollte nicht in eine Situation geraten, in der ich eine Menge Daten auf den physischen Host kopieren muss, und ich wollte auf keinen Fall, dass die virtuelle Maschine währenddessen heruntergefahren wird.
Bilder einrichten
Das Festplatten-Image der virtuellen Maschine befindet sich in /vm/domains/b1/disk.img und eine begleitende Datei swap.img, um die wir uns keine Sorgen machen müssen.
Problem:
losetup -a
Zum Auffinden aller verwendeten Loop-Geräte. In meinem Fall war /dev/loop20 das erste freie Gerät. Als Nächstes richte ich ein Loopback-Gerät für das Image ein und mounte es dann:
mkdir -p /mnt/loop-copy-from /mnt/loop-copy-to
losetup /dev/loop20 /vm/domains/b1/disk.img
mount /dev/loop20 /mnt/loop-copy-from
Ein neues leeres Sparse-Image erstellen
Jetzt werden wir nicht /backup verschieben, sondern alles andere auf das neue 20G-Image verschieben. Wir erstellen eine Sparse-Image-Datei von 20 GB mit:
dd if=/dev/zero of=/vm/domains/b1/disk-root.img bs=1k count=1 seek=$(((20*1024*1024)-1))
Als nächstes müssen wir ein neues Loop-Gerät einrichten, ein Dateisystem erstellen und schließlich dieses neue Image mounten
losetup /dev/loop21 /vm/domains/b1/disk-root.img
mkfs.ext3 /dev/loop21
mount /dev/loop21 /mnt/loop-copy-to
Root-Dateisystem kopieren
Jetzt kopiere ich alles von /mnt/loop-copy-from nach /mnt/loop-copy-to neben dem 235G-Sicherungsverzeichnis:
rsync -arplogu --exclude "/backup" --stats --progress /mnt/loop-copy-from/ /mnt/loop-copy-to
Vorhandenes Dateisystem bereinigen
Ich möchte alles auf /mnt/loop-copy-from außer dem Backup-Verzeichnis entfernen:
cd /mnt/loop-copy-from; ls | grep -v 'Sicherung' | xargs rm -rf
Wir werden dann beide Geräte unmounten:
umount /mnt/loop-copy-from
umount /mnt/loop-copy-to
Vorhandenes Dateisystem verkleinern
Ich muss jetzt /dev/loop20 von 400G auf 300G verkleinern:
e2fsck -f /dev/loop20
resize2fs /dev/loop20 300G
Startdaten kopieren
Kopieren Sie dann die Boot-Daten, bevor Sie die Loopback-Geräte zerstören:
dd if=/dev/loop20 of=/dev/loop21 bs=1 count=512
losetup -d /dev/loop20
losetup -d /dev/loop21
Xen-Konfiguration und VM-Boot
Bearbeiten Sie nun die Xen-VM-Konfigurationsdatei, in meinem Fall /etc/xen/b1.cfg, und ändern Sie:
disk = [ 'file:/vm/domains/b1/disk.img,xvda2,w', 'file:/vm/domains/b1/swap.img,xvda1,w', ]
Mit:
disk = [ 'file:/vm/domains/b1/disk-root.img,xvda2,w', 'file:/vm/domains/b1/disk.img,xvda3,w', 'file:/vm/domains/b1/swap.img,xvda1,w', ]Und schlussendlich:
xm b1.cfg erstellen
Links
IO Digital Sek.
Debian Wheezy XEN + Gasteinrichtung