Esta pagina se ve mejor con JavaScript habilitado

Acceso gráfico máquinas virtuales KVM LXD desde FreeBSD

 ·  🎃 kr0m

Si virtualizamos bajo Linux/LXD sabremos que este soporta tanto contenedores como máquinas virtuales KVM, el acceso a estas últimas puede ser por puerto serie como VNC, el problema que presenta esta última opción es que es necesario un servidor LXD cliente para lanzar la sesión gráfica, es decir, no podemos acceder a la interfaz VNC a no ser que tengamos un Linux con LXD instalado en local actuando como cliente VNC.

En este tutorial vamos a instalar una Ubuntu server bajo Bhyve donde instalaremos LXD y mediante forwarding SSH lanzaremos la sesión gráfica en nuestro sistema FreeBSD.

El tutorial se compone de las siguientes secciones:


VM-Bhyve:

El primer paso será instalar vm-bhyve el gestor de máquinas virtuales tal como se indica en este artículo anterior.

Descargamos la imagen cloud de Ubuntu server:

Podemos ver las imágenes disponibles;

vm img

DATASTORE           FILENAME
default             ubuntu-22.04-server-cloudimg-amd64.img

Creamos la VM importando nuestra key SSH:

vm create -c 4 -m 8G -s 40G -t linux-zvol -i ubuntu-22.04-server-cloudimg-amd64.img -C -k /home/kr0m/.ssh/id_rsa.pub ubuntu-cloud

Arrancamos la VM y comprobamos que haya arrancado correctamente:

vm start ubuntu-cloud
vm list

NAME          DATASTORE  LOADER  CPU  MEMORY  VNC  AUTO  STATE
ubuntu-cloud  default    grub    4    8G      -    No    Running (78823)

Las imágenes cloud no permiten asignar una ip estática, así que tendremos que averiguar la ip asignada por DHCP en base a su dirección MAC:

MAC=$(vm info ubuntu-cloud|grep 'fixed-mac-address'|tr -d " "|awk -F "fixed-mac-address:" '{print$2}')
fping -ag 192.168.69.0/24
arp -a |grep $MAC

? (192.168.69.209) at 58:9c:fc:07:fd:05 on em0 expires in 1200 seconds [ethernet]

Accedemos a la VM:

Asignamos un password al usuario root y ubuntu:

sudo su -l
passwd
passwd ubuntu

Ahora que los usuarios tienen password también podremos acceder por consola si así lo deseamos:

vm console ubuntu-cloud

Deshabilitamos la configuración de red por cloud:

vi /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg

network: {config: disabled}

Asignamos una ip estática y configuramos un bridge con la misma MAC que la mostrada en la configuración de la VM, de este modo si necesitamos debugear problemas y localizar la VM por la MAC será mas sencillo:

vi /etc/netplan/50-cloud-init.yaml

network:
  version: 2
  ethernets:
    enp0s5:
      dhcp4: false
  bridges:
    br0:
      interfaces: [enp0s5]
      addresses: [192.168.69.5/24]
      routes:
      - to: default
        via: 192.168.69.200
      nameservers:
        search: [alfaexploit.com]
        addresses: [8.8.8.8, 1.1.1.1]

Reiniciamos:

reboot

Volvemos a acceder:

Instalamos las utilidades base y virt-viewer, x11-apps:

apt update
apt install net-tools bridge-utils virt-viewer x11-apps

LXD viene instalado por defecto en la imagen cloud.

snap list

Name    Version        Rev    Tracking       Publisher   Notes
core20  20230622       1974   latest/stable  canonical✓  base
lxd     5.0.2-838e1b2  24322  5.0/stable/…   canonical✓  -
snapd   2.59.5         19457  latest/stable  canonical✓  snapd

Realizamos la configuración inicial de LXD:

lxd init

Would you like to use LXD clustering? (yes/no) [default=no]: 
Do you want to configure a new storage pool? (yes/no) [default=yes]: 
Name of the new storage pool [default=default]: 
Name of the storage backend to use (ceph, cephobject, dir, lvm, zfs, btrfs) [default=zfs]: dir
Would you like to connect to a MAAS server? (yes/no) [default=no]: 
Would you like to create a new local network bridge? (yes/no) [default=yes]: no
Would you like to configure LXD to use an existing bridge or host interface? (yes/no) [default=no]: yes
Name of the existing bridge or host interface: br0
Would you like the LXD server to be available over the network? (yes/no) [default=no]: no
Would you like stale cached images to be updated automatically? (yes/no) [default=yes]: 
Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]: 

Añadimos el usuario de acceso a algunos grupos administrativos:

usermod -aG adm,sudo,lxd ubuntu
exit

Añadimos con el usuario de acceso el remote LXD: hostkr0m

lxc remote add hostkr0m https://X.X.X.X:8443

Consultamos los remotes:

lxc remote list

+-----------------+------------------------------------------+---------------+-------------+--------+--------+--------+
|      NAME       |                   URL                    |   PROTOCOL    |  AUTH TYPE  | PUBLIC | STATIC | GLOBAL |
+-----------------+------------------------------------------+---------------+-------------+--------+--------+--------+
| hostkr0m        | https://X.X.X.X:8443                     | lxd           | tls         | NO     | NO     | NO     |
+-----------------+------------------------------------------+---------------+-------------+--------+--------+--------+
| images          | https://images.linuxcontainers.org       | simplestreams | none        | YES    | NO     | NO     |
+-----------------+------------------------------------------+---------------+-------------+--------+--------+--------+
| local (current) | unix://                                  | lxd           | file access | NO     | YES    | NO     |
+-----------------+------------------------------------------+---------------+-------------+--------+--------+--------+
| ubuntu          | https://cloud-images.ubuntu.com/releases | simplestreams | none        | YES    | YES    | NO     |
+-----------------+------------------------------------------+---------------+-------------+--------+--------+--------+
| ubuntu-daily    | https://cloud-images.ubuntu.com/daily    | simplestreams | none        | YES    | YES    | NO     |
+-----------------+------------------------------------------+---------------+-------------+--------+--------+--------+

Comprobamos que podamos ver las VMs del remote:

lxc list hostkr0m:

+-------------------------+---------+-------------------------+------+-----------------+-----------+
|          NAME           |  STATE  |          IPV4           | IPV6 |      TYPE       | SNAPSHOTS |
+-------------------------+---------+-------------------------+------+-----------------+-----------+
| ubuntu-desktop-test     | RUNNING | 192.168.75.211 (enp5s0) |      | VIRTUAL-MACHINE | 0         |
+-------------------------+---------+-------------------------+------+-----------------+-----------+

Cliente:

En nuestro pc debemos autorizar la ip de la VM para poder recibir el tráfico forwardeado de las X:

xhost +inet:192.168.69.5

Arrancamos xclock para comprobar que todo funciona correctamente:

ssh -vYC ubuntu@192.168.69.5 "xclock"

Arrancamos la sesión gráfica de la VM alojada en hostkr0m:

ssh -vYC ubuntu@192.168.69.5 "lxc console hostkr0m:ubuntu-desktop-test --type=vga"


Troubleshooting:

Si estamos haciendo pruebas y reinstalaciones debemos comprobar que no haya ningún conflicto en el knownhosts de SSH o el X11forward no funcionará.

Si te ha gustado el artículo puedes invitarme a un RedBull aquí