CentOS VM von virtio-blk auf virtio-scsi umstellen inkl. discard

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.

This entry was posted in General, Nerd Stuff, Virtualization. Bookmark the permalink.

One Response to CentOS VM von virtio-blk auf virtio-scsi umstellen inkl. discard

  1. Pingback: Cloud Instanzen optimieren | the world needs more puppet!

Leave a Reply

Your email address will not be published. Required fields are marked *

Time limit is exhausted. Please reload CAPTCHA.