Diferencia entre revisiones de «Virtualización con libvirt»

De Wiki de Sistemas Operativos
Saltar a: navegación, buscar
(Paso 3.1: Configurar usuario y contraseña para login)
 
(No se muestran 144 ediciones intermedias de 2 usuarios)
Línea 1: Línea 1:
Para la realización de esta práctica necesitará de una imagen de Ubuntu Cloud que descargaremos de https://cloud-images.ubuntu.com/ y necesitaremos un
+
Para la realización de esta práctica necesitará de una imagen de Debian Cloud que descargaremos de https://cloud.debian.org
sistema anfitrión con Ubuntu 18.04.
 
  
En esta práctica se emplearán la imagen descargada de la web Ubuntu Cloud y se hará uso de la herramienta '''cloud-init''' para configurarla.
+
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.
  
= Paso 1: Descarga de la imagen Ubuntu Cloud =
+
A continuación, utilizaremos la imagen de Debian ya configurada para ser importada al software de virtualización '''libvirt'''.
  
Entramos en https://cloud-images.ubuntu.com/ y descargamos la imagen de Ubuntu 18.04 LTS (Long Time Support).
+
= 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'':
 
Puedes descargarla directamente con la orden ''wget'':
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
wget https://cloud-images.ubuntu.com/bionic/current/bionic-server-cloudimg-amd64.img
+
wget https://cloud.debian.org/images/cloud/trixie/latest/debian-13-generic-amd64.qcow2
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Línea 17: Línea 18:
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
-2019-08-06 12:26:26--  https://cloud-images.ubuntu.com/bionic/current/bionic-server-cloudimg-amd64.img
+
-2019-08-06 12:26:26--  https://cloud.debian.org/images/cloud/trixie/latest/debian-13-generic-amd64.qcow2
Resolviendo cloud-images.ubuntu.com (cloud-images.ubuntu.com)... 91.189.88.89, 2001:67c:1560:8001::8001
+
Resolviendo cloud.debian.org (cloud.debian.org)... 91.189.88.89, 2001:67c:1560:8001::8001
Conectando con cloud-images.ubuntu.com (cloud-images.ubuntu.com)[91.189.88.89]:443... conectado.
+
Conectando con cloud.debian.org (cloud.debian.org)[91.189.88.89]:443... conectado.
 
Petición HTTP enviada, esperando respuesta... 200 OK
 
Petición HTTP enviada, esperando respuesta... 200 OK
 
Longitud: 343474176 (328M) [application/octet-stream]
 
Longitud: 343474176 (328M) [application/octet-stream]
Grabando a: “bionic-server-cloudimg-amd64.img”
+
Grabando a: “debian-13-generic-amd64.qcow2”
  
bionic-server-cloudimg-amd64.img.  0%[                                                              ]  2,21M  472KB/s    eta 14m 6s
+
debian-13-generic-amd64.qcow2.  0%[                                                              ]  2,21M  472KB/s    eta 14m 6s
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 
Espera hasta que la imagen esté descargada al 100%.
 
Espera hasta que la imagen esté descargada al 100%.
  
= Paso 2: Instalación de paquetes necesarios para entorno de virtualización libvirt =
+
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:
 +
 
 +
<syntaxhighlight lang="bash">
 +
qemu-img resize debian-13-generic-amd64.qcow2 +8G
 +
</syntaxhighlight>
 +
 
 +
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.
 +
 
 +
<syntaxhighlight lang="bash">
 +
virt-customize -a debian-13-generic-amd64.qcow2 --root-password password:coolpass --hostname servidor
 +
</syntaxhighlight>
 +
 
 +
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'':
 +
 
 +
<syntaxhighlight lang="bash">
 +
virt-install --name mi-mv --memory 2048 --disk path=/home/usuario/debian-13-generic-amd64.qcow2 --network network=default --os-variant generic --import
 +
</syntaxhighlight>
 +
 
 +
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:
 +
 
 +
<syntaxhighlight lang="bash">
 +
virt-viewer mi-mv &
 +
</syntaxhighlight>
 +
 
 +
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:
 +
 
 +
<syntaxhighlight lang="bash">
 +
virsh shutdown mi-mv
 +
</syntaxhighlight>
 +
 
 +
Para listar las máquinas virtuales existentes y comprobar su estado:
 +
 
 +
<syntaxhighlight lang="bash">
 +
virsh list --all
 +
</syntaxhighlight>
 +
 
 +
Puede usar ''grep'' para localizar su máquina virtual y mostrar el estado en el que está.
 +
 
 +
<syntaxhighlight lang="bash">
 +
virsh list --all | grep mi-mv
 +
</syntaxhighlight>
 +
 
 +
Para lanzar una máquina virtual apagada, puede usar:
 +
 
 +
<syntaxhighlight lang="bash">
 +
virsh start mi-mv
 +
</syntaxhighlight>
 +
 
 +
Si necesita borrar una máquina virtual completamente (previamente apagada), puede hacerlo con:
 +
 
 +
<syntaxhighlight lang="bash">
 +
virsh undefine mi-mv
 +
</syntaxhighlight>
 +
 
 +
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:
 +
 
 +
<syntaxhighlight lang="bash">
 +
growpart /dev/sda 1
 +
</syntaxhighlight>
 +
 
 +
Tras esto, hay que extender el sistema de ficheros que está en dicha partición:
 +
 
 +
<syntaxhighlight lang="bash">
 +
resize2fs /dev/sda1
 +
</syntaxhighlight>
 +
 
 +
Con esto puedes comprobar que el sistema de ficheros es de 10 Gbytes, con la utilidad ''df'':
 +
 
 +
<syntaxhighlight lang="bash">
 +
df -h
 +
</syntaxhighlight>
 +
 
 +
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:
 +
 
 +
<syntaxhighlight lang="bash">
 +
apt install kbd
 +
</syntaxhighlight>
 +
 
 +
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:
 +
 
 +
<syntaxhighlight lang="bash">
 +
dpkg-reconfigure keyboard-configuration
 +
service keyboard-setup restart
 +
</syntaxhighlight>
 +
 
 +
= 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.
  
Esta práctica requiere de los siguientes paquetes que estén instalados en el sistema anfitrión:
+
Con esto, veremos dos formas de saber la IP de nuestra máquina virtual:
 +
 
 +
# 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. [[Archivo:virt-manager-nic.png|thumb|Interfaz de red virtual.]]
 +
# La otra opción es utilizando comandos, podemos utilizar ''ip address'' en la consola de nuestra máquina virtual.
 +
 
 +
<syntaxhighlight lang="bash">
 +
# 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
 +
</syntaxhighlight>
  
* '''virt-manager:''' interfaz gráfica para la gestión de hipervisores.
+
Que nos permite comprobar que estamos utilizando la dirección IP 192.168.100.168.
* '''cloud-init''': herramienta para configurar una imagen de Ubuntu cloud.
 
* '''cloud-image-utils''': esta herramienta es complementaria a cloud-init y sirve para modificar imágenes de Ubuntu cloud.
 
  
Podemos instalar estos paquetes con la herramienta '''apt''' desde el intérprete de órdenes:
+
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:
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
sudo apt install cloud-init cloud-image-utils virt-manager
+
dhcpcd ens3
 
</syntaxhighlight>
 
</syntaxhighlight>
  
''En los ordenadores del aula de prácticas estos paquetes ya estarán preinstalados, con lo que puedes saltarte este paso''.
+
NOTA: Si usa la imagen cloud de Debian 12, entonces tiene que usar ''dhclient'' en lugar de ''dhcpcd'':
  
= Paso 3: Configuración la imagen de Ubuntu con cloud-init =
+
<syntaxhighlight lang="bash">
 +
dhclient ens3
 +
</syntaxhighlight>
  
Para configurar la imagen de Ubuntu cloud, hay que crear un fichero de configuración para la herramienta '''cloud-init'''.
+
Vamos a comprobar ahora desde un terminal en el anfitrión que alcanzamos a nuestra máquina virtual.
  
Este fichero empieza siempre por la línea #cloud-config y se estructura en formato yaml.
+
<syntaxhighlight lang="bash">
 +
ping 9.9.9.9
 +
</syntaxhighlight>
  
== Paso 3.1: Configurar usuario y contraseña para login ==
+
Deberíamos de ver una salida similar a la siguiente:
 +
 
 +
<syntaxhighlight lang="bash">
 +
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
 +
</syntaxhighlight>
 +
 
 +
Puede pararlo con ctrl-C.
 +
 
 +
Compruebe también que la resolución de nombre funciona adecuadamente, mediante:
 +
 
 +
<syntaxhighlight lang="bash">
 +
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
 +
</syntaxhighlight>
  
Para añadir una contraseña y permitir el acceso por ssh con este usuario hay que crear el fichero de configuración '''cloud.cfg''' para la herramienta '''cloud-init''':
+
En dicho caso, puedes forzar la obtención de una dirección IP con la orden:
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
#cloud-config
+
dhcpcd ens3
password: qwerty123
 
chpasswd: { expire: False }
 
ssh_pwauth: True
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Por defecto, el usuario es ''ubuntu''.
+
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''.
 +
 
 +
<syntaxhighlight lang="bash">
 +
network:
 +
  version: 2
 +
  renderer: networkd
 +
  ethernets:
 +
    ens3:
 +
      dhcp4: true
 +
</syntaxhighlight>
  
Una vez añadida esta configuración, podemos configurar la imagen para que apliquen estos cambios con el siguiente comando:
+
Para evitar un mensaje de ''WARNING'', asegúrese de que el fichero tiene los permisos adecuados:
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
cloud-localds bionic-server-cloudimg-amd64.img cloud.cfg
+
chmod 600 /etc/netplan/ens3.yaml
 
</syntaxhighlight>
 
</syntaxhighlight>
  
De esta forma, al entrar por ssh, necesitaremos poner la contraseña del usuario:
+
tras crear este fichero, puedes aplicar los cambios con:
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
ssh ubuntu@IP  # Esto nos pedirá nuestra contraseña de usuario
+
netplan apply
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== Paso 3.2: Configurar de acceso ssh con clave pública ==
+
Dispones de más información suplementaria sobre la [[configuración de red en libvirt]].
  
Este paso es opcional, si quieres configurar el acceso con clave pública ssh, tienes que generar el par de claves pública y privada.
+
= Paso 8: Activación del servicio de ssh =
 +
 
 +
Para configurar el servicio de ssh en su máquina virtual, pare su máquina virtual:
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
ssh-keygen  # Generará clave pública/privada para la autenticación
+
virsh shutdown mi-mv
cat ~/.ssh/id_rsa.pub  # Mostrará nuestra clave pública generada
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
La configuración del fichero ''cloud.cfg'' resultaría la siguiente:
+
Genere un par de claves pública y privada desde su cuenta del servidor de la asignatura:
  
<nowiki>
+
<syntaxhighlight lang="bash">
#cloud-config
+
ssh-keygen
users:
+
</syntaxhighlight>
  - name: practica
+
 
    ssh-authorized-keys:
+
Para consultar la clave pública generada:
      - ssh-rsa AA... miusuario@nombremaquina
 
    sudo: ALL=(ALL) NOPASSWD:ALL
 
    groups: sudo
 
    shell: /bin/bash
 
</nowiki>
 
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
ssh practica@IP  # No nos pedirá clave de usuario
+
cat ~/.ssh/id_rsa.pub
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== Paso 3.3: Configurar hostname y un id de instancia ==
+
Configure de nuevo la imagen cloud con ''virt-customize'' haciendo uso de la opción ''--ssh-inject'':
  
<nowiki>
+
<syntaxhighlight lang="bash">
#cloud-config
+
virt-customize -a debian-13-generic-amd64.qcow2 --root-password password:coolpass --ssh-inject root:string:"ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAr8IhH+eH3FAq+gKqPvDazeU5QOGMty3NJlP1Oqt6XZkZvJsEXAMPLEkeyFa2IJfjL9SlQXs1vxB7ivj4AGz4sWkvgNvP1OFHHyGkEw== user@example.com"
instance-id: my-instance-id
+
</syntaxhighlight>
local-hostname: my-hostname
 
</nowiki>
 
  
 +
donde la cadena entre comillas que comienza por ''ssh-rsa'' se trata del contenido de su fichero ''.ssh/id_rsa.pub''.
  
=== Configurar repositorio: añadir e instalar paquetes ===
+
Ahora, volvemos a lanzar la máquina virtual:
  
=== Ejecutar comandos al iniciar ===
+
<syntaxhighlight lang="bash">
 +
virsh start mi-mv
 +
</syntaxhighlight>
  
 +
Accedemos a ella mediante ''virt-viewer'':
  
== Crear VM utilizando virt-manager ==
+
<syntaxhighlight lang="bash">
 +
virt-viewer mi-mv
 +
</syntaxhighlight>
 +
 
 +
'''Desde dentro de la máquina virtual''', creamos las claves pública y privadas del servidor:
  
copiar volumen de cloud-init e imagen de ubuntu a /var/lib/libvirt/images/
+
<syntaxhighlight lang="bash">
https://gist.github.com/shettyg/455ff78605ea4c45febe7b5aa345c87d
+
ssh-keygen -A
 +
</syntaxhighlight>
  
==== Configuración de virt-manager ====
+
Tras esto, puede activar el servicio de ''ssh'':
 +
 
 +
<syntaxhighlight lang="bash">
 +
systemctl enable --now ssh
 +
</syntaxhighlight>
 +
 
 +
Puede comprobar el estado del servicio mediante:
 +
 
 +
<syntaxhighlight lang="bash">
 +
systemctl status ssh
 +
</syntaxhighlight>
 +
 
 +
Para comprobar que funciona correctamente, desde la sesión ssh del servidor de la asignatura:
 +
 
 +
<syntaxhighlight lang="bash">
 +
ssh root@10.141.28.25
 +
</syntaxhighlight>
 +
 
 +
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:
 +
 
 +
# Apagamos la máquina virtual si la tenemos encendida, para que nos permita hacer un clonado. ''Máquina virtual --> Apagar --> Apagar''
 +
# En la ventana principal, pulsar botón derecho encima de la máquina virtual que queramos clonar, y pulsar ''Clonar ...''
 +
# 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''.
 +
# 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:
 +
 
 +
<syntaxhighlight lang="bash">
 +
virt-clone --original mi-mv --name mi-mv-clone --auto-clone
 +
</syntaxhighlight>
 +
 
 +
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:
 +
 
 +
<syntaxhighlight lang="bash">
 +
virsh snapshot-create-as --domain mimv --name snapshot-mimv-131125 --description "mi snapshot de prueba"
 +
</syntaxhighlight>
 +
 
 +
La creación de instantáneas toma algo de tiempo, sé paciente.
 +
 
 +
Puedes listar los snapshots disponibles para una máquina virtual en:
 +
 
 +
<syntaxhighlight lang="bash">
 +
virsh snapshot-list mimv
 +
</syntaxhighlight>
 +
 
 +
Puedes resturar un snapshot mediante:
 +
 
 +
<syntaxhighlight lang="bash">
 +
virsh snapshot-revert mimv snapshot-mimv-131125
 +
</syntaxhighlight>
  
abrir virt-manager y crear VM
+
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''.
  
=== Buscar ip local de la VM para conectarnos por ssh ===
+
= Material complementario =
  
buscar ip máquina https://www.cyberciti.biz/faq/find-ip-address-of-linux-kvm-guest-virtual-machine/
+
Además, existe [[material complementario sobre libvirt]] que no es parte del contenido del examen pero que podría ser de su interés.

Revisión actual del 09:01 4 dic 2025

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 --hostname servidor

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.