Categoría: Virtualización

Configurar interfaz puente KVM

[tusysadmin@lab ~]$ ifconfig virbr0
virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.124.1  netmask 255.255.255.0  broadcast 192.168.124.255
        ether 52:54:00:f8:5e:07  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
[tusysadmin@lab ~]$ sudo nmcli con show id virbr0
connection.id:                          virbr0
connection.uuid:                        c18c5902-35cf-4da8-8360-864b6b09e922
connection.stable-id:                   --
connection.type:                        bridge
connection.interface-name:              virbr0
----
IP4.ADDRESS[1]:                         192.168.124.1/24
IP4.GATEWAY:                            --
IP4.ROUTE[1]:                           dst = 192.168.124.0/24, nh = 0.0.0.0, mt = 0
[tusysadmin@lab ~]$ sudo dnf install bridge-utils
Última comprobación de caducidad de metadatos hecha hace 1:15:12, el jue 08 feb 2024 20:18:00.
Dependencias resueltas.
================================================================================================================================================
 Paquete                              Arquitectura                   Versión                               Repositorio                     Tam.
================================================================================================================================================
Instalando:
 bridge-utils                         x86_64                         1.7.1-6.fc38                          fedora                          34 k

Resumen de la transacción
================================================================================================================================================
Instalar  1 Paquete
[tusysadmin@lab ~]$ sudo nmcli con show
NAME      UUID                                  TYPE      DEVICE
cableada  8531cd56-9e22-3a04-9f99-44ca92be00c4  ethernet  eno1
lo        0486ec18-04a3-4141-ae25-01de6f20809b  loopback  lo
SSID      51229f3b-5809-439e-a328-5b641b1a80ee  wifi      wlp0s20f0u2i2

[tusysadmin@lab ~]$ sudo nmcli con add ifname br0 type bridge con-name br0
Conexión «br0» (4f60f6ee-6003-4fa6-88e1-856af2446c8e) añadida con éxito.

[tusysadmin@lab ~]$ nmcli con show
NAME      UUID                                  TYPE      DEVICE
br0       4f60f6ee-6003-4fa6-88e1-856af2446c8e  bridge    br0
cableada  8531cd56-9e22-3a04-9f99-44ca92be00c4  ethernet  eno1
lo        0486ec18-04a3-4141-ae25-01de6f20809b  loopback  lo
SSID      51229f3b-5809-439e-a328-5b641b1a80ee  wifi      wlp0s20f0u2i2
[tusysadmin@lab ~]$

[tusysadmin@lab ~]$ sudo nmcli con add type bridge-slave ifname eno1 master br0
Conexión «bridge-slave-eno1» (7e3eb64d-faf0-4e9f-8620-4f24f286b102) añadida con éxito.

[tusysadmin@lab ~]$ nmcli con show
NAME               UUID                                  TYPE      DEVICE
br0                4f60f6ee-6003-4fa6-88e1-856af2446c8e  bridge    br0
cableada           8531cd56-9e22-3a04-9f99-44ca92be00c4  ethernet  eno1
lo                 0486ec18-04a3-4141-ae25-01de6f20809b  loopback  lo
SSID               51229f3b-5809-439e-a328-5b641b1a80ee  wifi      wlp0s20f0u2i2
bridge-slave-eno1  7e3eb64d-faf0-4e9f-8620-4f24f286b102  ethernet  --

[tusysadmin@lab ~]$ sudo nmcli con down cableada
La conexión «cableada» se desactivó correctamente (ruta activa D-Bus: /org/freedesktop/NetworkManager/ActiveConnection/3)

[tusysadmin@lab ~]$ sudo nmcli con up br0
La conexión se ha activado correctamente (master waiting for slaves) (ruta activa D-Bus: /org/freedesktop/NetworkManager/ActiveConnection/7)

[tusysadmin@lab ~]$ sudo nmcli con show
NAME               UUID                                  TYPE      DEVICE
br0                39c7beb8-6b2f-4094-b732-4484cbadef11  bridge    br0
lo                 f0bf6f96-1ffa-4770-a620-0fa0a6e78575  loopback  lo
SSID               51229f3b-5809-439e-a328-5b641b1a80ee  wifi      wlp0s20f0u2i2
bridge-slave-eno1  5ec11066-d8fb-42c9-a949-88c2b0c10820  ethernet  eno1
cableada           534d9e32-6edf-4e00-9e53-962abd1bec30  ethernet  --


[tusysadmin@lab ~]$ ip a
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 noprefixroute
       valid_lft forever preferred_lft forever
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000
    link/ether 10:62:e5:19:83:60 brd ff:ff:ff:ff:ff:ff
    altname enp0s31f6
3: wlp0s20f0u2i2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether e0:e1:a9:3a:60:e4 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.20/24 brd 192.168.1.255 scope global dynamic noprefixroute wlp0s20f0u2i2
       valid_lft 85579sec preferred_lft 85579sec
    inet6 fe80::b145:75ae:fc15:38f4/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
4: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 10:62:e5:19:83:60 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.21/24 brd 192.168.1.255 scope global dynamic noprefixroute br0
       valid_lft 85580sec preferred_lft 85580sec
    inet6 fe80::38a6:e06:84ee:34a7/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

[tusysadmin@lab ~]$ sudo brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.1062e5198360	no		eno1
[tusysadmin@lab ~]$

Virtualizar en Mac

Si por alguna razón cuentas con un equipo de la marca de la manzana y buscas una alternativa para virtualizar, te recomiendo Lima ya que a diferencia de otros proyectos funciona en las arquitectura x86_64 y ARM 64.

Lima utiliza QEMU para virtualizar, la gestión se realiza a través de la linea de comandos por lo que si estás buscando una alternativa gráfica o una maquina virtual con interfaz te recomiendo UTM que funciona igualmente con QEMU.

Instalación

Para la instalación de Lima utilizaremos el gestor de paquetes de Mac llamado Homebrew, sino cuentas con él puedes instalarlo de manera fácil de la siguiente forma:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Una vez instalado el gestor de paquetes podremos instalar Lima.

$ brew install lima

Lima utiliza archivos yaml para la creación de maquinas virtuales, existe una lista de templates que pueden usarse para desplegar nuestras maquinas, estos archivos los podemos localizar en el directorio, /opt/homebrew/share/lima/templates.

Administración

Crearemos una maquina virtual con ubuntu como imagen linux y asignaremos 2 gigas de memoria y 2 cpus.

personal-mac:templates tusysadmin$ pwd
/opt/homebrew/share/lima/templates

personal-mac:templates tusysadmin$ limactl create --name linux-server --set='.cpus = 2 | .memory = "2GiB"' ubuntu-lts.yaml
? Creating an instance "linux-server" Proceed with the current configuration
INFO[0001] Attempting to download the image              arch=aarch64 digest="sha256:5167c1b13cb33274955e36332ecb7b14f02b71fd19a37a9c1a3a0f8a805ab8e5" location="https://cloud-images.ubuntu.com/releases/22.04/release-20231010/ubuntu-22.04-server-cloudimg-arm64.img"
INFO[0001] Using cache "/Users/tusysadmin/Library/Caches/lima/download/by-url-sha256/f55d2d250bd1df34e6c082a8cbfea153f1ef6a5ec8a7300dd0ab8cbc13ec946b/data"
INFO[0002] Attempting to download the nerdctl archive    arch=aarch64 digest="sha256:ea30ab544c057e3a0457194ecd273ffbce58067de534bdfaffe4edf3a4da6357" location="https://github.com/containerd/nerdctl/releases/download/v1.6.2/nerdctl-full-1.6.2-linux-arm64.tar.gz"
INFO[0002] Using cache "/Users/tusysadmin/Library/Caches/lima/download/by-url-sha256/21921213c0426e38e2f26d2844446767e2a19c0b6655c774f9e4adbb5c368d8f/data"
INFO[0002] Run `limactl start linux-server` to start the instance.

Iniciemos la maquina.

personal-mac:templates tusysadmin$ limactl start linux-server
INFO[0000] Using the existing instance "linux-server"
INFO[0000] QEMU binary "/opt/homebrew/bin/qemu-system-aarch64" seems properly signed with the "com.apple.security.hypervisor" entitlement
INFO[0001] [hostagent] hostagent socket created at /Users/tusysadmin/.lima/linux-server/ha.sock
INFO[0001] [hostagent] Starting QEMU (hint: to watch the boot progress, see "/Users/tusysadmin/.lima/linux-server/serial*.log")
INFO[0001] SSH Local Port: 50965
INFO[0001] [hostagent] Waiting for the essential requirement 1 of 5: "ssh"
INFO[0018] [hostagent] Waiting for the essential requirement 1 of 5: "ssh"
INFO[0028] [hostagent] Waiting for the essential requirement 1 of 5: "ssh"
INFO[0029] [hostagent] The essential requirement 1 of 5 is satisfied
INFO[0029] [hostagent] Waiting for the essential requirement 2 of 5: "user session is ready for ssh"
INFO[0029] [hostagent] The essential requirement 2 of 5 is satisfied
INFO[0029] [hostagent] Waiting for the essential requirement 3 of 5: "sshfs binary to be installed"
INFO[0038] [hostagent] The essential requirement 3 of 5 is satisfied
INFO[0038] [hostagent] Waiting for the essential requirement 4 of 5: "/etc/fuse.conf (/etc/fuse3.conf) to contain \"user_allow_other\""
INFO[0041] [hostagent] The essential requirement 4 of 5 is satisfied
INFO[0041] [hostagent] Waiting for the essential requirement 5 of 5: "the guest agent to be running"
INFO[0041] [hostagent] The essential requirement 5 of 5 is satisfied
INFO[0041] [hostagent] Mounting "/Users/tusysadmin" on "/Users/tusysadmin"
INFO[0041] [hostagent] Mounting "/tmp/lima" on "/tmp/lima"
INFO[0041] [hostagent] Waiting for the optional requirement 1 of 2: "systemd must be available"
INFO[0041] [hostagent] Forwarding "/run/lima-guestagent.sock" (guest) to "/Users/tusysadmin/.lima/linux-server/ga.sock" (host)
INFO[0041] [hostagent] The optional requirement 1 of 2 is satisfied
INFO[0041] [hostagent] Waiting for the optional requirement 2 of 2: "containerd binaries to be installed"
INFO[0041] [hostagent] Not forwarding TCP 127.0.0.53:53
INFO[0041] [hostagent] Not forwarding TCP 0.0.0.0:22
INFO[0041] [hostagent] Not forwarding TCP [::]:22
INFO[0047] [hostagent] The optional requirement 2 of 2 is satisfied
INFO[0047] [hostagent] Waiting for the final requirement 1 of 1: "boot scripts must have finished"
INFO[0057] [hostagent] The final requirement 1 of 1 is satisfied
INFO[0057] READY. Run `limactl shell linux-server` to open the shell.

Para entrar a la maquina.

personal-mac:~ tusysadmin$ limactl shell linux-server

tusysadmin@lima-linux-server:/Users/tusysadmin$ sudo su -

root@lima-linux-server:~# apt-get update
Hit:1 http://ports.ubuntu.com/ubuntu-ports jammy InRelease
Get:2 http://ports.ubuntu.com/ubuntu-ports jammy-updates InRelease [119 kB]
Hit:3 http://ports.ubuntu.com/ubuntu-ports jammy-backports InRelease
Get:4 http://ports.ubuntu.com/ubuntu-ports jammy-security InRelease [110 kB]
Get:5 http://ports.ubuntu.com/ubuntu-ports jammy-updates/main arm64 Packages [1021 kB]
Get:6 http://ports.ubuntu.com/ubuntu-ports jammy-updates/main Translation-en [248 kB]
Get:7 http://ports.ubuntu.com/ubuntu-ports jammy-updates/universe arm64 Packages [917 kB]
Fetched 2415 kB in 4s (567 kB/s)
Reading package lists... Done
root@lima-linux-server:~# htop

root@lima-linux-server:~# cat /etc/issue
Ubuntu 22.04.3 LTS \n \l

Al salir de la maquina virtual podemos listar el resto de equipos y el estado en el que se encuentran.

personal-mac:~ tusysadmin$ limactl list
NAME            STATUS     SSH                VMTYPE    ARCH       CPUS    MEMORY    DISK      DIR
docker          Stopped    127.0.0.1:0        qemu      aarch64    4       4GiB      100GiB    ~/.lima/docker
linux-server    Running    127.0.0.1:49404    qemu      aarch64    2       2GiB      100GiB    ~/.lima/linux-server
personal-mac:~ tusysadmin$

Para explorar más opciones de administración podemos usar el comando limactl -h.

Pool iSCSI para KVM

KVM puede utilizar iSCSI como backend de almacenamiento, si se cuenta con una SAN (Storage Area Network) pueden asignarse LUN’s (Logical Unit Numbers) y presentarlas a las máquinas virtuales. El pool es creado en el almacenamiento pero libvirt no puede crearlo o eliminarlo.

Instalación Servidor iSCSI


Hostname: target.local
IP Address: 192.168.100.127

Comenzamos con la instalación.

]$ sudo yum install -y targetd targetcli
]$ sudo systemctl enable --now target

Habilitamos el servicio en el cortafuegos.

]$ sudo firewall-cmd --add-service=iscsi-target --permanent
]$ sudo firewall-cmd --reload
success

En este punto ya contamos con un lvm de 30 GB sin montar, en este caso /dev/vg1/lv1.

[tusysadmin@target ~]$ lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0          11:0    1 1024M  0 rom
vda         252:0    0    6G  0 disk
├─vda1      252:1    0    5G  0 part
│ ├─rl-root 253:0    0  4.4G  0 lvm  /
│ └─rl-swap 253:1    0  616M  0 lvm  [SWAP]
└─vda2      252:2    0    1G  0 part /boot
vdb         252:16   0   30G  0 disk
└─vdb1      252:17   0   30G  0 part
  └─vg1-lv1 253:2    0   30G  0 lvm

Lanzamos la utilidad targetcli.

[root@target ~]# targetcli
targetcli shell version 2.1.53
Copyright 2011-2013 by Datera, Inc and others.
For help on commands, type 'help'.

/> ls
o- / ............................................................... [...]
  o- backstores .................................................... [...]
  | o- block ........................................ [Storage Objects: 0]
  | o- fileio ....................................... [Storage Objects: 0]
  | o- pscsi ........................................ [Storage Objects: 0]
  | o- ramdisk ...................................... [Storage Objects: 0]
  o- iscsi .................................................. [Targets: 0]
  o- loopback ............................................... [Targets: 0]
/>

Crearemos un dispositivo de bloques, esto lo hacemos dentro de backstores/block.

/> backstores/block create vms_store /dev/vg1/lv1
Created block storage object vms_store using /dev/vg1/lv1.
/>

Creamos el IQN (iSCSI Qualified Name).

/> cd iscsi
/iscsi> create iqn.2022-05.com.target:vms
Created target iqn.2022-05.com.target:vms.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.
/iscsi>

Creamos el LUN asociado al bloque vms_store.

/iscsi> cd iqn.2022-05.com.target:vms/tpg1
/iscsi/iqn.20...rget:vms/tpg1> luns/ create /backstores/block/vms_store
Created LUN 0.
/iscsi/iqn.20...rget:vms/tpg1>

Ahora creamos una ACL (Access Control List) en el que indicamos el IQN del cliente al que presentaremos la LUN.

/iscsi/iqn.20...rget:vms/tpg1> acls/ create iqn.2022-05.com.iniciator:vms
Created Node ACL for iqn.2022-05.com.iniciator:vms
Created mapped LUN 0.
/iscsi/iqn.20...rget:vms/tpg1>

Salimos de targetcli y verificamos que el puerto este abierto.

[tusysadmin@target ~]$ ss -an | grep 3260
tcp    LISTEN     0      256       *:3260                  *:*

Configurar iniciador

Ahora toca configurar el iniciador iSCSI en nuestro servidor de máquinas virtuales para posteriormente presentarlo a KVM.

[tusysadmin@localhost ~]$ sudo yum install iscsi-initiator-utils -y

Editamos el archivo initiatorname.iscsi

~]$ sudo vi /etc/iscsi/initiatorname.iscsi

En este archivo ponemos el nombre que anteriormente agregamos en la ACL.

InitiatorName=iqn.2022-05.com.iniciator:vms

Probamos la configuración.

[tusysadmin@localhost ~]$ sudo iscsiadm -m discovery -t st -p target.local
192.168.100.127:3260,1 iqn.2022-05.com.target:vms

Hacemos el login al target.

~]$ sudo iscsiadm --mode node --targetname iqn.2022-05.com.target:vms --portal target.local --login
Logging in to [iface: default, target: iqn.2022-05.com.target:vms, portal: 192.168.100.127,3260]
Login to [iface: default, target: iqn.2022-05.com.target:vms, portal: 192.168.100.127,3260] successful.

Crear el pool

Con la conexión establecida a nuestra servidor de maquina virtuales ya podemos crear el pool iSCSI y usarlo en nuestras maquinas virtuales. Creamos el archivo iscsipool.xml con el siguiente contenido.

<pool type='iscsi'>
    <name>iscsipool</name>
    <source>
        <host name='192.168.100.127'/>
        <device path='iqn.2022-05.com.target:vms'/>
    </source>
    <initiator>
	    <iqn name='iqn.2022-05.com.iniciator:vms' />
    </initiator>
    <target>
        <path>/dev/disk/by-path</path>
    </target>
</pool>

Básicamente es la información del target y del iniciador lista para ser agregada a KVM. Ahora definimos, iniciamos y auto iniciamos el pool.

[tusysadmin@localhost ~]$ sudo virsh pool-define --file iscsipool.xml
El grupo iscsipool ha sido definido desde iscsipool.xml

[tusysadmin@localhost ~]$ sudo virsh pool-start --pool iscsipool 
Se ha iniciado el grupo iscsipool

[tusysadmin@localhost ~]$ sudo virsh pool-autostart --pool iscsipool
El grupo iscsipool ha sido marcado como iniciable automáticamente

Listamos el pool la información de el mismo.

[tusysadmin@localhost ~]$ sudo virsh pool-info iscsipool
Nombre:         iscsipool
UUID:           80ba818f-14da-4c77-aee4-55f82dcefc34
Estado:         ejecutando
Persistente:    si
Autoinicio:     si
Capacidad:      30.00 GiB
Ubicación:      30.00 GiB
Disponible:     0.00 B

Con esto, el pool ya puede ser usado en KVM como otro pool para presentarse a las maquinas virtuales.

Montar Pool LVM para KVM

Por default KVM guarda las imágenes de los discos virtuales en /var, si dicho directorio pertenece a la partición raíz esto puede ocasionar que el disco del equipo anfitrión se llene. Para evitar este problema, las imágenes de discos virtuales pueden montarse en un Volumen Group.

Llegados a este punto he montado un disco duro de 1TB, el disco está en /dev/sda, con los siguientes comandos crearemos la tabla de partición y la etiqueta lvm.

sudo parted /dev/sda mklabel msdos
sudo parted /dev/sda mkpart primary 0% 100%
sudo parted /dev/sda set 1 lvm on

Creamos el Volumen Group.

sudo pvcreate /dev/sda1
sudo vgcreate vglab /dev/sda1
[tusysadmin@localhost ~]$ sudo vgs
  VG     #PV #LV #SN Attr   VSize    VFree   
  fedora   1   1   0 wz--n- <110.20g       0 
  vglab    1   1   0 wz--n- <931.51g <831.51g

Abrimos virt-manager y en el menú Editar seleccionamos Detalles de la conexión, en la pestaña de Almacenamiento agregamos un nuevo pool.

Podemos listar los pools disponibles en el equipo anfitrión para corroborar que ha sido exitosamente añadido.

[tusysadmin@localhost ~]$ sudo virsh pool-list
 Nombre      Estado   Inicio automático
-----------------------------------------
 default     activo   si
 s.o         activo   si
 volumenes   activo   si

Ahora, en vez de almacenar los discos virtuales en /var podrán ser guardados en un LVM, solo debemos asegurarnos de seleccionar la opción correcta al momento de crear la maquina virtual.

Administrar para crear el LVM

Image 1 De 5

Validamos la creación del LVM.

[tusysadmin@localhost ~]$ sudo lvdisplay vglab/Maquina1
  --- Logical volume ---
  LV Path                /dev/vglab/Maquina1
  LV Name                Maquina1
  VG Name                vglab
  LV UUID                vnOjXX-981U-tbej-jPQl-C6mG-ft0p-E34Ki9
  LV Write Access        read/write
  LV Creation host, time localhost, 2021-10-03 22:48:27 -0500
  LV Status              available
  # open                 1
  LV Size                30.00 GiB
  Current LE             7680
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:2

Instalar KVM en Fedora 34-38

KVM es un hipervisor de código abierto y libre que puede ser utilizado en la mayoría de las distribuciones Linux. Permite la emulación de interfaces de red, procesador, disco, PCI y unidades USB gracias al uso de QEMU. Aunque también puede usar XEN en caso de que se use en paravirtualización.

linux_kvm - Davoud Teimouri - Virtualization and Data Center

Primeramente validamos si nuestro equipo acepta virtualización. En algunos casos está deshabilitado en el BIOS y simplemente hay que configurarlo.

$ cat /proc/cpuinfo | egrep "vmx|svm"

Si la respuesta es positiva, continuamos con la instalación de paquetes.

sudo dnf -y install libvirt virt-install qemu-kvm virt-manager

Iniciamos y habilitamos el servicio libvirtd

sudo systemctl start libvirtd
sudo systemctl enable libvirtd

Para que nuestro usuario tenga acceso al administrador gráfico debe pertenecer al grupo libvirt.

sudo usermod -aG libvirt tusysadmin

Listo, con esto ya es posible comenzar con la instalación y administración de maquinas virtuales con nuestro usuario.

Virtual Machine Manager

Image 1 De 3

© 2025

Tema por Anders NorenArriba ↑