Sustitución de un disco averiado en la raíz de ZFS
Esta guía explica cómo reemplazar un disco averiado en un pool ZFS en espejo (mirror) en Linux. El procedimiento incluye poner el disco fuera de línea, copiar la tabla de particiones al disco de reemplazo, volver a añadir el disco al pool e instalar el cargador de arranque una vez completado el resilvering.
Requisitos previos
Se requieren privilegios de root. Los ejemplos siguientes suponen un servidor con dos discos: /dev/sda (funcionando) y /dev/sdb (averiado). Adapte los nombres de los dispositivos a su configuración.
Realice una copia de seguridad de todos los datos importantes antes de continuar. Reemplazar un disco raíz es una operación de alto riesgo. Un error en cualquiera de los pasos puede provocar la pérdida de datos o que el sistema no pueda arrancar. Evite utilizar nombres de dispositivo como /dev/sdX en los comandos de ZFS. Los nombres de los dispositivos pueden cambiar después de un reinicio. Utilice identificadores estables como /dev/disk/by-id/. En los ejemplos siguientes se utiliza /dev/sdX por simplicidad al trabajar con herramientas de particionado. Los comandos de ZFS deben utilizar siempre /dev/disk/by-id/.
Paso 1: Comprobar el estado del pool
Antes de realizar cualquier cambio, compruebe el estado actual del pool:
zpool status -v
La salida mostrará qué disco presenta errores y su identificador dentro del pool.
Paso 2: Poner el disco averiado fuera de línea
Si el disco aparece como ONLINE pero presenta fallos, póngalo fuera de línea antes de realizar el reemplazo físico:
zpool offline rpool <failed-device>
ZFS dejará de intentar utilizar el disco defectuoso antes de realizar el reemplazo físico. Sustituya <failed-device> por el identificador mostrado por zpool status -v. Si el disco ya aparece como FAULTED o REMOVED, omita este paso y continúe directamente con el paso 3.
Paso 3: Reemplazar físicamente el disco
Si su servidor admite hot swap, puede reemplazar el disco sin apagarlo.
De lo contrario, apague el sistema:
poweroff
Después de instalar el disco de reemplazo, arranque el servidor y compruebe que el nuevo disco sea visible:
lsblk -o NAME,SIZE,MODEL ls -l /dev/disk/by-id/
Utilice el identificador by-id del nuevo disco en los pasos siguientes.
Paso 4: Determinar el tipo de tabla de particiones
Instale gdisk si todavía no está instalado:
apt install gdisk -y
Compruebe el tipo de tabla de particiones del disco que funciona:
gdisk -l /dev/sda
En la salida, busque la sección Partition table scan. Para MBR aparecerán MBR: MBR only y GPT: not present. Para GPT aparecerán MBR: protective y GPT: present.
Paso 5: Preparar y copiar la tabla de particiones al nuevo disco
La mayoría de las configuraciones raíz de ZFS utilizan particionado GPT. El método MBR se incluye para sistemas antiguos.
GPT
Antes de continuar, identifique el nombre /dev/sdX correspondiente al nuevo disco, ya que las herramientas de particionado lo requieren:
lsblk -o NAME,SIZE,MODEL,SERIAL
Elimine todas las firmas antiguas del disco de reemplazo antes de copiar la tabla de particiones:
wipefs -a /dev/disk/by-id/<new-disk>
wipefs -a elimina permanentemente todas las firmas de sistemas de archivos y particiones del disco. Asegúrese de especificar el identificador correcto del disco antes de ejecutar este comando.
El siguiente comando copia la tabla de particiones de /dev/sda (origen) a /dev/sdb (destino):
sgdisk -R /dev/sdb /dev/sda
En sgdisk -R, el primer argumento es el disco de destino y el segundo es el origen. Ejecutar este comando con los argumentos invertidos sobrescribirá la tabla de particiones del disco que funciona.
Si el disco de reemplazo es más grande que el original, amplíe la GPT para utilizar todo el disco:
sgdisk -e /dev/sdb
A continuación, asigne un nuevo UUID único al disco de reemplazo:
sgdisk -G /dev/sdb
sgdisk -G asigna nuevos UUID a todas las particiones del disco de reemplazo. Si /etc/fstab contiene entradas basadas en UUID para alguna de estas particiones, el sistema podría no arrancar. Una vez completado el resilvering, compruebe que /etc/fstab utilice identificadores /dev/disk/by-id/ en lugar de UUID.
Recargue la tabla de particiones para que el kernel detecte el nuevo diseño:
udevadm trigger udevadm settle
Si el disco de reemplazo se utilizó anteriormente en otro pool ZFS, elimine los metadatos ZFS antiguos para evitar conflictos:
zpool labelclear /dev/disk/by-id/<new-disk-partX> 2>/dev/null || true
Sustituya <new-disk-partX> por el identificador real de la partición ZFS.
MBR
El siguiente comando copia la tabla de particiones de /dev/sda (origen) a /dev/sdb (destino):
sfdisk -d /dev/sda | sfdisk /dev/sdb
Si las nuevas particiones no aparecen en el sistema después de copiarlas, vuelva a cargar la tabla de particiones:
udevadm trigger udevadm settle
Paso 6: Añadir el disco al pool
Reemplace la entrada del disco averiado en el pool por el nuevo disco. Primero, compruebe el identificador exacto del disco averiado tal como aparece en el pool:
zpool status rpool
En la salida, busque la entrada correspondiente al disco averiado dentro de la lista de dispositivos del pool. Aparecerá como una ruta completa, por ejemplo /dev/disk/by-id/ata-WDC_WD10_12345-part3, con un estado FAULTED, UNAVAIL u OFFLINE. Utilice esa ruta como <old-device> en el comando replace:
zpool replace rpool <old-device> /dev/disk/by-id/<new-disk-part>
Sustituya <old-device> por el identificador del disco averiado del paso anterior. Sustituya <new-disk-part> por el identificador by-id de la partición del disco de reemplazo, utilizando el mismo número de partición que en el disco que funciona, por ejemplo -part3 o -part4. Para encontrar el identificador correcto, ejecute ls -l /dev/disk/by-id/.
Si el disco antiguo no está disponible por completo (UNAVAIL) y zpool replace devuelve un error, añada la opción -f para forzar el reemplazo:
zpool replace -f rpool <old-device> /dev/disk/by-id/<new-disk-part>
Después de ejecutar zpool replace, confirme que el resilvering haya comenzado y que el nuevo disco aparezca como ONLINE:
zpool status
El resilvering continuará automáticamente en segundo plano.
Paso 7: Supervisar el resilvering
Controle el progreso del resilvering con:
zpool status -v
La salida muestra el progreso, la velocidad y el tiempo restante estimado. Espere hasta que el estado muestre state: ONLINE y el resilvering haya finalizado antes de continuar. Dependiendo del tamaño del disco, esto puede tardar varias horas.
Paso 8: Verificar el dataset de arranque
Antes de instalar el cargador de arranque, compruebe que el pool tenga configurado el dataset de arranque correcto:
zpool get bootfs rpool
La salida debería mostrar una ruta de dataset como rpool/ROOT/debian. Si el valor es none o apunta al dataset incorrecto, configúrelo manualmente:
zpool set bootfs=rpool/ROOT/debian rpool
Sustituya rpool/ROOT/debian por el nombre real del dataset raíz de su sistema. Para listar los datasets disponibles, ejecute zfs list.
Paso 9: Instalar el cargador de arranque
Instale el cargador de arranque en el disco de reemplazo después de completar el resilvering. Durante el resilvering, el sistema continúa ejecutándose desde el disco original, por lo que este paso puede realizarse de forma segura una vez que el pool esté en buen estado.
BIOS (Legacy)
grub-install /dev/disk/by-id/<new-whole-disk>
En algunos sistemas, grub-install puede no aceptar una ruta by-id. En ese caso, sustituya /dev/disk/by-id/<new-whole-disk> por el nombre de dispositivo correspondiente, por ejemplo /dev/sdb.
UEFI
Monte la partición EFI del disco de reemplazo en un directorio temporal antes de ejecutar grub-install. Esto evita ocultar la partición EFI actualmente activa:
mkdir -p /mnt/new_efi mount /dev/disk/by-id/<new-disk-part1> /mnt/new_efi
Sustituya <new-disk-part1> por el identificador real de la partición EFI (normalmente -part1 o -part2; tipo de partición EF00). Si no está seguro, compruebe con ls -l /dev/disk/by-id/.
Si la partición EFI está vacía, copie el contenido de la partición EFI existente antes de ejecutar grub-install:
cp -r /boot/efi/* /mnt/new_efi/
Instale el cargador de arranque:
apt install grub-efi-amd64 efibootmgr -y grub-install --target=x86_64-efi --efi-directory=/mnt/new_efi --bootloader-id=debian --recheck /dev/disk/by-id/<new-whole-disk> update-grub update-initramfs -u -k all
Sustituya --bootloader-id=debian por el nombre correspondiente a su distribución, por ejemplo ubuntu o debian. Sustituya /dev/disk/by-id/<new-whole-disk> por el identificador by-id del disco de reemplazo completo, no de una partición.
La ejecución de update-initramfs garantiza que el disco RAM inicial incluya los módulos ZFS actuales y reconozca el nuevo diseño del pool. Sin este paso, el sistema podría no arrancar después del reemplazo.
Desmonte la partición EFI después de la instalación:
umount /mnt/new_efi
Verifique las entradas de arranque EFI:
efibootmgr -v
En sistemas con una raíz ZFS, grub-install puede fallar o requerir opciones adicionales dependiendo de la versión de GRUB y de la configuración del sistema. Por ejemplo, algunos sistemas requieren instalar GRUB con módulos de compatibilidad con ZFS o ejecutar el comando desde un entorno chroot. Si el comando devuelve un error, consulte la documentación de su distribución para obtener instrucciones específicas sobre la instalación de GRUB con ZFS.
En Proxmox VE, grub-install está deshabilitado. Utilice proxmox-boot-tool en su lugar. El ejemplo siguiente utiliza /dev/sdb2; sustitúyalo por la partición EFI real de su sistema:
proxmox-boot-tool format /dev/sdb2 proxmox-boot-tool init /dev/sdb2
Conclusión
Después de instalar el cargador de arranque, reinicie el servidor y compruebe que arranque normalmente. Ejecute un scrub para comprobar si se produjeron errores de lectura/escritura durante el resilvering:
zpool scrub rpool
A continuación, compruebe el estado del pool:
zpool status -v
El pool debería estar online y sin errores. Si aparece algún problema durante el proceso, consulte los registros del sistema con journalctl -xe para obtener información adicional.
Antes de desechar el disco averiado que se retiró en el paso 3, reinicie el servidor y compruebe que el sistema arranque normalmente con el disco de reemplazo. Conserve el disco averiado como respaldo hasta confirmar que el sistema arranca correctamente.