Archivo

Entradas Etiquetadas ‘KVM’

Cambiando prioridades de CPU e IO en KVM

jueves, 7 de mayo de 2020 Sin comentarios

En Proxmox creo recordar que se podía limitar el % de uso de la CPU de forma individual en cada máquina virtual. Como sustituto o equivalencia me topé con un script de Stuart Hopkins que a partir de un fichero de configuración permitía ajustar con el comando «nice» la prioridad del proceso de cada una de las instancias de nuestro KVM. Jim Klimov por su parte mejoró el script para permitir definir además qué prioridad de acceso al disco tendría cada una de esas instancias, completando de esa forma la funcionalidad del script.

El fichero de configuración tendría el siguiente aspecto:

### Note: comments or config lines from here on, e.g. no empty lines!
#
# KVM VM Priorities (NAME|NICEPRIO|IOCLASS|IOPRIO)
# IOCLASS – 1=realtime, 2=best-effort, 3=idle
# IOPRIO – 0=highest, 7=lowest
#
# e.g. MYVM|15|3|7
#
521-MaquinaVirtual|10|3|7

Por un lado tendría el nombre de la máquina virtual a la que le deseo aplicar los cambios «202-MaquinaVirtual», el «nice» a aplicar sería de 10 (-20 es la prioridad más alta, 19 la menor y 0 la por defecto), la clase de acceso al disco la mantendríamos en «idle» para que dejase paso al resto de procesos y una prioridad de 7 que es la más baja. Con todo ello pretendo que la máquina virtual suponga el menor impacto sobre los discos y que tenga un consumo de CPU moderado cuando tenga que compartirla.

Dicho lo anterior, en mi caso el script no me funcionaba porque no era capaz de leer el PID de mi máquina virtual, ya que el comando «ps» lo mostraba de la siguiente forma:

qemu-system-x86_64 -enable-kvm -name guest=521-MaquinaVirtual,debug-threads=on -S -object secret,………..

Así que cambié la línea que extrae el nombre de la máquina virtual que en un origen era así:

vm_name=$(ps -o cmd -p $vm_pid 2>/dev/null | tail -n 1 | sed -e ‘s/^[^0-9a-zA-Z]*//g’ | sed -e ‘s/^.*-name\ \([a-zA-Z0-9]*\).*/\1/’ 2>/dev/null)

Por esta otra:

vm_name=$(ps -o cmd -p $vm_pid 2>/dev/null | tail -n 1 | sed -e ‘s/^[^0-9a-zA-Z]*//g’ | awk ‘{print $4}’ 2>/dev/null| awk -F’=’ ‘{print $2}’ 2>/dev/null|awk -F’,’ ‘{print $1}’ 2>/dev/null)

No sé si será igual para todo el mundo o afecta sólo a mi configuración, pero el script es sencillo de entender y editar para ajustarlo a las necesidades de cada uno.

Y, por supuesto, con tenerlo en cron para que ajuste la configuración por si hemos reiniciado alguna máquina no cuesta mucho.

Sustituyendo NFS por sistema de archivos 9p de KVM

lunes, 4 de mayo de 2020 Sin comentarios

En una de las máquinas virtuales tenía funcionando dos aplicaciones que hacían uso intensivo de lectura/escritura de información que tengo almacenada en una unidad NFS. Toda esa actividad acababa generando un consumo considerable de CPU y, de alguna forma, mayor actividad en los discos duros de lo que sería normal.

Opté por añadir un sistema de ficheros compartido entre el sistema anfitrión e invitado para intentar no poner por medio el servicio NFS. El sistema de ficheros sería de tipo «mapped» lo que nos llevaría a una serie de inconvenientes en cuanto a permisos en los ficheros creados pero que nos dejaría escribir sin mayores problemas:

<filesystem type=»mount» accessmode=»mapped»>
<source dir=»/mnt/unidadCompartida»/>
<target dir=»unidadCompartida»/>
<alias name=»fs0″/>
<address type=»pci» domain=»0x0000″ bus=»0x00″ slot=»0x08″ function=»0x0″/>
</filesystem>

Para montar la unidad en el sistema invitado sólo hay que añadir la siguiente línea en el fichero «/etc/fstab»:

unidadCompartida /mnt/unidadCompartida 9p trans=virtio,version=9p2000.L,cache=mmap,rw 0 0

Hay que tratar de recordar añadir las opciones de «version=9p2000.L,cache=mmap» para evitar problemas con aplicaciones como «rtorrent» cuyo log nos devolvería lo siguiente:

Could not create: memory:524288 block:1 errno:22 errmsg:Invalid argument.

Para arreglar el tema de permisos en la carpeta compartida, como desde un primer momento no tuve la previsión de hacerlo de este modo, lo arreglé con una pequeña tarea en el Cron del sistema anfitrión:

*/15 * * * * /bin/chmod 777 -R /mnt/unidadCompartida/

De este modo, cada 15 minutos, se le otorga permisos a todo el mundo sobre el contenido de dicha carpeta para que otras máquinas puedan acceder a él sin problemas. Obviamente, se tiene que saber lo qué se hace y almacena en dicha carpeta, porque un 777 abarca mucho.

Contenedores LXC desde Virtual Machine Manager

sábado, 4 de abril de 2020 Sin comentarios

En una entrada anterior comenté la sustitución de Proxmox por Virtual Machine Manager y me quedó por indicar cómo administrar desde él el servicio LXC de forma remota. Y es que no permite la creación del sistema de ficheros raíz de nuestro nuevo contenedor de forma remota, por lo que hay que proveerle la ruta en la que se encuentra. Al final opté por una solución relativamente sencilla: instalar lxc pero no habilitarlo, simplemente usarlo para descargar nuestros sistemas de ficheros raíz:

apt install lxc
lxc-create -n ubuntu1804 -t download

Nos mostrará un listado y, en mi caso, seleccioné descargar una Ubuntu Bionic para arquitectura AMD64. Después, simplemente hice una copia para utilizarla para un servidor Seafile, dejando la descargada para usarla como plantilla cada vez que necesitase un nuevo contenedor:

cp -a /var/lib/lxc/ubuntu1804/rootfs/* /lxc/001-seafile/

El problema es que lo que hemos descargado es un sistema Ubuntu cuyo usuario root no tiene contraseña. Para resolverlo deberemos cargar el sistema y asignarle una contraseña:

chroot /lxc/001-seafile/

passwd

exit

Ahora sencillamente podríamos desinstalar el paquete «lxc» y simplemente utilizar nuestra plantilla.

Averiguar la dirección IP de una máquina virtual con KVM

sábado, 4 de abril de 2020 Sin comentarios

Con el siguiente comando el enlace de red disponible:

virsh net-list

Sabiendo el nombre del mismo («default») podremos encontrar más detalles:

virsh net-info default

Y lo interesante será que nos muestre las IP asignadas con el DHCP interno a cada una de las máquinas virtuales que tengamos:

virsh net-dhcp-leases default

Si la máquina virtual no está utilizando el DHCP interno, podemos sacar un listado de los nombres de nuestras máquinas con el siguiente comando:

virsh list

Sabiendo el nombre de la máquina (en nuestro caso suponemos que sea «Windows10») que nos interesa ejecutaremos el siguiente comando:

arp -an | grep `virsh dumpxml Windows10 | grep «mac address» | awk -F\’ ‘{ print $2}’`

Categories: Virtualización Tags: , , ,

Acceso a discos KVM

sábado, 4 de abril de 2020 Sin comentarios

Para acceder a unidades de disco utilizadas por máquinas virtuales KVM sólo tenemos que seguir algunos sencillos pasos.

Lo primero es identificar la primera unidad loopback disponible:

losetup -f

Asociaremos la unidad que nos devuelve el paso anterior con nuestra imagen de disco:

losetup /dev/loop0 /rutaKVM/discoWindows.img

A continuación podremos identificar las particiones contenidas en el fichero anterior:

kpartx -av /dev/loop0

Podemos visualizar las particiones mapeadas con el siguiente comando:

ls -la /dev/mapper/

Y al final podremos montarla del siguiente modo:

mount /dev/mapper/loop0p2 /mnt/virtualHDD/

Cuando hayamos terminado de trabajar con la unidad de disco virtual desharemos lo hecho:

umount /mnt/virtualHDD/

kpartx -dv /dev/loop0

losetup -d /dev/loop0

Si lo que tenemos es un disco con formato «qcow2» podemos recurrir a otra estrategia. Habilitamos el módulo NBD (Network Block Devices):

modprobe nbd max_part=8

Conectamos al dispositivo como si fuese una unidad de red:

qemu-nbd –connect=/dev/nbd0 /rutaKVM/discoWindows.qcow2

Buscamos las particiones del disco:

fdisk /dev/nbd0 -l

Montamos la que deseemos:

mount /dev/nbd0p1 /mnt/virtualHDD/

Y para cuando terminemos, deshacemos lo hecho:

umount /mnt/virtualHDD/
qemu-nbd –disconnect /dev/nbd0
rmmod nbd

Configuración de LibreElec en KVM

lunes, 23 de marzo de 2020 Sin comentarios

Para lograr realizar un passthrough de la tarjeta gráfica (en este caso una Nvidia GTX 1050Ti) y que no se nos quede la pantalla en negro en el arranque de LibreElec hay que seguir una serie de pautas.

Primero necesitamos ocultar al sistema invitado (guest) que está siendo virtualizado, ya que a Nvidia no le gusta que sus tarjetas gráficas domésticas sean usadas en paravirtualización, porque para ello ya comercializa tarjetas más enfocadas al sector servidor.

Por eso ejecutaremos el comando «virsh edit 200-LibreElec» para editar la configuración de nuestra máquina llamada «200-LibreElec». Añadiremos los siguientes campos:

<features>
<acpi/>
<apic/>
<hyperv>
<relaxed state=’on’/>
<vapic state=’on’/>
<spinlocks state=’on’ retries=’8191’/>
<vendor_id state=’on’ value=’123456789ab’/>
</hyperv>
<kvm>
<hidden state=’on’/>
</kvm>
<vmport state=’off’/>
<ioapic driver=’kvm’/>
</features>

Por otro lado, si tenemos problemas con el sonido por HDMI hay una fácil solución. Editaremos el fichero «/etc/modprobe.d/snd-hda-intel.conf» de nuestra máquina virtual y pondremos lo siguiente:

options snd-hda-intel enable_msi=1

Reiniciar y listo.

Sustituyendo Proxmox por una Ubuntu Server con KVM

lunes, 23 de marzo de 2020 Sin comentarios

Debido al hardware específico (HP Miniserver Gen8) que tengo y que para poder resolver los problemas de su BIOS con la paravirtualización se necesita aplicar un parche en el kernel que me dejó de funcionar en Proxmox en la última actualización, pues decir librarme de la comodidad de Proxmox en busca de algo más flexible.

Quería una distribución con software relativamente actualizado y documentado en el que me sintiese cómodo. Opté por una Ubuntu 18.04 para servidores que, aunque no está entre mis favoritas para el uso cotidiano, es bastante cómoda para funciones de servidor.

Software de virtualización

Después de la instalación básica necesitaba una serie de herramientas para virtualizar máquinas:

apt-get install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils

adduser `id -un` libvirt

Preparación previa del hardware

Hice que no cargase ningún driver de la gráfica a la que tenía pensada hacerle passthrough :

echo blacklist nouveau > /etc/modprobe.d/blacklist-nvidia-nouveau.conf

echo options nouveau modeset=0 >> /etc/modprobe.d/blacklist-nvidia-nouveau.conf

echo blacklist snd_hda_intel > /etc/modprobe.d/blacklist-nvidia-nouveau.conf

Con el comando «lpsci -nn» encontré los datos de la gráfica que me interesaban:

07:00.0 VGA compatible controller [0300]: NVIDIA Corporation GP107 [GeForce GTX 1050 Ti] [10de:1c82] (rev a1)
07:00.1 Audio device [0403]: NVIDIA Corporation GP107GL High Definition Audio Controller [10de:0fb9] (rev a1)

Y edité el fichero de configuración de Grub «/etc/default/grub»:

GRUB_CMDLINE_LINUX=»intel_iommu=on vfio_pci.ids=10de:1c82,10de:0fb9″

Para terminar de curarme en salud, creé el fichero «/etc/modprobe.d/vfio_pci.conf»:

options vfio_pci ids=10de:1c82,10de:0fb9

Y edité el de «/etc/initramfs-tools/modules»:

vfio
vfio_iommu_type1
vfio_virqfd
options vfio_pci ids=10de:1c82,10de:0fb9
vfio_pci ids=10de:1c82,10de:0fb9
vfio_pci

¿Excesivo? Puede ser. Quizás sobrase con sólo haber editado el fichero de Grub, pero se llega a un punto en el cual has dado tantas vueltas sobre lo mismo que no te fías con hacer lo mínimo indispensable.

Finalmente toca rehacer el arranque con los siguientes comandos:

update-grub
update-initramfs -u

Compilación del kernel

Editamos las fuentes de apt para poder descargar el fuente del software «/etc/apt/sources.list»:

deb-src http://es.archive.ubuntu.com/ubuntu/ bionic main restricted

deb-src http://es.archive.ubuntu.com/ubuntu/ bionic-updates main restricted

Descargamos el software necesario:

apt update

apt-get build-dep linux linux-image-$(uname -r) git fakeroot dkms default-jdk

Es posible que nos topemos con el siguiente error:

la descarga se realiza de forma desprotegida como superusuario, ya que al archivo «linux-signed_4.15.0-91.92.dsc» el usuario «_apt» no pudo acceder. – pkgAcquire::Run

Para solventarlo nos basta con hacer lo siguiente:

chown _apt /var/lib/update-notifier/package-data-downloads/partial/

Dentro de la carpeta «/usr/src/» descargaremos los fuentes del kernel de Ubuntu Bionic:

git clone git://kernel.ubuntu.com/ubuntu/ubuntu-bionic.git

Editaremos el fichero «/usr/src/ubuntu-bionic/drivers/iommu/intel-iommu.c» donde pone:

if (device_is_rmrr_locked(dev)) {
dev_warn(dev, «Device is ineligible for IOMMU domain attach due to platform RMRR requirement. Contact your platform vendor.\n»);
return -EPERM;
}

Pondremos lo siguiente:

if (device_is_rmrr_locked(dev)) {
dev_warn(dev, «Device is ineligible for IOMMU domain attach due to platform RMRR requirement. PARCHEADO.\n»);
}

En este paso, si tratamos de compilar el kernel nos encontraremos con un error relacionado con el script «ubuntu-bionic/debian/scripts/retpoline-check» y que tuve que modificar de este código:

count=$( diff -u «$prev» «$curr» | grep ‘^+[^+]’ | wc -l )
if [ «$count» != 0 ]; then
rc=1

A este otro:

count=$( diff -u «$prev» «$curr» | grep ‘^+[^+]’ | wc -l )
if [ «$count» != 0 ]; then
rc=0

Sé que está relacionado con las mitigaciones sobre las CPU de Intel pero no es algo que en esta máquina me importase mucho.

Desde el directorio de «/usr/src/ubuntu-bionic» lancé la compilación que duró un periodo de tiempo considerable:

fakeroot debian/rules clean

fakeroot debian/rules binary

De dicho proceso se generaron una serie de paquetes .deb que instalé:

dpkg -i *.deb

Una vez instalado el kernel modificado, ahora sólo necesitaba que el equipo siempre arrancase con él, con lo que había que realizar algunos cambios en el cargador de arranque. Para saber qué modificaciones tenía que aplicar lancé el siguiente comando:

sed -nre «/submenu|menuentry/s/(.? )'([^’]+)’.*/\1 \2/p» < /boot/grub/grub.cfg

Me devolvió el listado visual de Grub que tenía que tener en cuenta:

menuentry Ubuntu
submenu Opciones avanzadas para Ubuntu
menuentry Ubuntu, con Linux 4.15.0-91-generic
menuentry Ubuntu, con Linux 4.15.0-91-generic (recovery mode)
menuentry Ubuntu, con Linux 4.15.0-88-lowlatency
menuentry Ubuntu, con Linux 4.15.0-88-lowlatency (recovery mode)
menuentry Ubuntu, con Linux 4.15.0-88-generic
menuentry Ubuntu, con Linux 4.15.0-88-generic (recovery mode)
menuentry Ubuntu, con Linux 4.15.0-76-generic
menuentry Ubuntu, con Linux 4.15.0-76-generic (recovery mode)

Entonces edité el fichero «/etc/default/grub» acorde:

GRUB_DEFAULT=»Opciones avanzadas para Ubuntu>Ubuntu, con Linux 4.15.0-88-generic«

Y además bloquee la posibilidad de que sufriese cambios a través de alguna actualización del gestor de paquetes y regeneré la configuración de Grub:

apt-mark hold 4.15.0-88-generic

update-grub

Si en un futuro queremos actualizar el kernel, para desbloquear el que tenemos modificado bastará con lanzar el comando «apt-mark unhold 4.15.0-88-generic».

Tras un reinicio del equipo y con el comando «dmesg | grep -i vfio» deberíamos poder ver lo siguiente:

[230727.140577] vfio-pci 0000:07:00.1: Device is ineligible for IOMMU domain attach due to platform RMRR requirement. PARCHEADO.
[230727.730169] vfio_ecap_init: 0000:07:00.0 hiding ecap 0x19@0x900

Configuración del puente de red

Para que las máquinas virtuales puedan tener acceso directo a nuestra y así poder hacer uso de los recursos que en ella se encuentran hay que configurar un puente de red. Modificaremos el fichero «/etc/netplan/01-netcfg.yaml»:

network:
version: 2
renderer: networkd

ethernets:
eno2:
dhcp4: false
dhcp6: false

bridges:
br0:
interfaces: [eno2]
addresses: [192.168.1.10/24]
gateway4: 192.168.1.1
mtu: 1500
nameservers:
addresses: [192.168.1.1]
parameters:
stp: true
forward-delay: 4
dhcp4: no
dhcp6: no

El dispositivo «eno2» sería nuestra tarjeta de red con conectividad y «br0» sería al puente hacia nuestras máquinas virtuales. Hay que tener en cuenta que yo he preferido establecer una IP fija para mi tarjeta con conectividad física pero se podría haber dejado con DHCP.

Gestión web del servidor

Para poder gestionar de manera fácil el servidor a través de un entorno web, he optado por hacer uso de Cockpit, el cual se puede instalar de la siguiente forma:

apt install cockpit cockpit-machines cockpit-docker cockpit-system cockpit-packagekit

Ahora podremos gestionar el servidor desde http://127.0.0.1:9090

Gestión de las máquinas virtuales

Si bien se pueden gestionar las máquinas virtuales de Cockpit de manera fácil, el interfaz es algo limitado con respecto a lo que podía hacer con Proxmox. Pero esto es fácilmente solucionable si las gestionamos desde Virtual Machine Manager, un software que puede estar instalado en nuestro sobremesa o portátil y que permite gestionar tanto las máquinas virtuales en local como remotas.

Redimensión de pantalla de la máquina invitada en KVM

lunes, 21 de agosto de 2017 Sin comentarios

Las características que provee SPICE a KVM resultan de los más prácticas, pero no funcionan del todo si en la máquina invitada no instalamos su parte del software y tampoco hay que olvidar la necesidad de configurar la máquina para indicarle que haga uso de él.

A fin de cuentas es lo primero que echamos de menos aquellos que venimos de las Guest Additions de VirtualBox o las VMware Tools.

Categories: Virtualización Tags: ,

Redirección de puertos USB en KVM

lunes, 21 de agosto de 2017 Sin comentarios

Ante la necesidad de querer redireccionar un dispotivo USB a nuestra máquina KVM nos podemos encontrar con un error similar al siguiente:

spice-client-error-quark: Could not redirect Nombre Del Dispositivo [0da4:0116] at 3-5: Error setting USB device node ACL: ‘Error setting facl: Operation not permitted’ (0)

Fácilmente lo podremos corregir utilizando el siguiente comando:

sudo chmod u+s /usr/bin/spice-client-glib-usb-acl-helper

Si además no queremos que nos pregunte por la contraseña de administrador cada vez que queramos realizar la redirreción del puerto USB, tendremos que modificar el fichero «/usr/share/polkit-1/actions/org.spice-space.lowlevelusbaccess.policy», donde cambiaremos lo siguiente:

<allow_any>auth_admin</allow_any>
<allow_inactive>no</allow_inactive>
<allow_active>auth_admin</allow_active>

Por esto:

<allow_any>yes</allow_any>
<allow_inactive>no</allow_inactive>
<allow_active>yes</allow_active>

Categories: GNU/Linux, Virtualización Tags: ,

KVM con problemas de conexión a la red

lunes, 3 de abril de 2017 Sin comentarios

Si cuando vamos a utilizar KVM, nos salta el siguiente mensaje de error:

Error starting domain: Requested operation is not valid: network ‘default’ is not active

Primeramente deberemos comprobar el estado de las conexiones:

virsh net-list –all

Dicho comando nos mostrará algo similar a esto:

Nombre               Estado     Inicio automático Persistente
———————————————————-
default              inactivo   no            si

Efectivamente el estado inactivo es el que debemos cambiar para resolver el problema. Para ello sólo tendremos que ejecutar lo siguiente:

virsh net-start default

Para más información podéis consultar el artículo original de donde saqué la solución.

Categories: Virtualización Tags: ,