Páginas

Buscar este blog

sábado, 14 de noviembre de 2026

Más allá del tema: Red de seguridad para tu FreeBSD con ZFS y bectl

Instalar un tema visual como WhiteSur (estilo macOS) en XFCE es una tarea de bajo riesgo. Al fin y al cabo, los scripts solo escriben en la carpeta de usuario (~/.themes). Si algo sale mal, basta con borrar la carpeta y elegir otro tema en Apariencia.

Sin embargo, esta instalación es la excusa perfecta para aprender y practicar dos herramientas vitales en FreeBSD con ZFS: los snapshots (fotografías del sistema) y los Boot Environments (entornos de arranque). Dominar esto te salvará el día antes de un freebsd-update, un cambio de controladores o una actualización de paquetes.

Contexto: Este tutorial está probado en FreeBSD 14.5 con ZFS. Aprenderemos a crear una red de seguridad de tres niveles: desde lo más rápido (snapshot del home) hasta lo más robusto (arrancar un sistema anterior completo).

Nivel 1: Snapshots ZFS (El "deshacer" instantáneo)

Un snapshot en ZFS es una copia de solo lectura del estado de un dataset en un momento exacto. Son instantáneos, no duplican la información y son tu primera línea de defensa.

1. Crear el snapshot (antes de instalar el tema)

Como el tema se instala en tu directorio personal, basta con hacer un snapshot solo del home. Es rápido y quirúrgico:

sudo zfs snapshot -r zroot/usr/home@antes-whitesur

Si prefieres proteger absolutamente todo el sistema, puedes hacer un snapshot recursivo del pool (aunque para un tema no es necesario):

sudo zfs snapshot -r zroot@antes-whitesur

2. La trampa del rollback recursivo

Aquí hay un matiz que confunde a mucha gente: zfs snapshot -r sí es recursivo (baja a todos los hijos), pero zfs rollback -r no lo es. En el rollback, la opción -r solo destruye snapshots intermedios del mismo dataset, no se aplica a los hijos.

Por lo tanto, si hiciste el snapshot solo del home, revertir es tan sencillo como:

sudo zfs rollback -r zroot/usr/home@antes-whitesur

Reinicia XFCE (o el equipo) y tu carpeta personal volverá al estado exacto anterior a la instalación del tema.

Ojo: Si hiciste un snapshot recursivo de zroot y quieres revertir todo, tendrás que hacerlo dataset por dataset (raíz, home, etc.). En el anexo final te dejo un script que automatiza esta tarea.

Nivel 2: Boot Environments (El "arranque seguro")

Los Snapshots son geniales, pero si el problema afecta al sistema base (por ejemplo, un fallo de arranque), necesitas algo más potente. Aquí entran los Boot Environments (BE): clones completos y arrancables de tu sistema raíz.

En FreeBSD 14.5 no necesitas instalar nada: bectl ya viene incluido en el sistema base. (Aunque existe beadm en los repositorios de paquetes, bectl es la opción nativa y más directa).

1. Crear un entorno de arranque

Antes de aplicar cambios arriesgados (o instalar tu tema), crea un BE:

sudo bectl create antes-whitesur

Puedes verificar que se ha creado y cuál está activo:

bectl list

2. Simulacro de desastre y recuperación

  1. Instalas el tema y, por lo que sea, el entorno gráfico se rompe o el sistema no arranca.
  2. Reinicias el equipo.
  3. En el menú de arranque de FreeBSD (el cargador), seleccionas el entorno antes-whitesur. ¡Listo! El sistema arranca exactamente como estaba antes.
  4. Si quieres que este sea el entorno por defecto de ahora en adelante, ejecuta:
    sudo bectl activate antes-whitesur

El BE con el tema roto seguirá ahí por si quieres arrancarlo para investigar, hasta que decidas eliminarlo con sudo bectl destroy.


El flujo de trabajo recomendado (Paso a paso)

Si quieres tener ambas redes de seguridad antes de personalizar tu sistema:

  1. Snapshot rápido: sudo zfs snapshot -r zroot/usr/home@antes-whitesur
  2. Red de seguridad total: sudo bectl create antes-whitesur
  3. Instala y configura tu tema WhiteSur.
  4. Si solo falla la apariencia: Haz un rollback del home (zfs rollback) y reinicia XFCE.
  5. Si el sistema entero se vuelve inestable: Reinicia y elige el BE antes-whitesur en el menú de arranque.

Anexo: Script para rollback recursivo de ZFS

Si alguna vez necesitas revertir un snapshot recursivo de todo el pool ZFS (por ejemplo, antes de una actualización mayor del sistema), hacerlo dataset por dataset a mano es un tedio. Aquí tienes un pequeño script en sh que lista los datasets, comprueba si tienen el snapshot y los revierte uno por uno, con modo de simulación (--dry-run) para ver qué hará antes de tocar nada.

#!/bin/sh
# Guarda esto como rollback-zfs.sh y dale permisos: chmod +x rollback-zfs.sh
# Uso: sudo ./rollback-zfs.sh zroot antes-whitesur [--dry-run]

set -u
POOL="${1:-}"
SNAP_NAME="${2:-}"
DRY_RUN="no"

for arg in "$@"; do
    [ "$arg" = "--dry-run" ] && DRY_RUN="si"
done

if [ -z "$POOL" ] || [ -z "$SNAP_NAME" ]; then
    echo "Uso: $0 <pool> <nombre_snapshot> [--dry-run]"
    exit 1
fi

DATASETS=$(zfs list -H -r -o name "$POOL" 2>/dev/null)
if [ -z "$DATASETS" ]; then
    echo "Error: No se encontraron datasets en '$POOL'."
    exit 1
fi

if [ "$DRY_RUN" = "si" ]; then
    echo "=== MODO SIMULACIÓN (dry-run) ==="
else
    echo "=== MODO REAL ==="
fi
echo "Pool: $POOL | Snapshot: @$SNAP_NAME"
echo ""

# Fase 1: Mostrar plan
PLAN_OK=0
for ds in $DATASETS; do
    SNAP_FULL="${ds}@${SNAP_NAME}"
    if zfs list -H -t snapshot -o name "$SNAP_FULL" >/dev/null 2>&1; then
        echo "[PLAN] zfs rollback -r $SNAP_FULL"
        PLAN_OK=$((PLAN_OK + 1))
    else
        echo "[SALTADO] ${ds} (no tiene el snapshot)"
    fi
done

if [ "$DRY_RUN" = "si" ]; then
    echo ""
    echo "=== Simulación finalizada. ==="
    exit 0
fi

# Fase 2: Confirmación y ejecución
printf "\n¿Ejecutar rollback real? [s/N]: "
read RESPUESTA
case "$RESPUESTA" in
    s|S|si|SI) ;;
    *) echo "Cancelado."; exit 0 ;;
esac

echo ""
for ds in $DATASETS; do
    SNAP_FULL="${ds}@${SNAP_NAME}"
    if zfs list -H -t snapshot -o name "$SNAP_FULL" >/dev/null 2>&1; then
        echo -n "Revirtiendo ${ds} ... "
        if zfs rollback -r "$SNAP_FULL" 2>/dev/null; then
            echo "OK"
        else
            echo "FALLO (posible clonación o uso activo)"
        fi
    fi
done
echo "=== Proceso finalizado. Reinicia el equipo. ==="
Consejo final: Si haces rollback de la raíz del sistema (zroot/ROOT/default), asegúrate de hacerlo desde el modo single-user (opción 2 del cargador de FreeBSD) para evitar conflictos con procesos activos.

FreeBSD es genial!.

No hay comentarios:

Publicar un comentario