Estado actual del sistema
zpool status zpool list zpool list -t all
Identificar discos
geom disk list camcomtrol devlist
Anotar el disco actual (ada0) y el nuevo disco USB (da0)
Limpiar el disco nuevo completamente
gpart destroy -F da0 dd -if=/dev/zero of=/dev/da0 bs=1M count=100
Crear tabla de particiones GPT
gpart create -s gpt da0
Partición de arranque EFI (si el sistema usa UEFI)
gpart add -t efi -s 260M -l efiboot-new da0
Partición de arranque BIOS/GPT (para compatibilidad legacy)
gpart add -t freebsd-boot -s 512k -l gptboot-new da0
Partición swap
gpart add -t freebsd-swap -s 8G -a 1M -l swap0 da0
Particion ZFS (el resto del disco)
gpart add -t freebsd-zfs -a 1M -l zroot-new da0
Para sistemas UEFI
Montar partición EFI del disco nuevo
newfs_msdos -F 32 -c 1 /dev/da0p1 mount -t msdosfs /dev/da0p1 /mnt
Copiar EFI loader desde el actual disco
mkdir -p /mnt/EFI/BOOT cp -r /boot/efi/EFI/BOOT /mnt/EFI/ umount /mnt
Crear pool temporal en el nuevo disco
Crear pool temporal con nombre diferente para evitar conflictos
zpool create -o altroot=/mnt \
-o ashift=12 \
-O compression=lz4 \
-O atime=off \
-O xattr=sa \
-O acltype=posix \
-m none \
zroot-new /dev/da0p3
Verificar
zpool status zroot-new
Listar todos los datasets a migrar
zfs list -H -o name -t filesystem,volume
Tomar snapshot recursivo de todo el pool (Shell zsh)
sudo zfs snapshot -r zroot@migracion
Verificar snapshot creado
zfs list -t snapshot -o name | grep "$migracion" zroot@migracion zroot/ROOT@migracion zroot/ROOT/14.3-RELEASE-filebrowser-tailscale-serve-certs-https@migracion zroot/ROOT/14.3-RELEASE_2026-02-14_193200@migracion zroot/ROOT/default@2026-02-14-19:32:00-0 zroot/ROOT/default@2026-02-17-17:48:09-0 zroot/ROOT/default@migracion zroot/home@migracion zroot/home/carlos@migracion zroot/tmp@migracion zroot/usr@migracion zroot/usr/ports@migracion zroot/usr/src@migracion zroot/var@migracion zroot/var/audit@migracion zroot/var/crash@migracion zroot/var/log@migracion zroot/var/mail@migracion zroot/var/tmp@migracion
Enviar snapshot raíz primero
zfs send -Lec zroot@migration-$(date +%Y%m%d) | \
zfs receive -Fuv zroot-new
Enviar recursivamente todos los datasets hijos
zfs send -RLec zroot@migration-$(date +%Y%m%d) | \
zfs receive -Fuv zroot-new
Banderas (flags)
-R Recursivo (todos los datasets hijos) -L Incluye large blocks -e Embed data (bloques pequeños inline) -c Comprime el stream -F En receive: fuerza rollback si es necesario -u No monta los datasets al recibirlos -v Verbose
Comprobar la replicación
Comparar conjuntos de datos entre pools
zfs list -r zroot zfs list -r zroot-new
Verificar propiedades
zfs get all zroot zfs get all zroot-new
Cantidad de instantáneas
zfs list -t snapshot -r zroot | wc -l zfs list -t snapshot -r zroot-new | wc -l
Configurar bootfs en el nuevo pool
zpool set bootfs=zroot-new/ROOT/default zroot-new
Verificar
zpool get bootfs zroot-new
Ajustar cachefile y otros parámetros del pool
zpool set cachefile=/boot/zfs/zpool.cache zroot-new
Ver propiedades del pool original para replicarlas
zpool get all zroot
Montar el dataset raíz del nuevo disco
zfs set mountpoint=/mnt zroot-new/ROOT/default zfs mount zroot-new/ROOT/default
Verificar /boot/loader.conf
cat /mnt/boot/loader.conf
Debe contener algo como:
zfs_load="YES" vfs.root.mountfrom="zfs:zroot/ROOT/default"
Si el nombre del pool cambió, actualizar:
sed -i '' 's/zroot-new/zroot/g' /mnt/boot/loader.conf
También verificar /etc/fstab (en ZFS puro suele estar sin referencias a ada0)
cat /mnt/etc/fstab
Cambiar el disco y primer arranque
Apagar el sistema
shutdown -p now
Desconectar el disco viejo Conectar el nuevo disco en el slot interno (ya no como USB) Comprobar en BIOS/UEFI que el nuevo disco sea el primero en el orden de arranque Arrancar
Verificación después del arranque
Comprobar salud del pool
zpool status zpool list
Verificar que todos los datasets montaron
zfs list -t filesystem
Verificar espacio disponible (debe reflejar el disco nuevo mayor)
df -h
Verificar que el sistema arrancó desde el disco correcto
geom disk list camcontrol devlist
Limpiar snapshots de migración
zfs destroy -r zroot@migracion
Problemas y posibles soluciones después del primer arranque
Renombrar zpool zroot-new a zroot
zpool import -f zroot-new zroot
Error
zpool export zroot-new Cannot unmount /
Es el error clásico: el dataset raíz (/) está montado desde zroot-new, así que ZFS no puede desmontarlo en caliente
Solución Desde loader prompt o LiveCD
Desde el LiveCD
zpool import -f zroot-new zroot zpool set bootfs=zroot/ROOT/default zroot zpool export zroot zpool import -f zroot-new zroot zpool set bootfs=zroot/ROOT/default zroot zpool export zroot hecho.
Reiniciar
shutdown -r now
FreeBSD al arrancar y no encontrar zroot buscará pools disponibles. Si el disco nuevo ya está interno, lo encontrará como zroot-new y podrás importarlo con el nombre correcto.
Después de reiniciar sin el LiveCD el sistema arranca desde el nuevo disco duro.
Estos dos errores son normales y esperables en este proceso.
1. swapon: /dev/da0p3: No such file or directory, 2. Import of zpool cache /etc/zfs/zpool.cache failed
El archivo /etc/fstab del sistema nuevo todavía referencia el dispositivo del disco USB (da0) que ya no existe. Ahora el disco está interno, probablemente como ada0 o nvme0ns1.
Montar el sistema de ficheros rw
mount -u -o rw /
Averiguar cómo se llama el disco ahora geom disk list o camcontrol devlist.
geom disk list Geom name: ada0 Providers: 1. Name: ada0 Mediasize: 250059350016 (233G) Sectorsize: 512 Mode: r3w3e7 descr: WDC WDS250G2B0A-00SM50 lunid: 5001b448b8a2a91f ident: 192686806761 rotationrate: 0 fwsectors: 63 fwheads: 16
Cambiar la línea de swap, por ejemplo
/dev/da0p3 none swap sw 0 0 por /dev/ada0p3 none swap sw 0 0
Mejor aún, usar la etiqueta (label) GPT que es independiente del nombre del dispositivo
gpart show -l ada0
=> 40 488397088 ada0 GPT (233G)
40 532480 1 efiboot0 (260M)
532520 1024 2 gptboot0 (512K)
533544 984 - free - (492K)
534528 16777216 3 swap0 (8.0G)
17311744 471085056 4 zroot-new (225G)
488396800 328 - free - (164K)
ls /dev/gpt/ efiboot0 gptboot0 swap0
En el archivo /etc/fstab usar la etiqueta en lugar del dispositivo
... /dev/gpt/swap0 none swap sw 0 0 ...
Error 2
Import of zpool cache /etc/zfs/zpool.cache failed
El zpool.cache fue generado cuando el pool se llamaba zroot-new y estaba en da0. Ahora el pool se llama zroot y el dispositivo cambió. El caché está obsoleto.
Sencillamente borrarlo, ZFS lo regenera automáticamente
rm /etc/zfs/zpool.cache
Antes de reiniciar para verificar el nombre correcto del dispositivo
swapinfo -h Device Size Used Avail Capacity /dev/gpt/swap0 8.0G 0B 8.0G 0%
Si el sistema arrancó pero con errores no críticos Ambos errores no impiden el funcionamiento del sistema. El swap simplemente no está activo hasta que corrijas el fstab, y el zpool.cache se regenera solo. Si llegaste al prompt de login, la migración fue exitosa.
Reiniciar
shutdown -r now
Error 3.
Can't open /dev/gpt/efiboot0
Ese error indica que el bootloader está buscando la partición EFI por su label GPT (efiboot0) pero no la encuentra, probablemente porque el label en el disco nuevo es diferente o no se asignó correctamente
ls /dev/gpt efiboot0 gptboot0 swap0
Montar el sistema de ficheros rw
mount -u -o rw /
Solución. Renombrar el label al esperado
... /dev/gpt/efiboot0 /boot/efi msdosfs rw 2 2 ...
Corregir el label
gpart modify -i 1 -l efiboot0 ada0
Si la partición EFI estaba vacía, reinstalar loader
newfs_msdos -F 32 -c 1 /dev/ada0p1 mount -t msdosfs /dev/ada0p1 /mnt mkdir -p /mnt/EFI/BOOT cp /boot/loader.efi /mnt/EFI/BOOT/BOOTX64.EFI umount /mnt
FreeBSD es genial!.


