En este apunte describo cómo crear una máquina virtual Linux (Gentoo) en un Hypervisor KVM con la particularidad de que su disco duro residirá en una NAS vía iSCSI. El Host es un NUC5i5RYK con 16GB de RAM y dedicaré un core virtual y 2GB de RAM a la VM.

linuxiscsi

iSCSI, de Internet SCSI, permite usar el protocolo SCSI sobre redes TCP/IP para acceder al almacenamiento, se trata de una alternativa a las soluciones SAN basadas en Fibre Channel.

 

NAS con soporte iSCSI

En este apunte vamos a ver cómo una NAS casera (QNAP) es capaz de entregar almacenamiento a través de iSCSI. Para situarnos, en terminología iSCSI un Target es un grupo de volúmenes (LUNs). Puedes optar por crear un único target con múltiples LUNs o varios targets donde cada uno solo tienen una única LUN. Esta última es la opción por la que he optado, para cada VM creo un “Target(grupo) con una única LUN”. Las voy a crear desde el administrador web de QNAP.

Veamos un ejemplo donde creo un Target con su LUN asignándole 15GB de espacio libre a nivel de bloque (acceso en modo directo al disco, en vez de en modo fichero), que además se presentará al sistema operativo como si fuese un disco físico.

disco-iscsi-1

disco-iscsi-2

disco-iscsi-3

disco-iscsi-4

Lo anterior era un ejemplo, veamos a continuación los tres Targets, cada uno con su LUN, que he creado para que puedan ser consumidos por las futuras VM’s de KVM.

kvm-vm-gentoo-iscsi-1

Los nombres de los Targets son realmente impronunciables, pero es lo que hay… así que fíjate bien en cual es el nombre de tu Target porque lo usaremos a continuación. Para este ejemplo voy a usar el Target que llamé “TVMgentoo” y que el QNAP tradujo a: iqn.2004-04.com.qnap:ts-569pro:iscsi.tvmgentoo.d70ea1.

 

iSCSI en virt-manager

Antes de iniciar la instalción de la VM, lo primero es configurar las fuentes iSCSI en el Host y para hacerlo la forma más sencilla es utilizar el programa virt-manager, nos conectaremos con el o los grupos (Targets) para que puedan ser consumidos por la VM más adelante.

Esto se hace obviamente en el Host (Hypervisor) y es muy importante que su Kernel soporte iSCSI (es Linux quien debe soportarlo, no KVM), así que asegúrate de tenerlo bien configurado (consulta este otro apunte sobre KVM donde explico cómo hacerlo. Asumiendo que tengo configurados los targets y que mi Host soporta iSCSI, arranco el gesto de VM’s virt-manager, selecciono mi propio hypervisor KVM, botón derecho y entro en Detalles.

kvm-vm-gentoo-iscsi-2

Desde la lengüeta “Almacenamiento”, pulsamos en el símbolo “+” para añadir un nuevo grupo (datastore) de tipo Target iSCSI (destino iSCSI).

kvm-vm-gentoo-iscsi-3

kvm-vm-gentoo-iscsi-4

kvm-vm-gentoo-iscsi-5

Debes poner la dirección IP del NAS, en vez del nombre DNS, en el campo “Nombre del equipo”.

kvm-vm-gentoo-iscsi-6

Si todo ha ido bien, deberías ver lo siguiente:

kvm-vm-gentoo-iscsi-7

Ya tengo un disco adicional disponible que usaré durante la instalación de la máquina virtual

 

Comandos útiles iSCSI

Dejo aquí unos comandos útiles que te pueden venir bien cuando trabajas con discos iSCSI.

  • Conectar disco iSCSI, desde línea de comandos o virt-manager

iSCSI-Start
* Desconectar disco iSCSI, desde línea de comandos o virt-manager

iSCSI-Stop

 

Instalar la máquina virtual

Ya estamos listos para crear la máquina virtual, así que nos vamos a virt-manager y la creamos utilizando el ISO de instalación del sistema operativo como disco de arranque. Como es “gentoo” voy a darle bastante memoria (8GB) y cpu (4 vCores) para que las compilaciones vayan rápido. Al terminar modificaré la VM para dejarla con 2GB y 1 vCore

fastvm-1

fastvm-2

fastvm-3

Selecciono la opción Elija administrado, o algún otro tipo de almacenamiento existente
kvm-vm-gentoo-iscsi-8

Selecciono la unidad que apunta a mi Target
kvm-vm-gentoo-iscsi-9

kvm-vm-gentoo-iscsi-10

Selecciono la interfaz de red virtual adecuada y la opción “Personalizar configuración antes de instalar” y hago clic en Finalizar
kvm-vm-gentoo-iscsi-11

Ahora podemos parametrizar la VM antes de arrancarla.

  • Añado “input->Tableta Gráfica USB EvTouch” para que el ratón responda correctametne cuando manipulo más adelante la VM desde virt-manager.

kvm-vm-gentoo-iscsi-12

  • MUY IMPORTANTE: Cambiar los controladores de Disco y Red a VirtIO. Ambos ofrecen un rendimiento mejor y es mucho mejor cambiarlo ahora (sobre todo el de disco) que más adelante.

kvm-vm-gentoo-iscsi-13

kvm-vm-gentoo-iscsi-13.1

Ya puedo aplicar los cambios y hacer clic en Iniciar instalación

fastvm-6

fastvm-7

Te recomiendo que dejes de trabajar en la consola y pases a un puesto de trabajo remoto vía SSH, asigno una contraseña a root y arranco el daemon:

 
Crear las particiones del disco con Parted

El disco que KVM presenta a la VM realmente está en la NAS (vía iSCSI), pero esto es transparente para la VM, que lo reconoce como un disco real físico y le asigna el nombre de dispositivo /dev/vda (recuerda que usamos el driver Virtio)

Empiezo a preparar las particiones. Notar que voy a usar UEFI y GPT (en vez de MBR):

A continuación creo los file systems

Montamos los file systems

Ajustar la hora

Descarga de Stage 3

El “Stage 3” es un “paquete” que contiene un entorno Gentoo mínimo (ya compilado) que facilita el proceso de instalación. Te recomiendo consultar en paralelo el Gentoo Handbook que encontrarás en la Wiki de Gentoo.

Descargo el último “stage3”, el último “portage”:

chroot al nuevo entorno

A partir de ahora “/” (root) apuntará al disco SSD que hemos formateado y donde hemos descomprimido Stage 3 y Portage. Antes de hacer el chroot debes copiar el /etc/resolv.conf para que la red siga funcionando (sobre todo la resolución de nombres :-))

Modificamos el fichero make.conf

Leemos todas las “News”

Establecemos la Zona horaria

Preparo el /etc/fstab

Instalo herramientas útiles

Instalo herramientas útiles a la hora de trabajar con Portage y con el sistema en general.

Instalo v86d y Python

Instalo DHCP Cliente

Para el futuro arranque tras el primer boot, mejor instalar ahora el paquete cliente de DHCP

Preparo portage

Preparo los ficheros de portage

Descargo y compilo el último Kernel

Primero nos bajamos los fuentes del Kernel con el comando siguiente:

Los fuentes quedan instalados en /usr/src/linux (realmente es un link simbólico), a continuación lo parametrizas con “make menuconfig” y luego compilas con “make” y “make modules_install”.

Si tienes experiencia en parametrizar el kernel, adelante con ello. Si lo prefieres y para facilitarte el trabajo, empieza por un kernel “ya probado” para esta versión concreta de kernel. Este que comparto a continuación tiene soporte para ejecutarse en KVM. Lo dejo en mi repositorio de GitHub, en concreto tienes que bajarte el fichero 2015-05-07-config-4.0.4-Gentoo_KVM_Guest.txt y copiarlo como /usr/src/linux/.config. Luego compilas e instalas el kernel.

 

Instalo “systemd”

Selecciono el Perfil systemd

Voy a configurar esta VM con systemd, así que selecciono el perfil adecuado:

Recompilo con el nuevo Profile systemd

Una vez que se selecciona un Profile distinto lo que ocurre es que cambias los valores USE de por defecto del sistema y esto significa que tenemos que “recompilarlo” por completo, así que lo siguiente que vamos a hacer es un emerge que actualice “world” :

NOTA: El proceso re-compila más de 150 paquetes y es normal que tarde varias horas (2 en mi caso), por eso asigné 4 virtual cpu’s a esta VM, para acortar este tiempo al máximo.


 

Hostname

Con systemd se deja de usar /etc/conf.d/hostname, así que voy a editar a mano directamente los dos ficheros que emplea systemd. – Llamé a mi servidor “edaddepiedrix” (como siempre haciendo alusión a la aldea gala)

Contraseña de root

Antes de rearrancar es importante que cambies la contraseña de root.

Fichero mtab

Es necesario realizar un link simbólico especial:

Grub 2

Necesitamos un “boot loader” y nada mejor que Grub2.

Instalamos el boot loader en el disco

Modifico el fichero de configuración de Grub /etc/default/grub, la siguientes son las líneas importantes:

GRUB_CMDLINE_LINUX="init=/usr/lib/systemd/systemd quiet rootfstype=ext4"
GRUB_TERMINAL=console
GRUB_DISABLE_LINUX_UUID=true

Ah!, en el futuro, cuando te sientas confortable, cambia el timeout del menu que muestra Grub a “0”, de modo que ganarás 5 segundos en cada rearranque de tu servidor Gentoo desde vSphere Client 🙂

GRUB_TIMEOUT=0

Cada vez que se modifica el fichero /etc/default/grub hay que ejecutar el programa grub2-mkconfig -o /boot/grub/grub.cfg porque es él el que crea la versión correcta del fichero de configuración de Grub: /boot/grub/grub.cfg.

Nota, si en el futuro tienes que modificar el Kernel, no olvides ejecutar grub2-mkconfig tras la compilación (y posterior copiado a /boot) del kernel, tampoco te olvides de haber montado /boot (mount /boot) previamente.

Preparo la red

Uso “nombres de interfaces predecibles”, un servicio de udevd bien descrito upstream. Asigno un nombre específico a la interfaz principal (cambia la MAC a la de tu interfaz).

En la sección de KVM veremos la configuración completa de La Red. De momento creo un fichero bajo /etc/systemd/network, el nombre puede ser cualquiera pero debe terminar en .network. En este caso solo tengo una interfaz física:

A continuación debes habilitar el servicio para el próximo arranque con: systemctl enable systemd-networkd

Otras opciones:
* Arrancar manualmente: systemctl start systemd-networkd
* Re-arrancar (si cambias algo): systemctl restart systemd-networkd
* Verificar: networkctl

 

Reboot

Salgo del chroot, desmonto y rearranco el equipo…

 

Terminar la configuración

Tras el primer reboot nos faltan piezas importantes, vamos a arreglarlo empezando por lo básico, el teclado 🙂

Teclado y Locale

Parametrizo con systemd el teclado y los locales ejecutando los tres comandos siguientes:

El primer comando modifica /etc/vconsole.conf

El siguiente modifica /etc/X11/xorg.conf.d/00-keyboard.conf

El siguiente modifica /etc/locale.conf

El ultimo simplemente para comprobar

Preparo el fichero locale.gen

Compilo los “locales”

Activo SSHD

Otro indispensable, habilito y arranco el daemon de SSH para poder conectar vía ssh. Si en el futuro quieres poder hacer forward de X11 recuerda poner X11Forwarding yes en el fichero /etc/ssh/sshd_config

Vixie-cron

Instalo, habilito y arranco el cron

Fecha y hora

Para configurar fecha/hora debe utilizarse “timedatectl”. No te pierdas este apunte sobre cómo montar además el servicio NTP.

 

Actualizo portage

Lo primero es hacer un “perl-cleaner” y luego un update completo.

Usuario y rearranque

Desde una shell añado un usuario normal y por último rearranco el equipo. Mira un ejemplo:

Instalo herramientas y paquetes adicionales

nfs-utils para montar volúmenes remotos desde mi NAS

Tienes dos opciones, utilizar /etc/fstab o automount.

Ejemplo con /etc/fstab para acceder a recursos remotos NFS.

Ejemplo usando automount

En mi caso prefiero el segundo método:

Por fin, rearranco de nuevo el equipo, deberías tener ya todos los servicios que hemos configurado.

 
 

Pruebas de rendimiento

 

Benchmark con Phoronix

Si quieres comprobar el rendimiento te recomiendo el benchmark pts/aio-stress de Phoronix:

Los resultados del benchmark está disponibles aquí, pero como se puede ver el rendimiento no está nada mal.

phoronix-vm-iscsi

 
 

Backup y Recuperación

Backup de la VM

Para hacer backup de este tipo de VM lo que hacemos es backup del “disco iSCSI” usando las herramientas de la propia NAS guardándolo en un fichero en un NFS externo.

  • Antes de empezar, configuro el servidor NFS. En mi caso iMAC OSX que incluye el servidor NFS y está siempre activo, lo único que tienes que hacer es modificar el fichero /etc/exports y automáticamente empezará a exportar:
    iSCSI-Backup0

  • Apago la máquina virtual desde virt-manager o ejecutando un shudown o halt en el Linux.

  • Desconecto el disco iSCSI desde virt-manager
    kvm-storage-options
    iSCSI-Stop

  • Desde un navegador y el interfaz GUI de mi NAS creo un trabajo de Backup instantáneo hacia un fichero en un directorio NFS remoto (/Volumes/Terabyte/0.BACKUP/iSCSI) en mi OSX (obelix.parchis.org):

iSCSI-Backup_1

iSCSI-Backup2

iSCSI-Backup3

iSCSI-Backup4

iSCSI-Backup5

iSCSI-Backup6

  • Se pondrá inmediatamente a trabajar. Observa el resultado final, tanto en la pantalla de configuración del QNAP como en el Finder de mi iMAC, vemos un fichero de ~10GB que contiene el backup completo del disco físico utilizado para esta máquina virtual.

iSCSI-Backup7

  • Conecto de nuevo el disco iSCSI desde virt-manager para poder volver a trabajar con la VM.

kvm-storage-restart

Nota: En el caso de haber activado la compresión (mientras indicas la ubicación del fichero destino) el proceso tarda mucho más, pero obtendrás a cambio un fichero mucho más pequeño, mira la diferencia:

iSCSI-Backup8

 

Restaurar la VM

Para restaurar la VM volvemos a usar las herramientas que incluye la propia NAS. Voy a mostrar un ejemplo simulando que hemos perdido por completo el NAS, así que parto de una instalación de un NAS vacío donde tengo que volver a crear los grupos (targets) y LUN’s de nuevo para recuperar el BACKUP desde el fichero en el servidor NFS remoto que utilicé en el paso anterior. Recomiendo hacer este tipo de pruebas para verificar que efectivamente tus backups funcionan 🙂

  • Desde el QNAP, creo un nuevo target/LUN de 10GB.

iSCSI-Restaura-1

iSCSI-Restaura-2

iSCSI-Restaura-3

iSCSI-Restaura-4

iSCSI-Restaura-5

iSCSI-Restaura-6

iSCSI-Restaura-9

iSCSI-Restaura-10

  • Desde el QNAP, nuevo trabajo de recuperación para restaurar desde el fichero de backup

iSCSI-Restaura-11

iSCSI-Restaura-12

iSCSI-Restaura-13

iSCSI-Restaura-14

iSCSI-Restaura-15

iSCSI-Restaura-16

iSCSI-Restaura-17

  • Desde el Host KVM y virt-manager elimino el Target/LUN antiguo, creo el nuevo iqn.2004-04.com.qnap:ts-569pro:iscsi.vmgentoo.d70ea1

    y en la VM borro el disco antiguo y creo uno nuevo asociando el nuevo recurso disponible.

iSCSI-Restaura-18

iSCSI-Restaura-19

iSCSI-Restaura-20

iSCSI-Restaura-21

iSCSI-Restaura-22

iSCSI-Restaura-23

iSCSI-Restaura-24

  • A partir de ahí ya puedo volver a arrancar la VM y ver que funciona correctamente.

iSCSI-Restaura-25