← Teoría

Práctica 38: FreeBSD 14 con ZFS y jails — el otro Unix

Bloque: Instalación de SO no habituales (sesión 2 de 5)
Duración estimada: 5 horas (1 sesión completa)
Modalidad: trabajo individual
Requisitos previos: haber hecho las prácticas 07 (Ubuntu) y 11 (consola Ubuntu)
Herramientas: VirtualBox 7.x, ISO de FreeBSD 14.x disc1.iso (gratis, ~1 GB), conexión a internet
De qué va esta práctica: hasta ahora, cuando hemos dicho "Unix" en realidad estábamos diciendo "Linux". Pero hay otra rama de Unix muchísimo más antigua y, en algunos sitios, más respetada: BSD (Berkeley Software Distribution). En esta sesión vas a instalar FreeBSD 14, el más popular de los BSDs modernos. Vas a tocar tres cosas que en Linux son rarezas pero en FreeBSD son el día a día: el sistema de archivos ZFS, los contenedores jails y el sistema de paquetes pkg/ports. Al acabar tendrás un punto de comparación real con Linux y entenderás por qué FreeBSD sigue muy vivo en routers, NAS, PlayStations y servidores.
Red del aula: la VM va en adaptador puente contra 192.168.8.0/24. La IP la dará el DHCP del aula.

Objetivos de la práctica

  • Conocer la historia y la genealogía de Unix: System V vs BSD, los "Unix wars", de dónde sale Linux, de dónde sale macOS, y por qué BSD sobrevive.
  • Distinguir las cuatro familias BSD activas (FreeBSD, OpenBSD, NetBSD, DragonFly BSD) y sus diferencias de enfoque.
  • Entender la diferencia entre kernel + userland integrados (BSD) y kernel separado de las miles de distros (Linux), y por qué esto afecta a la documentación y a la coherencia del sistema.
  • Instalar FreeBSD 14 con el instalador bsdinstall y el filesystem raíz sobre ZFS.
  • Configurar el sistema desde /etc/rc.conf usando sysrc, y entender el modelo de servicios de FreeBSD.
  • Manejar pkg (paquetes binarios) y conocer los ports (compilación desde fuentes).
  • Crear pools y datasets ZFS, hacer snapshots y comprobar copy-on-write en directo.
  • Crear una jail (contenedor nativo BSD) con bastille e instalar un servicio dentro.
  • Diagnosticar problemas típicos: la VM no arranca en EFI, red sin DHCP, pkg sin certificados, jails que no tienen red.
  • Documentar todo en una ficha técnica con la versión, el pool ZFS, las jails y los servicios.

Parte 0 — Conceptos previos (45 min)

0.1 — La familia Unix de un vistazo

Unix nació en los Bell Labs (AT&T) a finales de los 60. Como AT&T tenía prohibido comercializarlo, lo distribuyó casi gratis a universidades. La Universidad de Berkeley lo modificó tanto que su versión empezó a vivir aparte: era BSD. De ahí salieron dos genealogías:

  • Rama System V (AT&T): Solaris, AIX, HP-UX, SCO… casi todas comerciales. Hoy moribundas o nicho.
  • Rama BSD (Berkeley): 4.4BSD-Lite → FreeBSD, NetBSD, OpenBSD, DragonFly BSD. Libres. macOS y iOS tienen su núcleo (XNU) directamente derivado de FreeBSD/Mach. PlayStation (3, 4, 5) y Nintendo Switch usan FreeBSD por dentro.

Linux es un caso aparte: Linus Torvalds escribió su propio kernel en 1991 desde cero, inspirándose en Unix pero sin código BSD ni AT&T. Por eso Linux no es Unix en sentido genealógico, aunque sea Unix-like en comportamiento.

0.2 — Las cuatro BSD libres y para qué se usa cada una

BSDFilosofíaDónde la verás
FreeBSDGeneral-purpose, performance, ZFS de serieNetflix CDN, WhatsApp en su día, NAS (TrueNAS), PlayStation
OpenBSDSeguridad por defecto, código auditado, "secure out of the box"Routers, firewalls (PF nació aquí), servidores que no se deben tocar nunca
NetBSDPortabilidad extrema (más de 50 arquitecturas)Equipos raros, embebidos, mainframes IBM
DragonFly BSDFork de FreeBSD 4 con SMP propio (HAMMER FS)Muy nicho, casi solo entusiastas

0.3 — Diferencias clave con Linux

LinuxFreeBSD
Modelo de desarrolloKernel separado; cada distro junta el kernel con su userlandKernel + userland desarrollados juntos como un único sistema (base system)
LicenciaGPL (copyleft, obliga a publicar cambios)BSD (permite cerrar el código, p.ej. la usan Apple, Sony)
Initsystemd (mayoritario), OpenRC, sysvinit, runit…rc.d scripts (estilo BSD), siempre el mismo
Paquetesapt / dnf / pacman / apk / zypper (uno por distro)pkg (binarios) + ports (fuente). Unificado.
Filesystem por defectoext4 / btrfs / xfs / zfs (depende de distro)ZFS o UFS2. ZFS recomendado.
Contenedorescgroups + namespaces (Docker, Podman, LXC)Jails desde 1999, mucho antes que Docker
Firewalliptables / nftablesPF (heredado de OpenBSD), ipfw
Documentación oficialCada distro la suyaEl FreeBSD Handbook, único, profundo y mantenido desde 1995
La frase que se oye en el mundo BSD: "Linux is a kernel, FreeBSD is an OS." No es del todo justa con Linux, pero captura una verdad: en FreeBSD el kernel, las utilidades de sistema (ls, ps, vi…), la documentación y el instalador los hace el mismo equipo y vienen juntos. En Linux son piezas separadas que cada distro ensambla a su gusto.

0.4 — ¿Qué es ZFS y por qué es tan especial?

ZFS es un filesystem creado por Sun Microsystems para Solaris (2005). Es copy-on-write, integra RAID software, hace checksums de cada bloque para detectar corrupción silenciosa, y permite snapshots instantáneos del filesystem entero. Vocabulario:

  • vdev: una unidad de almacenamiento (un disco, un RAID, un mirror).
  • zpool: una agrupación de vdevs. Es donde se almacenan los datos.
  • dataset: una partición lógica dentro del pool. Se comporta como un filesystem montado, pero crecen y se encogen dinámicamente.
  • snapshot: una foto del dataset en un instante. No ocupa nada hasta que algo cambia.
  • clone: un snapshot convertido en dataset escribible.

FreeBSD adoptó ZFS pronto, y desde entonces es el filesystem recomendado para todo lo que no sea estrictamente embebido.

0.5 — ¿Qué son las jails?

Las jails son contenedores. Aíslan procesos en su propia "jaula" con su filesystem, su red, su hostname y sus usuarios, pero comparten el kernel del anfitrión. Es el mismo concepto que LXC en Linux o que los chroots de Solaris (zones), pero FreeBSD las tiene desde 1999, mucho antes de que la palabra "contenedor" estuviera de moda. Para gestionarlas hay varias herramientas; vamos a usar bastille, que es la más cómoda.

Resume con tus palabras la diferencia entre Linux y FreeBSD. ¿Qué te parece más limpio del modelo BSD?

Parte 1 — Preparar la VM en VirtualBox (30 min)

1.1 — Descargar la ISO

Vete a https://www.freebsd.org/where/. Descarga la amd64 → disc1.iso de la última versión 14.x estable (~1 GB). No descargues la dvd1.iso (4 GB): trae paquetes extra que no necesitamos. Guarda el ISO en D:\ISOs\.

1.2 — Crear la VM

ParámetroValor
NombreFreeBSD-14-Lab
TipoBSD
VersiónFreeBSD (64-bit)
RAM2048 MB
CPUs2 vCPU
Disco principal20 GB VDI dinámico (para ZFS root)

1.3 — Añadir un segundo disco (para el zpool de prácticas)

Antes de arrancar, en Configuración → Almacenamiento, añade otro disco virtual SATA de 8 GB. Lo usaremos en la Parte 4 para crear un zpool aparte y trastear con datasets sin tocar el root.

1.4 — Otros ajustes

  • Sistema → Habilitar EFI (FreeBSD 14 se instala mejor en UEFI).
  • Red → Adaptador 1: Adaptador puente (Bridged). Tipo Intel PRO/1000 MT.
  • Audio: deshabilitar (no nos sirve aquí y FreeBSD a veces se queja).

Parte 2 — Instalar FreeBSD (45 min)

2.1 — Arrancar el instalador

Arranca la VM con la ISO. Verás el logo rojo de Beastie (el demonio mascota de BSD) y un menú. Espera a que entre solo o pulsa Enter.

2.2 — bsdinstall

  1. Pantalla "Welcome": elige Install.
  2. Keymap: Spanish (accent keys).
  3. Hostname: freebsd-lab.
  4. Distribution Select: marca lib32 y ports con espacio. Deja kernel-dbg y src desmarcados (ahorras GB).
  5. Partitioning: Auto (ZFS).
  6. ZFS Configuration: deja "stripe" (estamos en una VM con un solo disco). Selecciona el disco ada0 (20 GB). Importante: NO marques el ada1 de 8 GB todavía, ese lo dejamos virgen.
  7. Confirma el aviso de borrado del disco (es virtual, no pasa nada).
  8. Espera a que copie los archivos (5-10 min).
  9. Contraseña de root: pónla y apúntala.
  10. Network configuration: selecciona la interfaz que aparezca (em0 o vtnet0). IPv4: Yes. DHCP: Yes. IPv6: No.
  11. DNS: deja lo que ofrezca el DHCP.
  12. Time Zone: Europe → Spain → mainland.
  13. Date/Time: confirma.
  14. Services: marca sshd y ntpd, deja el resto desmarcado.
  15. System Hardening: marca hide_uids, hide_gids, hide_jail, random_pid. No es obligatorio pero es buena costumbre.
  16. Users: añade un usuario. Nombre alumno, grupo principal por defecto (el del usuario), invite to other groups: wheel (sin esto no podrás luego usar su). Shell sh está bien.
  17. Final Configuration: Exit. No abras shell para manual modification.
  18. Reboot.
Al reiniciar: antes de que arranque, ve a Almacenamiento en VirtualBox y desconecta la ISO. Si no, volverá a arrancar el instalador.

Parte 3 — Primeros pasos en FreeBSD (45 min)

3.1 — Login y mirada al sistema

Login como alumno. Ejecuta:

uname -a            # versión del kernel
freebsd-version -k  # solo la del kernel
ls /                # mira la jerarquía: bin, boot, etc, usr, var, ...
ls /etc/rc.d        # los scripts de arranque
df -h               # filesystems montados, fíjate en zroot/*
zpool status        # estado del pool ZFS
zfs list            # datasets dentro del pool

Compara mentalmente: tienes un único pool zroot con muchos datasets (uno por /var, /tmp, /usr/home…). Esto es típico de FreeBSD con ZFS.

3.2 — sudo no, su sí (o instala sudo)

FreeBSD no trae sudo por defecto. Para ser root usas su (de ahí la importancia de meter al usuario en wheel):

su -
# te pide la contraseña de root

Si quieres sudo al estilo Linux, lo instalas con el gestor de paquetes (siguiente paso).

3.3 — pkg, el gestor de paquetes binarios

La primera vez que uses pkg te pedirá bootstrappear el cliente:

pkg
# escribe Y, se descarga el gestor

pkg update
pkg search htop
pkg install -y htop nano sudo bastille

Es el equivalente de apt. Los paquetes están precompilados en los servidores de FreeBSD y se actualizan dos veces por semana.

3.4 — sysrc y rc.conf

En FreeBSD, los servicios persistentes se activan editando /etc/rc.conf y reiniciando el servicio. La forma cómoda es con sysrc:

sysrc sshd_enable=YES     # ya estaba, solo a modo de ejemplo
service sshd status
service sshd restart

Mira cat /etc/rc.conf para ver tu configuración actual. Apunta: en Linux equivalente serían los systemctl enable. Aquí todo en un solo archivo de texto plano.

3.5 — Actualizar el sistema base

freebsd-update fetch
freebsd-update install
# parches de seguridad del propio sistema base, no de paquetes
pkg upgrade
# actualización de paquetes

¿Qué te parece tener un único archivo (rc.conf) que define la configuración del sistema, frente al modelo de systemd con cientos de unit files? Pros y contras.

Parte 4 — ZFS hands-on (60 min)

4.1 — Crear un pool en el disco extra

Como root:

zpool list
zpool create tank /dev/ada1
zpool status
zpool list
df -h | grep tank

Acabas de crear un pool ZFS llamado tank sobre tu segundo disco. Ya está montado en /tank.

4.2 — Datasets

zfs create tank/datos
zfs create tank/proyectos
zfs create tank/proyectos/web
zfs list
df -h | grep tank

Cada dataset es como una partición separada, pero su tamaño crece dinámicamente y se comparte del pool. No hay que pre-asignar tamaños.

4.3 — Snapshots y copy-on-write

echo "version A" > /tank/datos/archivo.txt
cat /tank/datos/archivo.txt

zfs snapshot tank/datos@v1
zfs list -t snapshot

echo "version B" > /tank/datos/archivo.txt
cat /tank/datos/archivo.txt    # ves "version B"

# rollback al snapshot
zfs rollback tank/datos@v1
cat /tank/datos/archivo.txt    # vuelves a ver "version A"

4.4 — Cuotas y reservas

zfs set quota=1G tank/proyectos
zfs set reservation=200M tank/proyectos
zfs get quota,reservation tank/proyectos

4.5 — Compresión transparente

zfs set compression=lz4 tank/datos
# crea un archivo grande de texto repetitivo
yes "FreeBSD rocks" | head -n 100000 > /tank/datos/grande.txt
zfs get compressratio tank/datos

Verás una compressratio > 1.00, lo que indica que ZFS comprime los datos al vuelo sin que tú hagas nada.

Apunta el resultado de zfs get compressratio tank/datos y el tamaño del archivo según ls -lh y según du -h. Explica la diferencia.

Parte 5 — Jails con bastille (60 min)

5.1 — Configurar bastille

Como root:

sysrc bastille_enable=YES
sysrc cloned_interfaces+="lo1"
sysrc ifconfig_lo1="inet 10.17.89.1/24"
service netif cloneup

# Detecta tu versión exacta de FreeBSD automáticamente:
RELEASE=$(freebsd-version -r | cut -d'-' -f1-2)
echo "Tu release es: $RELEASE"
bastille bootstrap $RELEASE update

(El bootstrap descarga la base del sistema para tu versión exacta de FreeBSD. La variable $RELEASE evita errores si tu FreeBSD es 14.1, 14.2 o cualquier punto menor.)

Si el bootstrap se cuelga descargando, comprueba ping pkg.freebsd.org. Si responde, espera: la primera descarga puede tardar 5-10 minutos. El servidor a veces va lento.

5.2 — Crear la primera jail

bastille create web $RELEASE 10.17.89.10
bastille list
bastille console web

Estás dentro de la jail. Es un FreeBSD entero con su propio /etc, sus procesos, su red. exit para volver al host.

5.3 — Instalar un servicio dentro

bastille pkg web install -y nginx
bastille service web nginx enable
bastille service web nginx start

Y desde el host:

fetch -qo - http://10.17.89.10/ | head

Debes ver la página de bienvenida de Nginx. Tu jail está sirviendo HTTP.

5.4 — Snapshot de la jail opcional

Como las jails viven en datasets ZFS, puedes snapshotear su estado entero:

zfs list | grep web
zfs snapshot zroot/bastille/jails/web@antes-de-cambios

Parte 6 — Diagnóstico (30 min)

ProblemaDiagnóstico / solución
La VM no arranca tras instalar (pantalla negra de EFI).
pkg update da "SSL certificate problem".
La jail no tiene red (ping falla).
su - dice "you don't belong to the wheel group".
El disco /dev/ada1 no aparece al crear el pool.
Pistas:
  1. Comprueba que VirtualBox arranca en EFI (no BIOS). En Configuración → Sistema → Habilitar EFI.
  2. Ajusta la fecha del sistema con date: los certificados pueden parecer caducados si la VM tiene la fecha mal.
  3. Revisa que cloned_interfaces en rc.conf incluya lo1 y que service netif cloneup se haya ejecutado.
  4. Añade el usuario al grupo: pw groupmod wheel -m alumno y vuelve a iniciar sesión.
  5. Confirma que en VirtualBox añadiste el segundo disco. Mira con geom disk list.

Ficha técnica

Datos del sistema

Jails

Reto opcional

Configura el firewall PF en el host para permitir solo SSH desde tu red y filtrar el resto. PF se configura en /etc/pf.conf y se activa con sysrc pf_enable=YES && service pf start. Este es el firewall que da fama a OpenBSD/FreeBSD por su elegancia de sintaxis.

Autoevaluación

Marca lo conseguido

HitoHecho
VM creada con disco secundario y EFI activo
FreeBSD 14 instalado con ZFS root
Usuario en wheel, su funciona
pkg actualizado, htop/nano/sudo/bastille instalados
Pool tank creado en /dev/ada1
Datasets, snapshot y rollback probados
Compresión LZ4 activa con ratio > 1
Jail web creada con bastille
Nginx respondiendo desde dentro de la jail
Ficha técnica completa
Reto: PF configurado

Cierra la sesión: si tuvieses que recomendar FreeBSD para un proyecto, ¿para cuál? ¿Y por qué seguirías eligiendo Linux para casi todo lo demás?