Añadir un nuevo disco a una máquina virtualizada con KVM

NOTA: sólo válido para discos con bus virtio

Como indicaba en otro post, hago backups de las máquinas virtuales con pigz. Para que los backups sean de poco tamaño, lo mejor es tener un volumen lógico de poco tamaño para los archivos del sistema de la máquina virtual y luego añadir otro LV de gran tamaño y montarlo dentro de la VM.

Si ya tenemos la VM y queremos añadir un nuevo disco para tener más capacidad y que no afecte al backup, crearemos un nuevo volumen lógico de 100GB para usarlo dentro de la VM:

lvcreate -L100G -ndebian-mnt vg0

Crearemos un archivo XML indicando los parámetros que serán pasados con virsh a la VM:

vi /tmp/disconuevo.xml
<disk type='block' device='disk'>
<driver name='qemu' type='raw' cache='none'/>
<source dev='/dev/vg0/debian-mnt'/>
<target dev='vdb' bus='virtio'/>
</disk>

Ahora, incluso con la VM corriendo, se puede añadir este disco en caliente:

virsh attach-device --persistent Dominio /tmp/disconuevo.xml

--persistent hace que se modifique el Dominio permanentemente con este nuevo disco.

Fuente: http://serverfault.com/questions/457250/kvm-and-libvirt-how-do-i-hotplug-a-new-virtio-disk

Crear backup de un LVM snapshot con pigz

Un LVM snapshot crea una “imagen” de cualquier volumen lógico que tengamos. Esta “imagen” es como si tuviera todos los datos del volumen lógico cuando se creó el snapshot. NOTA: los snapshots no están destinados a ser usados directamente como backups, porque repercuten negativamente en el rendimiento del disco (cada modificación en el LV, tiene que actualizarse el snapshots)

Esto es bueno para hacer backups de, por ejemplo, una máquina virtualizada con KVM y que use como disco (block) un volumen lógico dentro de la máquina host. Lo que se hace es crear el LVM snapshot (que tarda un par de segundos como mucho) y ya se tiene una “instantánea” de la máquina virtualizada con KVM lista para poder hacer backup.

Para comprimir usaremos pigz, que es una modificación de gzip pero que aprovecha todos los cores/threads de la máquina para comprimir más rápido. Hice pruebas y donde gzip tardaba unos 15 minutos, pigz lo hacía en unos 4 minutos.

Comando para crear un snapshot Debian-snapshot, de un volumen lógico debian y de tamaño máximo de cambio con respecto al volumen original de 1GB:

lvcreate --snapshot -L1G -nDebian-snapshot /dev/vg0/debian

Se puede comprobar que está bien creado con lvs

Ahora, con el snapshot creado, lo comprimimos con pigz:

</dev/vg0/Debian-snapshot pigz -c > /path/to/backup/debian.gz

Ahora ya tenemos el archivo comprimido y podemos hacer con él lo que queramos: cifrarlo con gnupg, enviarlo a un equipo remoto, etc.

Finalmente, hay que borrar el snapshot para que no perjudique al rendimiento del disco:

lvremove -f /dev/vg0/Debian-snapshot

Expandir una imagen de disco de un KVM guest con virt-resize

Necesitamos que la imagen del disco del KVM guest esté en un volumen lógico (LV).

Supongamos que queremos expandir a 100GB la siguiente imagen:

root:~# virt-df -h /dev/vg0/debian
Filesystem                                Size       Used  Available  Use%
debian:/dev/sda1                           28G       4.2G        22G   16%

El tamañan actual de /dev/sda1 es 28GB y queremos pasarlo a 100GB.

Primero apagamos la máquina virtual. Luego hacemos backup de la imagen (lvrename es como un mv):

lvrename /dev/vg0/debian /dev/vg0/debian.backup

Creamos el nuevo disco:

lvcreate -L100G -ndebian vg0

Ahora redimensionamos /dev/sda1 con virt-resize:

virt-resize /dev/vg0/debian.backup /dev/vg0/debian --expand /dev/sda1

Ya tenemos la imagen que contiene la máquina virtual con un tamaño de 100GB. Lo que hace falta ahora es expandir también el filesystem de la máquina virtual para que aproveche todo el espacio. Para esto usaremos la aplicación guestfish (disponible en Debian Wheezy y Sid), aunque sólo es válido para particiones con ext2, ext3 y ext4:

guestfish -a /dev/vg0/debian

Esto lanzará un command line donde pondremos lo siguiente (ojo ahora al device, puede que ya no sea /dev/sda1 y sea /dev/vda1, por ejemplo):

run
resize2fs /dev/vda1
exit

Si todo ha ido bien, ya tendremos la máquina virtual con 100GB de disco. Si arranca sin problemas, podremos borrar el backup que hicimos al principio:

lvchange -an /dev/vg0/debian.backup
lvremove /dev/vg0/debian.backup

Fuente: http://askaralikhan.blogspot.com.es/2011/07/expanding-kvm-guest-disk-image-using.html

Crear un volumen LVM

Primero debemos inicializar una partición: pvcreate /dev/sdb1

Después crear un volume group: vgcreate vg0 /dev/sdb1

Ahora ya podemos crear un volumen: lvcreate -L10G -nnombre vg0

Esto creará un device en /dev/mapper/vg0-nombre (también accesible como /dev/vg0/nombre) de 10GB.

Si queremos usar este volumen para montarlo en, por ejemplo /mnt/nombre con ext4 como filesystem, haremos lo siguiente:

mkdir -p /mnt/nombre
mke2fs -j -t ext4 /dev/vg0/nombre
mount /dev/vg0/nombre /mnt/nombre

Fuente: http://kirriwa.net/john/doc/lvm+raid1.html