Virtualización con libvirt

De Wiki de Sistemas Operativos
Saltar a: navegación, buscar

Para la realización de esta práctica necesitará de una imagen de Debian Cloud que descargaremos de https://cloud.debian.org

En esta práctica se empleará la imagen descargada de la web Debian Cloud y se hará uso de la herramienta virt-customize para configurarla.

A continuación, utilizaremos la imagen de Debian ya configurada para ser importada al software de virtualización libvirt.

Paso 1: Descarga de la imagen Cloud

Entramos en http://cloud.debian.org/images/cloud/ y descargamos la imagen de Debian 13.

Puedes descargarla directamente con la orden wget:

wget https://cloud.debian.org/images/cloud/trixie/latest/debian-13-generic-amd64.qcow2

si comenzó a descargar verás una salida similar a esta:

-2019-08-06 12:26:26--  https://cloud.debian.org/images/cloud/trixie/latest/debian-13-generic-amd64.qcow2
Resolviendo cloud.debian.org (cloud.debian.org)... 91.189.88.89, 2001:67c:1560:8001::8001
Conectando con cloud.debian.org (cloud.debian.org)[91.189.88.89]:443... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 343474176 (328M) [application/octet-stream]
Grabando a: “debian-13-generic-amd64.qcow2”

debian-13-generic-amd64.qcow2.   0%[                                                              ]   2,21M   472KB/s    eta 14m 6s

Espera hasta que la imagen esté descargada al 100%.

La imagen de Debian cloud viene con 2 GBytes de espacio por defecto, puedes ampliar el tamaño con la siguiente orden antes de usarla en la máquina virtual:

qemu-img resize debian-13-generic-amd64.qcow2 +8G

Esto aumenta en 8 Gbytes la imagen, por tanto, quedas con una unidad virtual de almacenamiento de 10 GBytes.

Paso 2: Configuración de la imagen cloud con virt-customize

La orden virt-customize permite establecer la contraseña del usuario administrador de la imagen que hemos descargado.

virt-customize -a debian-13-generic-amd64.qcow2 --root-password password:coolpass

El ejemplo anterior muestra cómo configurar la imagen descargada para que disponga del usuario root, y en este caso, la contraseña es coolpass.

Paso 3: Creación de máquina virtual

Para crear una máquina virtual con libvirt, tienes que hacer uso de virt-install:

virt-install --name mi-mv --memory 2048 --disk path=/home/usuario/debian-13-generic-amd64.qcow2 --network network=default --os-variant generic --import

En la orden anterior:

  • Se crea una máquina virtual denominada mi-mv
  • La memoria de la máquina virtual es de 2 GBytes (2048 Mbytes)
  • El --disk path indica la ruta a la imagen Cloud
  • Se usa la configuración de red por defecto.
  • Se especifica que la variante de sistema operativo genérico
  • Se indica que se trata de una importación de una imagen con un sistema operativo ya instalado mediante --import
  • Opcionalmente, puede indicar --vcpus=NUM donde NUM es el número de CPUs para su máquina virtual.

Recuerde modificar el nombre de la máquina virtual mi-mv y actualizar la ruta a la imagen Cloud que ha descargado en el paso anterior.

Tras invocar este lo cual le aparecerá la pantalla de la máquina virtual en una ventana, puede salir de la pantalla al pulsar sobre "File -> Quit".

Paso 4: Acceso y gestión de la máquina virtual

El comando virt-install lanza inicialmente el programa virt-viewer siempre que haya iniciado la sesión mediante ssh con la opción -X.

Para volver acceder al teclado y pantalla de la máquina virtual en cualquier momento mediante el siguiente programa:

virt-viewer mi-mv &

NOTA: Si observa un mensaje de error que indica "Cannot open display" significa que no ha iniciado sesión con ssh -X.

Para parar la máquina virtual:

virsh shutdown mi-mv

Para listar las máquinas virtuales existentes y comprobar su estado:

virsh list --all

Puede usar grep para localizar su máquina virtual y mostrar el estado en el que está.

virsh list --all | grep mi-mv

Para lanzar una máquina virtual apagada, puede usar:

virsh start mi-mv

Si necesita borrar una máquina virtual completamente (previamente apagada), puede hacerlo con:

virsh undefine mi-mv

tras los cual ya no aparecerá en el listado de virsh list --all.

Paso 5: Ampliación de tamaño de la imagen Cloud

En el Paso 1 se amplió la unidad virtual de almacenamiento a 10 Gbytes mediante qemu-img.

En Debian 12 hay que hacer un paso más para completar la ampliación, desde dentro de la máquina virtual, hay que extender la partición para que ocupe todo el tamaño de la unidad virtual de almacenamiento:

growpart /dev/sda 1

Tras esto, hay que extender el sistema de ficheros que está en dicha partición:

resize2fs /dev/sda1

Con esto puedes comprobar que el sistema de ficheros es de 10 Gbytes, con la utilidad df:

df -h

NOTA: En Debian 13 este paso no es necesario.

Paso 6: Configuración del teclado en la imagen Cloud

Por defecto, la imagen cloud viene con el teclado en inglés americano.

Puedes cambiarlo con la siguiente orden:

apt install kbd

Y seleccione "Other", después busque "Spanish". En general, deje lo preseleccionado para opciones que no entienda, solo cambien el idioma.

Si se equivoca en la selección de los menús, lo puede solucionar de esta manera:

dpkg-reconfigure keyboard-configuration
service keyboard-setup restart

Paso 7: Configuración de la red en libvirt

Antes de ver los detalles de red, vamos a hacer una pequeña diferencia entre las dos ventanas que tenemos abiertas, virt-manager principal y virt-manager máquina virtual ejecutándose. En la primera tendremos las configuraciones generales y en la segunda tendremos las configuraciones de una máquina virtual concreta, en nuestro caso, la configuración de la máquina virtual.

Con esto, veremos dos formas de saber la IP de nuestra máquina virtual:

  1. En la ventana de nuestra máquina virtual, vamos a cambiar la vista y ver los detalles de nuestra máquina. Vista --> Detalles. Aquí tenemos toda la configuración de nuestra máquina, pero solo vamos a centrarnos en la Interfaz de red virtual, que es donde podremos ver cual es pa IP que tiene asiganada nuestra máquina y cual es la fuente de red que se está utilizando.
    Interfaz de red virtual.
  2. La otra opción es utilizando comandos, podemos utilizar ip address en la consola de nuestra máquina virtual.
# ip address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 3d:f0:ee:49:aa:22 brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.168/24 brd 192.168.2.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::3e97:eff:fe39:dd20/64 scope link 
       valid_lft forever preferred_lft forever

Que nos permite comprobar que estamos utilizando la dirección IP 192.168.100.168.

Si la interfaz no muestra una dirección IP, puedes forzar la obtención de una dirección IP desde la máquina virtual para la interfaz ens3 con la orden:

dhcpcd ens3

NOTA: Si usa la imagen cloud de Debian 12, entonces tiene que usar dhclient en lugar de dhcpcd:

dhclient ens3

Vamos a comprobar ahora desde un terminal en el anfitrión que alcanzamos a nuestra máquina virtual.

ping 9.9.9.9

Deberíamos de ver una salida similar a la siguiente:

PING 192.168.100.168 (192.168.100.168) 56(84) bytes of data.
64 bytes from 192.168.100.168: icmp_seq=1 ttl=64 time=0.397 ms
64 bytes from 192.168.100.168: icmp_seq=2 ttl=64 time=0.409 ms
64 bytes from 192.168.100.168: icmp_seq=3 ttl=64 time=0.321 ms

Puede pararlo con ctrl-C.

Compruebe también que la resolución de nombre funciona adecuadamente, mediante:

ping www.us.es
</syntaxhighligh>

Si hubiere algún problema de conectividad la salida sería de este tipo:

<syntaxhighlight lang="bash">
PING 192.168.100.168 (192.168.100.168) 56(84) bytes of data.
From 192.168.100.1 icmp_seq=1 Destination Host Unreachable
From 192.168.100.1 icmp_seq=2 Destination Host Unreachable
From 192.168.100.1 icmp_seq=3 Destination Host Unreachable

En dicho caso, puedes forzar la obtención de una dirección IP con la orden:

dhcpcd ens3

Esto quiere decir que la configuración de red es incorrecta, o quizás que la dirección IP de tu máquina virtual no es 192.168.100.168 :-).

Esta configuración de red es efímera, en el siguiente reinicio de la máquina virtual tendrá que invocar a dhcpcd.

Para realizar la configuración de manera permanente, puede configurar netplan para que la máquina virtual obtenga IP por DHCP automáticamente en tiempo de arranque con la siguiente configuración en /etc/netplan/ens3.yaml.

network:
  version: 2
  renderer: networkd
  ethernets:
    ens3:
      dhcp4: true

Para evitar un mensaje de WARNING, asegúrese de que el fichero tiene los permisos adecuados:

chmod 600 /etc/netplan/ens3.yaml

tras crear este fichero, puedes aplicar los cambios con:

netplan apply

Dispones de más información suplementaria sobre la configuración de red en libvirt.

Paso 8: Activación del servicio de ssh

Para configurar el servicio de ssh en su máquina virtual, pare su máquina virtual:

virsh shutdown mi-mv

Genere un par de claves pública y privada desde su cuenta del servidor de la asignatura:

ssh-keygen

Para consultar la clave pública generada:

cat ~/.ssh/id_rsa.pub

Configure de nuevo la imagen cloud con virt-customize haciendo uso de la opción --ssh-inject:

virt-customize -a debian-13-generic-amd64.qcow2 --root-password password:coolpass --ssh-inject root:string:"ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAr8IhH+eH3FAq+gKqPvDazeU5QOGMty3NJlP1Oqt6XZkZvJsEXAMPLEkeyFa2IJfjL9SlQXs1vxB7ivj4AGz4sWkvgNvP1OFHHyGkEw== user@example.com"

donde la cadena entre comillas que comienza por ssh-rsa se trata del contenido de su fichero .ssh/id_rsa.pub.

Ahora, volvemos a lanzar la máquina virtual:

virsh start mi-mv

Accedemos a ella mediante virt-viewer:

virt-viewer mi-mv

Desde dentro de la máquina virtual, creamos las claves pública y privadas del servidor:

ssh-keygen -A

Tras esto, puede activar el servicio de ssh:

systemctl enable --now ssh

Puede comprobar el estado del servicio mediante:

systemctl status ssh

Para comprobar que funciona correctamente, desde la sesión ssh del servidor de la asignatura:

ssh root@10.141.28.25

Donde tiene que reemplazar 10.141.28.25 por la IP de su máquina virtual.

Paso 9: Clonado de máquinas virtuales

Vamos a reutilizar la configuración y la máquina virtual creada, para crear varias iguales. Empecemos:

  1. Apagamos la máquina virtual si la tenemos encendida, para que nos permita hacer un clonado. Máquina virtual --> Apagar --> Apagar
  2. En la ventana principal, pulsar botón derecho encima de la máquina virtual que queramos clonar, y pulsar Clonar ...
  3. En la ventana que nos aparece, por defecto seleccionará la misma red y creará una MAC diferente para la nueva máquina y clonará la imagen que usamos de almacenamiento. Le damos un nuevo nombre a nuestra máquina, y pulsamos en Clonar.
  4. Repetimos este paso hasta que tengamos toda las máquinas virtuales deseadas, en nuestro caso, solo crearemos una para probar los detalles de red.

Ahora arrancaremos la máquina original y la clonada, y vamos a comprobar que ambas están en la misma red y que pueden verse entre ellas. Como comentamos en el paso anterior, comprobaremos la IP de la máquina virtual original y de la clonada, y haremos ping desde dentro de las máquinas para comprobar que se ven.

Es posible clonar una máquina virtual desde el intérprete de órdenes:

virt-clone --original mi-mv --name mi-mv-clone --auto-clone

Ejemplo:

  • Máquina original tiene IP 192.168.100.168
  • Máquina clonada tiene IP 192.168.100.169
  • Desde la máquina original haremos un ping 192.168.100.169
  • Desde la máquina clonada haremos un ping 192.168.100.168
  • Desde ambas máquinas, comprobaremos que la puerta de enlace es la misma, haciendo un ip route.
  • Desde la máquina host, deberíamos de obtener ping hacía las dos máquinas

Paso 10: Instantáneas de máquinas virtuales

Las instantáneas nos permiten almacenar una captura del estado de la ejecución de una máquina virtual en un cierto instante tiempo que podremos restaurar cuando sea necesario. Las instantáneas te serán útiles si tienes trabajo a medio hacer en la máquina virtual, de manera que quieras guardar lo que has hecho para restaurarlo posteriormente.

Para crear una instantánea, accedemos a la máquina virtual en ejecución, podemos hacerlo con:

virsh snapshot-create-as --domain mimv --name snapshot-mimv-131125 --description "mi snapshot de prueba"

La creación de instantáneas toma algo de tiempo, sé paciente.

Puedes listar los snapshots disponibles para una máquina virtual en:

virsh snapshot-list mimv

Puedes resturar un snapshot mediante:

virsh snapshot-revert mimv snapshot-mimv-131125

Puedes almacenar tantas instantáneas como quieras. El nombre Captura de pantalla es una traducción poco afortunada del inglés snapshot que se refiere al término instantánea.

Material complementario

Además, existe material complementario sobre libvirt que no es parte del contenido del examen pero que podría ser de su interés.