Zur Zeit nutzen die meisten Menschen virtio-blk als Storage Treiber unter Qemu. Möchte man aber neuere Storage Backends wie Ceph oder Trim Support, wird virtio-scsi benötigt. Die nötigen Anpassungen in der Domain.xml via virsh edit Domain
sind schnell erledigt. Hier ein Beispiel, zuerst der alte Zustand:
<disk type='block' device='disk'> <driver name='qemu' type='raw'/> <source dev='/dev/vg0/puppet'/> <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> </disk> <controller type='pci' index='0' model='pci-root'/>
Und hier einmal die neue Version:
<disk type='block' device='disk' discard='unmap'> <driver name='qemu' type='raw' /> <source dev='/dev/vg0/puppet'/> <target dev='sda' bus='scsi'/> <boot order='2'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <controller type='scsi' index='0' model='virtio-scsi' />
Außerdem sollte man seine /etc/fstab
überprüfen und ggf. hardcoded Storage-Pfade austauschen gegen UUIDs:
proc /proc proc defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 tmpfs /dev/shm tmpfs defaults 0 0 sysfs /sys sysfs defaults 0 0 /dev/sda1 /boot ext3 defaults 0 0 /dev/sda2 / ext3 defaults 0 0
wird also zu:
proc /proc proc defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 tmpfs /dev/shm tmpfs defaults 0 0 sysfs /sys sysfs defaults 0 0 UUID="aa1dae6f-4d64-4c84-8010-411e4f149e2f" /boot ext3 defaults 0 0 UUID="8cba5df0-971c-49ed-a281-faf73b2e2a19" / ext3 defaults 0 0
In der Grub Konfiguration ist es ebenfalls möglich dass der Storage-Pfad hardcoded ist, dies kann man überprüfen mit folgendem Befehl:
grep root= /boot/grub2/grub.cfg
Wenn dort noch keine UUIDs angegeben sind kann man Grub dazu veranlassen diese einzutragen, einfach GRUB_DISABLE_LINUX_UUID=false
in die /etc/default/grub
und danach folgenden Befehl ausführen:
grub2-mkconfig -o /boot/grub2/grub.cfg
Falls Dracut nicht automatisch die richtigen Kernelmodule lädt kann man dies noch erzwingen, dazu muss man in die /etc/dracut.conf
folgendes eintragen:
add_drivers+="virtio_balloon virtio_net virtio_blk virtio_pci virtio_ring virtio virtio-scsi"
Danach müssen die initrds neugebaut werden, dies geschieht so.
Sollte dies immer noch nicht reichen um eine bootbare VM zu erzeugen muss man ggf. noch folgendes beachten.
Wenn man nun eine erfolgreich gebootete VM hat kann man die discard mount option setzen:
proc /proc proc defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 tmpfs /dev/shm tmpfs defaults 0 0 sysfs /sys sysfs defaults 0 0 UUID="aa1dae6f-4d64-4c84-8010-411e4f149e2f" /boot ext3 defaults,discard 0 0 UUID="8cba5df0-971c-49ed-a281-faf73b2e2a19" / ext3 defaults,discard 0 0
Diese Mountoption in Kombination mit virtio-scsi und der Option discard=’unmap’ sorgt dafür, dass das Betriebssystem in der VM regelmäßig leere Blöcke freigibt und dies an das Hostsystem durchreicht. Thin provisioned LVM2 Volumes, QCOW2 und RAW Images sowie Ceph RBDs können somit online shrinken. Windows unterstützt dies aktuell leider nicht.
Eventuell möchte man nicht automatisch Blöcke freigeben, dafür gibt es das Tool fstrim
, dies kann man alternativ zur Mountoption nutzen.
Pingback: Cloud Instanzen optimieren | the world needs more puppet!