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
bsdinstally el filesystem raíz sobre ZFS. - Configurar el sistema desde
/etc/rc.confusandosysrc, 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
bastillee 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
| BSD | Filosofía | Dónde la verás |
|---|---|---|
| FreeBSD | General-purpose, performance, ZFS de serie | Netflix CDN, WhatsApp en su día, NAS (TrueNAS), PlayStation |
| OpenBSD | Seguridad por defecto, código auditado, "secure out of the box" | Routers, firewalls (PF nació aquí), servidores que no se deben tocar nunca |
| NetBSD | Portabilidad extrema (más de 50 arquitecturas) | Equipos raros, embebidos, mainframes IBM |
| DragonFly BSD | Fork de FreeBSD 4 con SMP propio (HAMMER FS) | Muy nicho, casi solo entusiastas |
0.3 — Diferencias clave con Linux
| Linux | FreeBSD | |
|---|---|---|
| Modelo de desarrollo | Kernel separado; cada distro junta el kernel con su userland | Kernel + userland desarrollados juntos como un único sistema (base system) |
| Licencia | GPL (copyleft, obliga a publicar cambios) | BSD (permite cerrar el código, p.ej. la usan Apple, Sony) |
| Init | systemd (mayoritario), OpenRC, sysvinit, runit… | rc.d scripts (estilo BSD), siempre el mismo |
| Paquetes | apt / dnf / pacman / apk / zypper (uno por distro) | pkg (binarios) + ports (fuente). Unificado. |
| Filesystem por defecto | ext4 / btrfs / xfs / zfs (depende de distro) | ZFS o UFS2. ZFS recomendado. |
| Contenedores | cgroups + namespaces (Docker, Podman, LXC) | Jails desde 1999, mucho antes que Docker |
| Firewall | iptables / nftables | PF (heredado de OpenBSD), ipfw |
| Documentación oficial | Cada distro la suya | El FreeBSD Handbook, único, profundo y mantenido desde 1995 |
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ámetro | Valor |
|---|---|
| Nombre | FreeBSD-14-Lab |
| Tipo | BSD |
| Versión | FreeBSD (64-bit) |
| RAM | 2048 MB |
| CPUs | 2 vCPU |
| Disco principal | 20 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
- Pantalla "Welcome": elige Install.
- Keymap: Spanish (accent keys).
- Hostname:
freebsd-lab. - Distribution Select: marca lib32 y ports con espacio. Deja kernel-dbg y src desmarcados (ahorras GB).
- Partitioning: Auto (ZFS).
- ZFS Configuration: deja "stripe" (estamos en una VM con un solo disco). Selecciona el disco
ada0(20 GB). Importante: NO marques elada1de 8 GB todavía, ese lo dejamos virgen. - Confirma el aviso de borrado del disco (es virtual, no pasa nada).
- Espera a que copie los archivos (5-10 min).
- Contraseña de root: pónla y apúntala.
- Network configuration: selecciona la interfaz que aparezca (
em0ovtnet0). IPv4: Yes. DHCP: Yes. IPv6: No. - DNS: deja lo que ofrezca el DHCP.
- Time Zone: Europe → Spain → mainland.
- Date/Time: confirma.
- Services: marca
sshdyntpd, deja el resto desmarcado. - System Hardening: marca
hide_uids,hide_gids,hide_jail,random_pid. No es obligatorio pero es buena costumbre. - 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 usarsu). Shellshestá bien. - Final Configuration: Exit. No abras shell para manual modification.
- Reboot.
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.)
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)
| Problema | Diagnó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. |
- Comprueba que VirtualBox arranca en EFI (no BIOS). En Configuración → Sistema → Habilitar EFI.
- Ajusta la fecha del sistema con
date: los certificados pueden parecer caducados si la VM tiene la fecha mal. - Revisa que
cloned_interfacesenrc.confincluyalo1y queservice netif cloneupse haya ejecutado. - Añade el usuario al grupo:
pw groupmod wheel -m alumnoy vuelve a iniciar sesión. - Confirma que en VirtualBox añadiste el segundo disco. Mira con
geom disk list.
Ficha técnica
Datos del sistema
Jails
Reto opcional
/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
| Hito | Hecho |
|---|---|
| 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?