FreeBSD soporta lo que llama boot environments, estos funcionan en base a los clones de ZFS por lo que será necesario emplear dicho sistema de ficheros para poder sacarle provecho. Los boot environments nos permitirán realizar actualizaciones sobre equipos físicos o VMs sin peligro ya que podremos revertir los cambios en caso de que algo falle.
La herramienta de gestión de “boot environments” que viene instalada por defecto en FreeBSD es Bectl aunque existen otras opciones como Beadm .
Como podemos ver FreeBSD por defecto genera un “boot environment” en la instalación del sistema operativo.
BE Active Mountpoint Space Created
default NR / 967M 2021-03-28 15:26
Un “boot environment” comprende el sistema operativo entero a excepción de los siguientes directorios:
/tmp
/usr/home
/usr/ports
/usr/src
/var/audit
/var/crash
/var/log
/var/mail
/var/tmp
Estos directorios no se contemplan ya que pueden contener información de usuario o de aplicaciones y no es conveniente perderlos en ningún caso.
A efectos demostrativos creamos un “boot environment” llamado pre_install:
Consultamos los “boot environments”:
BE Active Mountpoint Space Created
default NR / 967M 2021-03-28 15:26
pre_install - - 8K 2021-03-28 16:39
Podemos ver que se ha creado un nuevo dataset ZFS:
NAME USED AVAIL REFER MOUNTPOINT
zroot 970M 6.32G 96K /zroot
zroot/ROOT 967M 6.32G 96K none
zroot/ROOT/default 967M 6.32G 967M /
zroot/ROOT/pre_install 8K 6.32G 967M /
Normalmente utilizaremos los “boot environments” cuando vayamos a actualizar el SO, pero para hacer la prueba instalaremos la herramienta htop:
Y generaremos algunos ficheros para comprobar mas adelante su existencia al arrancar un “boot environment” u otro:
touch /var/BB
Activamos el “boot environment” pre_install:
Successfully activated boot environment pre_install
Comprobamos el estado actual de los “boot environments”:
BE Active Mountpoint Space Created
default N / 420K 2021-03-28 15:26
pre_install R - 967M 2021-03-28 16:39
Reiniciamos:
Por defecto arrancará el “boot environment” que le hayamos indicado pero podemos sobreescribir la configuración de forma manual desde el propio boot de FreeBSD, accedemos a la siguiente opción:
8 Boot Environments
En este menú veremos que por defecto tenemos como active pre_install ya que es la opción que activamos antes del reinicio, pero presionando la tecla “2” podemos ir alternando para arrancar uno u otro.
En realidad no era necesario acceder a este menú ya que por defecto hemos dejado configurado el “boot environment” pre_install, pero lo muestro para que quede claro que desde el loader se puede elegir el “boot environment” que deseemos.
Lo dejamos en pre_install y presionamos ENTER para arrancar.
Accedemos al sistema y comprobamos que el equipo se encuentra en el estado justo antes de instalar htop:
htop: Command not found.
El fichero dentro del directorio excluido del “boot environment” seguirá existiendo ya que son datos del usuario y no deseamos perderlos:
-rw-r--r-- 1 root kr0m 0 Mar 28 16:40 /home/kr0m/AA
En cambio el fichero generado en /var ha dejado de existir:
ls: /var/BB: No such file or directory
Si deseamos eliminar algún “boot environment” tan solo debemos pasarle el parámetro destroy seguido del nombre del “boot environment”:
Comprobamos que lo haya destruido:
BE Active Mountpoint Space Created
pre_install NR / 967M 2021-03-28 16:39
En este caso que hemos revertido lo mejor es renombrar el “boot environment” a default para evitar problemas ya que así en la próxima actualización podremos volver a utilizar el nombre pre_install:
Consultamos los “boot environments”:
BE Active Mountpoint Space Created
default NR / 967M 2021-03-28 16:39
En este artículo solo hemos utilizado bectl de una forma muy básica, este permite operaciones mas complejas como generar una Jail a partir de un “boot environment” en concreto, consiguiendo así convertir un equipo físico a Jail.