Virtualización BSD bhyve zfs FreeBSD 13.0
https://wiki.freebsd.org/bhyve
https://github.com/churchers/vm-bhyve
FreeBSD como anfitrión con bhyve
De forma predeterminada, bhyve proporciona acceso a la consola serie y no emula una consola gráfica.
Comprobar si el procesador Intel soporta virtualización:
# dmesg | grep vt
[drm] - kern.vt.fb.modes.DP-1
[drm] - kern.vt.fb.default_mode
...
El primer paso para crear una máquina virtual en bhyve es configurar el sistema host cargando el módulo del kernel de bhyve.
# kldload vmm
# kldstat|grep vmm
26 1 0xffffffff83200000 53a420 vmm.ko
El módulo se cargará automáticamente al iniciar el sistema agregando vmm a la linea kld_list del archivo /etc/rc.conf.
# sysrc kld_list+="vmm"
kld_list="fusefs /boot/modules/i915kms.ko vmm"
El siguiente paso es instalar bhyve virtual machine vm-bhyve, bhyve-firmware y grub2-bhyve. Este último para entornos linux o máquinas virtuales que requieran grub.
# pkg install vm-bhyve bhyve-firmware grub2-bhyve
Crear un conjunto de datos zfs llamado vm donde estarán almacenadas las máquinas virtuales. El grupo de almacenamiento se llama zroot.
# zfs create zroot/vm
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
zroot 16.9G 88.6G 96K /zroot
zroot/ROOT 8.60G 88.6G 96K none
zroot/ROOT/default 8.60G 88.6G 8.56G /
zroot/ROOT/system_freebsd_180921 8K 88.6G 8.53G /
zroot/export 416K 88.6G 96K /zroot/export
zroot/tmp 312K 88.6G 192K /tmp
zroot/usr 7.65G 88.6G 96K /usr
zroot/usr/home 6.84G 88.6G 1.76G /usr/home
zroot/usr/home/carlos 3.40G 88.6G 3.40G /usr/home/carlos
zroot/usr/ports 832M 88.6G 832M /usr/ports
zroot/usr/src 104K 88.6G 96K /usr/src
zroot/var 1.78M 88.6G 96K /var
zroot/var/audit 104K 88.6G 96K /var/audit
zroot/var/crash 104K 88.6G 96K /var/crash
zroot/var/log 1.10M 88.6G 752K /var/log
zroot/var/mail 216K 88.6G 128K /var/mail
zroot/var/tmp 164K 88.6G 100K /var/tmp
zroot/vm 686M 88.6G 133M /zroot/vm
Habilitar vm-bhyve en /etc/rc.conf y configurar el conjunto de datos que se utilizará
# sysrc vm_enable="YES"
# sysrc vm_dir="zfs:zroot/vm"
En este punto guardar y reiniciar el sistema.
Debe tener los módulos vmm ejecutándose en segundo plano:
# kldstat | grep vmm
26 1 0xffffffff83200000 53a420 vmm.ko
Ejecutar el comando vm init crea los directorios necesarios en $vm_dir.
# vm init
Crear un directorio llamado .templates
# mkdir -p /vm/.templates
# ls /vm/.templates/
Listando los archivos de configuración para todos los posibles sistemas operativos compatibles que pueden ejecutarse como invitado:
# ls /usr/local/share/examples/vm-bhyve/
alpine.conf coreos.conf freepbx.conf ubuntu.conf
arch.conf debian.conf linux-zvol.conf windows.conf
centos6.conf default.conf netbsd.conf
centos7.conf dragonfly.conf openbsd.conf
config.sample freebsd-zvol.conf resflash.conf
Crear un conmutador virtual (switch) llamado public y adjuntar la interfaz de
red Ethernet a él.
# vm switch create public
# vm switch add public re0
# vm switch list
NAME TYPE IFACE ADDRESS PRIVATE MTU VLAN PORTS
public standard vm-public - no - - re0
Firewall IPFW:
Permitir el paso de paquetes bhyve
net.link.bridge.ipfw=1
# sysctl net.link.bridge.ipfw=1
Hacer el cambio permanente
net.link.bridge.ipfw=1
Instalar y ejecutar sistemas operativos invitados virtualizados
FreeBSD virtualizacion vm-bhyve - Arch Linux
Descargar Arch Linux
# vm iso https://mirror.cyberbits.eu/archlinux/iso/2022.06.01/archlinux-2022.06.01-x86_64.iso
Copiar la plantilla para Arch Linux - arch.conf
# cp /usr/local/share/examples/vm-bhyve/arch.conf /zroot/vm/.templates/
# vm iso
DATASTORE FILENAME
default archlinux-2022.06.01-x86_64.iso
default fetch.out
Importante: Cambiar los parámetros vmlinuz, archiso y archisobasedir a sus valores correctos:
# cat /zroot/vm/.templates/arch.conf
loader="grub"
cpu=1
memory=512M
network0_type="virtio-net"
network0_switch="public"
disk0_type="virtio-blk"
disk0_name="disk0.img"
grub_install0="linux /arch/boot/x86_64/vmlinuz-linux archisobasedir=arch archisolabel=ARCH_202206 ro"
grub_install1="initrd /arch/boot/x86_64/initramfs-linux.img"
Crear vm -t template -s size nombre
# vm create -t arch -s 9G arch
Instalar en primer plano vm -f dentro de arch una vm con arhivo iso
# vm install -f arch archlinux-2021.09.01-x86_64.iso
Particionar el disco:
# cfdisk
Elegir dos para BIOS
root@archiso ~ # fdisk -l
Disk /dev/vda: 10 GiB, 10737418240 bytes, 20971520 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 131072 bytes
I/O size (minimum/optimal): 131072 bytes / 131072 bytes
Disklabel type: dos
Disk identifier: 0xae1d35ff
Device Boot Start End Sectors Size Id Type
/dev/vda1 * 2048 1050623 1048576 512M 83 Linux
/dev/vda2 1050624 16779263 15728640 7.5G 83 Linux
/dev/vda3 16779264 17827839 1048576 512M 82 Linux swap / Solaris
Disk /dev/loop0: 662.69 MiB, 694882304 bytes, 1357192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Crear los sistemas de ficheros:
root@archiso ~ # mkfs.ext2 /dev/vda1
mke2fs 1.46.4 (18-Aug-2021)
Creating filesystem with 262144 1k blocks and 65536 inodes
Filesystem UUID: 0b6850ec-379f-4be5-ac4f-fcafae08fbbc
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729, 204801, 221185
Allocating group tables: done
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
root@archiso ~ # mkfs.ext4 /dev/vda2
mke2fs 1.46.4 (18-Aug-2021)
Creating filesystem with 2555648 4k blocks and 638976 inodes
Filesystem UUID: 34353334-88c2-40b9-930a-8c788705545e
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
root@archiso ~ # mkswap /dev/vda3
root@archiso ~ # swapon /dev/vda3
Montando las particiones:
root@archiso ~ # mount /dev/vda2 /mnt
root@archiso ~ # mkdir -p /mnt/boot
root@archiso ~ # mount /dev/vda1 /mnt/boot
El comando pacstrap para indicar donde queremos instalar los paquetes desde los repositorios arch, y lo que queremos instalar
root@archiso ~ # pacstrap /mnt base base-devel grub ntfs-3g networkmanager xdg-user-dirs linux linux-firmware vim dhcpcd openssh
Generar fstab
root@archiso ~ # genfstab -pU /mnt >> /mnt/etc/fstab
Entrar en arch chroot
root@archiso ~ # arch-chroot /mnt
[root@archiso /]#
Establecer la zona horaria:
[root@archiso /]# ln -sf /usr/share/zoneinfo/Europe/Madrid /etc/localtime
[root@archiso /]# echo rioarch > /etc/hostname
[root@archiso /]# nano /etc/locale.gen
es_ES.UTF-8 UTF-8
[root@archiso /]# echo LANG=es_ES.UTF-8 > /etc/locale.conf
Generar el archivo locale.gen con el siguiente comando:
[root@archiso /]# locale-gen
Cuando GNU/Linux arranca, el sistema está configurado para leer el reloj interno del equipo, después el reloj del sistema, que es independiente. Usaremos el comando hwclock -w para ajustar el reloj interno.
[root@archiso /]# hwclock -w
Configurar distribución de teclado
[root@archiso /]# echo KEYMAP=la-latin1 > /etc/vconsole.conf
Instalar grub
Ahora procedamos a instalar el grub y usar el comando correcto, sin UEFI
[root@archiso /]# grub-install /dev/vda
Installing for i386-pc platform.
Installation finished. No error reported.
Actualizar grub
Creamos el archivo grub.cfg
[root@archiso /]# grub-mkconfig -o /boot/grub/grub.cfg
[root@archiso /]# passwd
New password:
Retype new password:
passwd: password updated successfully
Agregar usuario no privilegiado
useradd -m -g users -G storage,wheel,power -s /bin/bash carlos
Establecer contraseña del usuario
[root@archiso /]# passwd carlos
Antes de salir de root:
[root@arch ~]# cat /boot/grub/grub.cfg |grep vmlinuz-linux
linux /vmlinuz-linux root=UUID=781ccb0f-c524-402e-a2a8-e32a50371223 rw loglevel=3 quiet
linux /vmlinuz-linux root=UUID=781ccb0f-c524-402e-a2a8-e32a50371223 rw loglevel=3 quiet
linux /vmlinuz-linux root=UUID=781ccb0f-c524-402e-a2a8-e32a50371223 rw loglevel=3 quiet
Este UUID lo necesitará:
781ccb0f-c524-402e-a2a8-e32a50371223 rw
para sustituirlo por el creado por la vm en esta ruta /zroot/vm/arch/arch.conf en el host FreeBSD.
root@freebsd:/zroot/vm/arch # cat arch.conf
loader="grub"
cpu=1
memory=512M
network0_type="virtio-net"
network0_switch="public"
disk0_type="virtio-blk"
disk0_name="disk0.img"
grub_install0="linux /arch/boot/x86_64/vmlinuz-linux archisobasedir=arch archisolabel=ARCH_202109 ro"
grub_install1="initrd /arch/boot/x86_64/initramfs-linux.img"
uuid="a923082e-1deb-11ec-9f91-fc3fdbd15275"
network0_mac="58:9c:fc:0e:36:e4"
grub_run0="linux /vmlinuz-linux root=UUID=781ccb0f-c524-402e-a2a8-e32a50371223 rw"
grub_run1="initrd /initramfs-linux.img"
uuid="9eb191c3-1e01-11ec-a508-fc3fdbd15275"
Saliendo de chrootYa terminado esto, salimos de chroot
[root@archiso /]# exit
Desmontar particion /boot# umount /mnt/boot/
Desmontar particion Raíz# umount /mnt
# dhcpcd enp0s5
dhcpcd-9.4.0 starting
DUID 00:04:a9:23:08:2e:1d:eb:11:ec:9f:91:fc:3f:db:d1:52:75
enp0s5: waiting for carrier
enp0s5: carrier acquired
enp0s5: IAID fc:0e:36:e4
enp0s5: adding address fe80::f2ad:f194:fe94:3e97
enp0s5: soliciting a DHCP lease
enp0s5: soliciting an IPv6 router
enp0s5: offered 192.168.88.165 from 192.168.88.1
enp0s5: probing address 192.168.88.165/24
enp0s5: leased 192.168.88.165 for 600 seconds
enp0s5: adding route to 192.168.88.0/24
enp0s5: adding default route via 192.168.88.1
forked to background, child pid 242
Reiniciar# reboot
[root@arch ~]# ip addr
1: lo: 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: enp0s5: mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 58:9c:fc:0e:36:e4 brd ff:ff:ff:ff:ff:ff
inet 192.168.88.165/24 brd 192.168.88.255 scope global dynamic noprefixroute enp0s5
valid_lft 329sec preferred_lft 254sec
inet6 fe80::f2ad:f194:fe94:3e97/64 scope link
valid_lft forever preferred_lft forever
FreeBSD es genial!