En este artÃculo explicaremos como migrar un sistema FreeBSD 12.2 a 13.0, las principales caracterÃsticas a destacar de la versión 13 son la incorporación de OpenZFS y TLS en el propio kernel, para mas detalles podemos ver las notas de lanzamiento en este enlace: https://www.freebsd.org/releases/13.0R/relnotes/
La migración se llevará a cabo de distinto modo según se trate de un sistema fÃsico o una jail virtualizada, además hay variaciones dependiendo del sistema de boot que se emplee. Por otro lado también explicaremos algunos aspectos a tener en cuenta si utilizamos FUSE, ZFS o Poudriere.
- Sistema operativo
- Loader update: EFI
- Loader update: BIOS
- ZFS update
- FUSE update
- IOCAGE update
- Iocage - Template
- Poudriere
- Poudriere - limpieza
Sistema operativo
Actualizamos el kernel y las core tools a la última versión dentro de la 12.2:
freebsd-update install
Hacemos lo mismo con los paquetes binarios:
pkg autoremove
Comprobamos la versión actual
12.2-RELEASE-p6
Creamos un BE(boot environment) nuevo:
bectl list
BE Active Mountpoint Space Created
13 - - 8K 2021-05-15 18:03
default NR / 41.7G 2020-11-27 23:58
Montamos el BE:
Successfully mounted 13 at /var/tmp/BE-13
Chrooteamos a este directorio:
mount -t devfs devfs /dev
rm -rf /var/db/freebsd-update
mkdir /var/db/freebsd-update
Upgradeamos a 13.0:
Instalamos kernel y módulos:
Instalamos userspace/binaries/libraries
El asistente nos informa de que debemos reinstalar todos los paquetes instalados:
Completing this upgrade requires removing old shared object files.
Please rebuild all installed 3rd party software (e.g., programs
installed from the ports tree) and then run "/usr/sbin/freebsd-update install"
again to finish installing updates.
Reinstalamos según utilicemos paquetes binarios o ports:
pkg upgrade
git -C /usr/ports pull
cd /usr/ports
make fetchindex
for PORT in $(pkg info|awk '{print$1}'); do PORT_PATH=$(pkg info $PORT|grep Origin|awk '{print$3}') && echo PORT: $PORT - $PORT_PATH && cd /usr/ports/$PORT_PATH && export BATCH="yes" && make clean reinstall clean; done
Detectará el cambio de ABI y reinstalará todos los paquetes instalados.
Eliminamos librerias y ficheros antiguos:
Salimos del chroot:
Desmontamos el BE:
Activamos el BE para que sea cargado en el próximo arranque:
Otro aspecto importante del SO es el loader, para pasar a la versión 13.0 también debemos actualizarlo.
Loader update: EFI
Localizamos la partición EFI:
40 409600 nvd0p1 efi (200M)
Montamos la partición y mostramos su contenido:
find /mnt
/mnt
/mnt/efi
/mnt/efi/boot
/mnt/efi/boot/BOOTx64.efi
/mnt/efi/boot/startup.nsh
/mnt/System Volume Information
Actualizamos el loader:
Desmontamos la partición EFI:
En el siguiente enlace podemos ver el cambio en el modo de gestionar la partición EFI:
https://www.freebsd.org/releases/13.0R/relnotes/#boot
Prior releases had a complete ms-dos formatted filesystem packaged into boot1.efifat. Older versions of FreeBSD installed this filesystem image into a raw partition. However, uses of the ESP have proliferated, making this inflexible approach no longer desirable.
Users have varied needs for the size of this partition, and multiple booting setups require more detailed access.
To update old ESP partitions, users should stop using the gpart(8) utility. Instead, ESP partitions should be mounted as MS-DOS filesystems as /boot/efi, and /boot/loader.efi should be copied to /boot/efi/efi/boot/bootx64.efi if the default setup is use.
If the efibootmgr(8) utility is used to customize the boot environment, this file should be copied to the location set with the -l flag.
Antes se volcaba directamente una imagen de la partición EFI a una partición:
gpart bootcode -p /boot/boot1.efifat -i 1 vtbd1
Ahora ya no, ahora se monta la partición EFI y se copia el fichero:
loader.efi
Loader update: BIOS
Si arrancamos mediante BIOS debemos localizar la partición de boot:
40 1024 ada0p1 freebsd-boot (512K)
Volcamos el contenido del fichero /boot/pmbr a la MBR(primeros 512bytes) del disco y el contenido del fichero /boot/gptzfsboot sobre la partición de boot:
partcode written to ada0p1
bootcode written to ada0
Reiniciamos:
Si algo sale mal siempre podemos arrancar el otro BE.
Si por otro lado nos quedamos sin bootloader, podemos restaurarlo arrancando una ISO de FreeBSD13 y copiando loader.efi a la partición EFI o reescribiendo la MBR y la partición boot en caso de utilizar modo BIOS.
En modo EFI veremos el nuevo loader:
En BIOS continuaremos con el antiguo:
Comprobamos la versión:
13.0-RELEASE
Cuando estemos seguros de que la nueva versión funciona sin problemas podemos a renombrar el BE:
bectl rename 13 default
ZFS update
Cuando se actualiza el código ZFS debemos updatear los pools del sistema para habilitar las nuevas funcionalidades:
pool: zroot
state: ONLINE
status: Some supported features are not enabled on the pool. The pool can
still be used, but some features are unavailable.
action: Enable all features using 'zpool upgrade'. Once this is done,
the pool may no longer be accessible by software that does not support
the features. See zpool-features(5) for details.
config:
NAME STATE READ WRITE CKSUM
zroot ONLINE 0 0 0
nvd0p4 ONLINE 0 0 0
errors: No known data errors
Actualizamos el pool:
pool: zroot
state: ONLINE
config:
NAME STATE READ WRITE CKSUM
zroot ONLINE 0 0 0
nvd0p4 ONLINE 0 0 0
errors: No known data errors
FUSE update
El nombre del módulo del kernel de FUSE ha sido renombrado asà que actualizamos la lista de módulos:
kld_list="nvidia-modeset fusefs vmm if_tap if_bridge nmdm linux linux64 linprocfs linsysfs fdescfs"
IOCAGE update
Primero actualizamos el padre a 13.0 siguiendo los pasos anteriores de este mismo artÃculo.
El siguiente paso es actualizar tanto el SO como los paquetes a su última versión en cada una de las jails.
pkg autoremove
Ahora ya podemos actualizarlas a 13.0, Bajamos la RELEASE desde Iocage:
[0] 11.2-RELEASE
[1] 11.3-RELEASE
[2] 11.4-RELEASE
[3] 12.0-RELEASE
[4] 12.1-RELEASE
[5] 12.2-RELEASE
[6] 13.0-RELEASE
Type the number of the desired RELEASE
Press [Enter] to fetch the default selection: (13.0)
Type EXIT to quit:
Fetching: 13.0-RELEASE
Actualizamos cada una de las jails:
iocage update $JAILNAME
iocage console $JAILNAME
Si vemos el siguiente mensaje de error, debemos cambiar la shell a la por defecto antes de acceder a la jail:
ld-elf.so.1: Shared object “libncursesw.so.8” not found, required by “bash”
Dentro de la jail
Según utilicemos paquetes binarios o ports ejecutaremos:
pkg-static upgrade -f
git -C /usr/ports pull
cd /usr/ports
make fetchindex
for PORT in $(pkg info|awk '{print$1}'); do PORT_PATH=$(pkg info $PORT|grep Origin|awk '{print$3}') && echo PORT: $PORT - $PORT_PATH && cd /usr/ports/$PORT_PATH && export BATCH="yes" && make clean reinstall clean; done
Cuando termine, salimos de la jail
Revertimos el cambio de shell:
Terminamos la actualización:
NOTA: Las actualizaciones mediante Iocage realizan de forma automática un snapshot en cada actualización de este modo si algo saliese mal se podrÃa revertir sin problemas.
Pero debemos tener en cuenta que los snapshots ocupan espacio en disco:
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
storage 928G 822G 106G - - 34% 88% 1.00x ONLINE -
zroot 109G 104G 5.38G - - 87% 95% 1.00x ONLINE -
+----------------+-------+------+------+-------+-------+
| NAME | CRT | RES | QTA | USE | AVA |
+================+=======+======+======+=======+=======+
| Andromeda | 1.56x | none | none | 3.48G | 13.5G |
+----------------+-------+------+------+-------+-------+
| DrWho | 1.74x | none | none | 7.33G | 13.5G |
+----------------+-------+------+------+-------+-------+
| HAProxy | 1.59x | none | none | 4.71G | 13.5G |
+----------------+-------+------+------+-------+-------+
| Infinity | 1.56x | none | none | 4.09G | 13.5G |
+----------------+-------+------+------+-------+-------+
| Lomax | 1.42x | none | none | 5.82G | 13.5G |
+----------------+-------+------+------+-------+-------+
| Mistery | 1.50x | none | none | 12.4G | 13.5G |
+----------------+-------+------+------+-------+-------+
| Potras | 1.61x | none | none | 6.33G | 13.5G |
+----------------+-------+------+------+-------+-------+
| basic_template | 1.64x | none | none | 4.46G | 13.5G |
+----------------+-------+------+------+-------+-------+
| redis00 | 1.55x | none | none | 3.37G | 13.5G |
+----------------+-------+------+------+-------+-------+
| redis01 | 1.58x | none | none | 3.39G | 13.5G |
+----------------+-------+------+------+-------+-------+
| redis02 | 1.58x | none | none | 3.39G | 13.5G |
+----------------+-------+------+------+-------+-------+
| rxWod | 1.75x | none | none | 10.1G | 13.5G |
+----------------+-------+------+------+-------+-------+
Cuando tengamos claro que la jail funciona sin problemas podremos limpiar los snapshots:
JAIL=….
for SNAPTOREMOVE in $(iocage snaplist $JAIL|grep -v root|grep -v ‘+’|grep -v ‘NAME’|awk ‘{print$2}’); do
iocage snapremove -n $SNAPTOREMOVE $JAIL
done
Iocage - Template
Para actualizar templates primero debemos convertilos a jail, actualizarlos y volvemos a convertirlos a template:
+-----+----------------+-------+--------------+--------------+
| JID | NAME | STATE | RELEASE | IP4 |
+=====+================+=======+==============+==============+
| - | basic_template | down | 12.2-RELEASE | 192.168.69.9 |
+-----+----------------+-------+--------------+--------------+
iocage start $JAIL
Actualizar como si de una jail regular se tratase
Borramos los snapshots del template:
JAIL=….
for SNAPTOREMOVE in $(iocage snaplist $JAIL|grep -v root|grep -v ‘+’|grep -v ‘NAME’|awk ‘{print$2}’); do
iocage snapremove -n $SNAPTOREMOVE $JAIL
done
Volvemos a convertirla a template:
+-----+----------------+-------+--------------+--------------+
| JID | NAME | STATE | RELEASE | IP4 |
+=====+================+=======+==============+==============+
| - | basic_template | down | 13.0-RELEASE | 192.168.69.9 |
+-----+----------------+-------+--------------+--------------+
Poudriere
Nos bajamos la nueva versÃon de RELEASE:
JAILNAME VERSION ARCH METHOD TIMESTAMP PATH
freebsd_12-2x64 12.2-RELEASE-p6 amd64 ftp 2021-05-10 23:36:10 /usr/local/poudriere/jails/freebsd_12-2x64
freebsd_13-0x64 13.0-RELEASE amd64 ftp 2021-05-17 15:19:03 /usr/local/poudriere/jails/freebsd_13-0x64
Migramos las opciones genéricas de compilación:
Las opciones por paquete:
La config de las opciones de compilación:
Actualizamos la jail y ports:
poudriere ports -u -p HEAD
Compilamos los ports:
La parte del cliente quedarÃa del siguiente modo:
poudriere: {
url: "http://poudriere.alfaexploit.com/packages/freebsd_13-0x64-HEAD/",
mirror_type: "http",
signature_type: "pubkey",
pubkey: "/usr/local/etc/ssl/certs/poudriere.cert",
enabled: yes,
}
Comprobamos que el contenido del repositorio esté accesible:
<html>
<head><title>Index of /packages/</title></head>
<body>
<h1>Index of /packages/</h1><hr><pre><a href="../">../</a>
<a href="freebsd_12-2x64-HEAD/">freebsd_12-2x64-HEAD/</a> 10-May-2021 21:37 -
<a href="freebsd_13-0x64-HEAD/">freebsd_13-0x64-HEAD/</a> 17-May-2021 17:54 -
</pre><hr></body>
</html>
Recompilamos todos los paquetes:
Si en el servidor de compilación utilizamos un script automático como el indicado
aquÃ
, debemos modificarlo también:
#!/usr/local/bin/bash
poudriere jail -u -j freebsd_13-0x64
poudriere ports -u -p HEAD
poudriere options -j freebsd_13-0x64 -p HEAD -f /usr/local/etc/poudriere.d/port-list
poudriere bulk -j freebsd_13-0x64 -p HEAD -f /usr/local/etc/poudriere.d/port-list
Poudriere - limpieza
Eliminamos la jail:
Eliminamos el código fuente de los paquetes:
Eliminamos los logs:
Eliminamos los paquetes compilados:
Eliminamos algunos directorios residuales:
rm -rf /usr/local/etc/poudriere.d/freebsd_12-2x64-HEAD-options
rm /usr/local/etc/poudriere.d/freebsd_12-2x64-make.conf
Eliminamos la versión antigua del fichero data.json: