Archivo

Archivo para la categoría ‘Virtualización’

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.

GPU passthrough en Proxmox

lunes, 12 de agosto de 2019 2 comentarios

Después de haber instalado Proxmox en un HP Gen8, mi intención era la de virtualizar LibreElenc para utilizarlo como centro multimedia y un Windows 10 para poder hacer uso de mi biblioteca de Steam. Tras un poco de modding en la pequeña torre e incorporar una GTX 1050Ti (concretamente la Gigabyte GV-N105TOC-4GL) me quedaba por delante configurar Proxmox para permitir dejar paso directo de la tarjeta gráfica a los sistemas virtualizados.

Configuración de la máquina virtual

Para ello la máquina virtual debía incorporar en su fichero de configuración («/etc/pve/qemu-server/100.conf») las siguientes opciones:

  • machine: q35
  • hostpci0: 07:00,pcie=1,x-vga=on

La segunda opción depende de cada equipo y es el resultado de haber obtenido lo siguiente tras lanzar el comando «lspci»:

07:00.0 VGA compatible controller: NVIDIA Corporation GP107 [GeForce GTX 1050 Ti] (rev a1)
07:00.1 Audio device: NVIDIA Corporation GP107GL High Definition Audio Controller (rev a1)

Error al arrancar la máquina virtual

Cuando intentemos arrancar la máquina virtual, lo más probable es que nos indique lo siguiente:

vfio: failed to set iommu for container: Operation not permitted

Lo que parece en principio un problema de permisos tiene un trasfondo más complejo que afecta al kernel y que podemos comprobar con el comando «dmesg | grep -e DMAR -e IOMMU» que nos devolverá lo siguiente:

vfio-pci 0000:07:00.1: Device is ineligible for IOMMU domain attach due to platform RMRR requirement. Contact your platform vendor.

Recompilación del kernel

La forma de solucionar el problema es recompilando el kernel tras haber incorporado un pequeño parche al mismo.

Actualizaremos el sistema e instalaremos los paquetes que vamos a necesitar:

  • apt-get update
  • apt-get install git nano screen patch fakeroot build-essential devscripts libncurses5 libncurses5-dev libssl-dev bc flex bison libelf-dev libaudit-dev libgtk2.0-dev libperl-dev libperl-dev asciidoc xmlto gnupg gnupg2 rsync lintian debhelper libibery-dev libdw-dev libnuma-dev libsplang2-dev libiberty-dev libslang2-dev debhelper sphinxdoc-common
  • apt-get install lz4 (si utilizamos los fuentes de Ubuntu EOAN de la versión 5.4 del kernel de Proxmox)
  • apt-get install pve-headers-5.4.24-1-pve (la versión dependerá del kernel que estemos tratando de compilar)

Descargaremos el código fuente del kernel que vamos a recompilar y de aquel de donde sacaremos el parche:

  • cd /usr/src/
  • git clone git://git.proxmox.com/git/pve-kernel.git
  • git clone git://git.proxmox.com/git/mirror_ubuntu-disco-kernel.git
  • mv mirror_ubuntu-disco-kernel ubuntu-disco

Hacemos una copia del parche que necesitamos y lo editamos con nano:

  • cp ubuntu-disco/drivers/iommu/intel-iommu.c ubuntu-disco/drivers/iommu/intel-iommu_new.c
  • nano ubuntu-disco/drivers/iommu/intel-iommu_new.c

En el editor de nano buscaremos con el comando «CTRL+W» el siguiente tecto:

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;
}

Y lo cambiaremos a lo siguiente (se elimina el «return» y se añade al texto algo que nos haga saber más tarde que se está aplicando nuestro parche) :

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

De los dos ficheros generaremos un diff:

  • diff -u /usr/src/ubuntu-disco/drivers/iommu/intel-iommu.c /usr/src/ubuntu-disco/drivers/iommu/intel-iommu_new.c > remove_rmrr_check.patch

Habrá que adaptar la cabecera de ese diff generado, quedando de forma similar a este (se cambian las rutas de los ficheros y sus nombres):

— a/drivers/iommu/intel-iommu.c 2019-07-17 15:44:26.908520624 +0200
+++ b/drivers/iommu/intel-iommu.c 2019-07-17 15:48:09.380083344 +0200

Moveremos el diff al lugar donde la recompilación lo buscará:

  • cd /usr/src/pve-kernel/
  • mv ../remove_rmrr_check.patch ./patches/kernel/

Modificaremos un script que busca ficheros con nombres problemáticos:

  • nano debian/scripts/find-firmware.pl

Y comentaremos una de las primeras líneas para que quede más o menos de esta forma:

#die «strange directory name» if $dir !~ m|^(.*/)?(5.0.\d+\-\d+\-pve)(/+)?$|;

Configuraremos el Makefile:

  • nano /usr/src/pve-kernel/Makefile

En él buscaremos «EXTRAVERSION» y lo dejaremos de la siguiente forma:

  • EXTRAVERSION=-${KREL}-pve-removermrr

Y finalmente lanzaremos el make:

  • make

Si todo ha ido bien, nos habrá generado una serie de ficheros «.deb» que instalaremos de la siguiente forma:

  • dpkg -i *.deb

Si nos ha fallado por algún motivo y tenemos que relanzar de nuevo el «make» es posible que no nos deje y tengamos que añadir al fichero «Makefile» la opción «-d» quedando de esta forma:

${LINUX_TOOLS_DEB} ${HDR_DEB}: ${DST_DEB}
${DST_DEB}: ${BUILD_DIR}.prepared
cd ${BUILD_DIR}; dpkg-buildpackage –jobs=auto -b -uc -us -d
lintian ${DST_DEB}
#lintian ${HDR_DEB}
lintian ${LINUX_TOOLS_DEB}

Comprobación de la instalación

Una vez que tengamos el nuevo kernel instaldo mediante los «.deb» anteriores, reiniciaremos la máquina y cuando lancemos nuestra máquina virtual, mediante el comando «dmesg | grep -e DMAR -e IOMMU» obtendremos el mensaje:

vfio-pci 0000:07:00.1: Device is ineligible for IOMMU domain attach due to platform RMRR requirement. Parcheado.

Fuente

Las pautas han sido sacadas de lo que ahora es un pequeño tutorial pero en su día fue un verdadero quebradero de cabeza.

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: ,

VirtualBox en segundo plano

lunes, 2 de enero de 2012 Sin comentarios

Lanzar una máquina virtual en segundo plano desde línea de comando nos puede ser realmente útil si queremos prescindir de entorno gráfico o sólo tenemos una conexión ssh simple.

Para hacerlo posible debemos seguir unos pasos sencillos usando un terminal. Primero sacaremos un listado de máquinas virtuales en el equipo:

 # VBoxManage list vms

«Windows XP» {b3f13d76-dcc1-42e1-aca0-66290ea99202}

«CentOS» {h5f13d76-dde1-72f5-joe8-77800ea99568}

Nos ha devuelto un listado de máquinas virtuales con su respectivo nombre e identificador que usaremos para poner en marcha la deseada.

# VBoxManage startvm «Windows XP» –type headless

La opción «headless» le indica a VirtualBox que deberá ejecutar la máquina virtual en segundo plano, con lo que podremos cerrar la sesión SSH sin peligro de que se interrumpa la ejecución de la misma.

Para comprobar que está funcionando todo correctamente podremos sacar un listado de maquinas virtuales en ejecución.

# VBoxManage list runningvms

«Windows XP» {b3f13d76-dcc1-42e1-aca0-66290ea99202}

VirtualBox y la sincronización de hora

jueves, 17 de marzo de 2011 14 comentarios

Normalmente, cuando usamos una máquina virtual en VirtualBox ésta sincroniza su hora con el sistema operativo host, algo útil pero a veces conflictivo para nuestros intereses. Por ejemplo, si queremos comprobar el sistema de caducidad de una aplicación demo de 30 días, tendríamos que cambiar la fecha en el sistema host para que surta efecto en el sistema invitado (guest).

Una forma de desactivar la sincronización de hora es utilizando el siguiente comando, donde «nombreMV» es el nombre que recibe tu máquina virtual en VirtualBox.

vboxmanage setextradata «nombreMV» «VBoxInternal/Devices/VMMDev/0/Config/GetHostTimeDisabled» «1»

Para volver a activar el servicio basta con volver a ejecutar el mismo comando pero cambiando el «1» por el «0» y, obviamente, se necesita apagar y encender la máquina virtual para que se apliquen los cambios.