Problema

En entornos de virtualización con Proxmox, es frecuente usar ZFS en modo mirror para el disco del sistema. Cada disco contiene tres particiones típicas: BIOS BOOT, EFI System Partition (ESP) y la partición ZFS. Cuando una de las unidades falla y se sustituye, el proceso de clonar particiones y resilver el pool puede dejar el sistema sin un gestor de arranque funcional. El síntoma clásico es el mensaje de la BIOS “Error 1962: No operating system found” o la ausencia del nuevo disco en la lista de dispositivos de arranque, aunque el pool ZFS sigue saludable.

Este escenario no es exclusivo de un caso concreto; cualquier administrador que gestione un boot pool ZFS con EFI y realice sustituciones de hardware puede encontrarse con la misma pérdida de la entrada de arranque.

Causa

  1. ESP no registrada en la tabla de arranque UEFI
    Copiar la partición EFI con dd replica los datos, pero no actualiza la NVRAM. Si el firmware no reconoce la nueva ESP, el disco no aparece como opción de arranque.

  2. Identificadores de partición (GUID) diferentes
    ZFS usa los GUID de los dispositivos para mapear la raíz del pool. Al crear una nueva unidad, los GUID cambian; si el bootfs del pool sigue apuntando al antiguo GUID, el gestor de arranque no encuentra el dataset raíz.

  3. Bootloader no instalado en la nueva ESP
    Proxmox usa systemd-boot (o grub en configuraciones legacy). Simplemente clonar la partición no garantiza que los archivos de arranque estén presentes o que el loader.conf apunte al pool correcto.

  4. proxmox-boot-tool no ejecutado contra la nueva partición
    La herramienta prepara la ESP, escribe la firma de arranque y actualiza la variable bootctl. Omitir este paso deja el disco “vacío” a los ojos del firmware.

  5. Resilver incompleto o pool en estado degraded
    Si el pool sigue degradado, el sistema puede arrancar, pero la redundancia está comprometida y ZFS puede rechazar montar el dataset de arranque por consistencia.

Solución

La reparación se basa en tres pilares: re‑crear la ESP, actualizar la variable de arranque UEFI y forzar que ZFS apunte al nuevo disco. A continuación se describe un flujo que funciona tanto para discos recién creados como para unidades clonadas.

1. Preparar la nueva unidad

  1. Crear particiones idénticas
    Usa sgdisk para replicar la tabla de particiones del disco sano.

    sgdisk -R=/dev/sda /dev/sdb   # copia tabla de sdb (bueno) a sda (nuevo)
    sgdisk -G /dev/sda            # genera nuevos GUIDs
    
  2. Formatear la ESP

    mkfs.fat -F32 /dev/sda2
    
  3. Montar la ESP y copiar los archivos de arranque

    mount /dev/sda2 /mnt/esp
    cp -a /boot/efi/* /mnt/esp/
    umount /mnt/esp
    

2. Ejecutar proxmox-boot-tool

Esta herramienta escribe la firma de arranque y registra la ESP en la NVRAM.

proxmox-boot-tool init /dev/sda2
proxmox-boot-tool refresh

Si el pool usa systemd-boot, el comando anterior crea loader/entries apuntando al dataset rpool/ROOT/.... En caso de grub, la herramienta también instala los módulos necesarios.

3. Ajustar el bootfs de ZFS

Verifica el GUID actual del nuevo disco y actualiza la propiedad bootfs del pool:

zpool status -v
zpool set bootfs=rpool/ROOT/default rpool

Si el pool sigue señalando al GUID antiguo, reemplázalo con:

zpool export rpool
zpool import -d /dev/disk/by-id rpool

El flag -d permite que ZFS descubra los dispositivos por su ID, evitando conflictos de GUID.

4. Resilver y verificación

Una vez que la ESP está lista y el bootfs apunta al nuevo disco, inicia el resilver si aún no se completó:

zpool attach rpool /dev/sdb3 /dev/sda3
zpool status rpool   # espera a que el estado sea ONLINE

5. Actualizar la orden de arranque del firmware

Reinicia y entra al menú UEFI. Debería aparecer una entrada llamada Proxmox o systemd-boot asociada al nuevo disco. Si no, crea manualmente:

bootctl --path=/boot/efi install
bootctl set-default proxmox

6. Test de arranque

Apaga la máquina, desconecta el disco antiguo y verifica que el servidor arranca únicamente con el nuevo disco. Si el arranque falla, repite el paso 2 asegurándote de que la ESP esté montada en /boot/efi antes de ejecutar proxmox-boot-tool.

Cuándo aplicar esta solución

  • Síntomas: Mensaje de BIOS “No operating system found”, la ESP del nuevo disco no aparece en la lista de arranque, o el pool ZFS está degradado tras reemplazo de disco.
  • Entorno: Proxmox VE con ZFS como pool raíz, usando EFI (no BIOS legacy).
  • No aplica: Sistemas que usan GRUB en modo BIOS sin ESP, o configuraciones donde el arranque se gestiona mediante iPXE/Network boot.

Código

# 1. Replicar tabla de particiones y generar nuevos GUID
sgdisk -R=/dev/sda /dev/sdb
sgdisk -G /dev/sda

# 2. Formatear la nueva ESP
mkfs.fat -F32 /dev/sda2

# 3. Copiar contenido de arranque
mount /dev/sda2 /mnt/esp
cp -a /boot/efi/* /mnt/esp/
umount /mnt/esp

# 4. Inicializar la ESP con proxmox-boot-tool
proxmox-boot-tool init /dev/sda2
proxmox-boot-tool refresh

# 5. Asegurar que ZFS apunte al dataset correcto
zpool set bootfs=rpool/ROOT/default rpool

# 6. Resilver (si es necesario)
zpool attach rpool /dev/sdb3 /dev/sda3
zpool status rpool

Verificación

  1. Estado del pool

    zpool status -v
    

    Debe mostrar ONLINE y scan: resilvered sin errores.

  2. Entrada UEFI
    Ejecuta bootctl list dentro de un live shell. La salida debe contener una entrada con loader apuntando a /boot/efi/loader/entries.

  3. Arranque limpio
    Desconecta el disco antiguo, reinicia y verifica que el sistema arranca sin intervención manual. Revisa los logs de dmesg y journalctl -b para confirmar que el pool se importó automáticamente.

  4. Persistencia
    Vuelve a conectar el disco antiguo (si lo deseas) y ejecuta zpool replace rpool /dev/sdb3 /dev/sda3 para que vuelva a formar el mirror. Después de la sincronización, el pool debe estar nuevamente en espejo.

Notas adicionales

  • Backup del ESP: Antes de manipular la partición EFI, crea una copia con dd if=/dev/sdb2 of=esp-backup.img. Facilita la recuperación si algo sale mal.
  • Variables de firmware: En algunos servidores UEFI, la variable BootOrder puede quedar corrupta. Borrar todas las entradas de Boot#### y volver a ejecutar proxmox-boot-tool suele resolver el problema.
  • ZFS cachefile: Asegúrate de que /etc/zfs/zpool.cache esté actualizado. Si el archivo apunta a un GUID inexistente, el arranque fallará. Regenera el cache con zpool set cachefile=/etc/zfs/zpool.cache rpool.
  • Compatibilidad de versiones: La guía asume Proxmox 7.x o superior, donde proxmox-boot-tool está disponible. En versiones anteriores, el proceso implica instalar manualmente systemd-boot o grub en la ESP.
  • Monitoreo: Configura alertas de SMART (smartd) y de ZFS (zpool status) para detectar degradaciones antes de que el disco falle completamente. Un reemplazo proactivo evita la necesidad de reparaciones de arranque bajo presión.