En este artÃculo voy a explicar un caso real de un servidor fÃsico donde el sistema está instalado sobre un mirro ZFS en FreeBSD, mostraré los pasos a seguir en caso de fallo tanto de un disco como de otro y veremos algunas peculiaridades del sistema.
El hardware en concreto es:
HP ProLiant ML310e Gen8 v2
HP Smart Array B120i RAID -> Deshabiliada para que pase directamente los discos al sistema operativo.
Estado inicial
El sistema fué instalado con particiones GPT y sistema BIOS ya que es muy antiguo y no soporta EFI, su estado inicial es el siguiente:
<WDC WDS500G1B0A-00H9H0 X41100WD> at scbus0 target 0 lun 0 (ada0,pass0)
<Samsung SSD 850 EVO 500GB EMT02B6Q> at scbus1 target 0 lun 0 (ada1,pass1)
pool: zroot
state: ONLINE
config:
NAME STATE READ WRITE CKSUM
zroot ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
ada0p3 ONLINE 0 0 0
ada1p3 ONLINE 0 0 0
errors: No known data errors
Simulamos fallo del primer disco
Sacamos el disco ada0:
WDC WDS500G1B0A-00H9H0 X41100WD
Consultamos los discos y veremos que ha desaparecido:
<Samsung SSD 850 EVO 500GB EMT02B6Q> at scbus1 target 0 lun 0 (ada0,pass0)
El estado del pool quedará asÃ:
pool: zroot
state: DEGRADED
status: One or more devices could not be used because the label is missing or
invalid. Sufficient replicas exist for the pool to continue
functioning in a degraded state.
action: Replace the device using 'zpool replace'.
see: https://openzfs.github.io/openzfs-docs/msg/ZFS-8000-4J
scan: resilvered 20.5G in 00:00:52 with 0 errors on Thu May 12 09:40:08 2022
config:
NAME STATE READ WRITE CKSUM
zroot DEGRADED 0 0 0
mirror-0 DEGRADED 0 0 0
ada0p3 FAULTED 0 0 0 corrupted data
ada0p3 ONLINE 0 0 0
errors: No known data errors
Cuando se saca ada0, ada1 pasa a ser ada0, por lo tanto ada0p3 está FAULTED porque ese era el nombre del disco antes de desaparecer y está ONLINE porque es el antiguo ada1p3 remapeado a ada0p3 en este último boot.
Por eso zpool status muestra datos ambiguos como estos:
ada0p3 FAULTED 0 0 0 corrupted data
ada0p3 ONLINE 0 0 0
Lo que debe quedar claro es que el disco que se muestra ONLINE siempre es el que está funcionando correctamente independientemente del resto de información mostrada.
En este caso ada0p3:
ada0p3 ONLINE 0 0 0
Que corresponde al disco Samsung:
<Samsung SSD 850 EVO 500GB EMT02B6Q> at scbus1 target 0 lun 0 (ada0,pass0)
La BIOS de este servidor tiene una peculiaridad y es que siempre arranca desde el primer disco que encuentra conectado, independientemente de si este funciona o no.
Si se quita el disco del slot 1 arrancará desde el disco del slot2.
Si un disco se estropea hay que poner el superviviente en el slot 1 y el disco nuevo en el 2, de este modo arrancará con el bueno y podremos iniciar el proceso de resilvering.
Teniendo en cuenta esto, los pasos a seguir para cambiar el disco son:
-
Asegurarse de que el disco superviviente esté pinchado en el primer slot(importante)
-
Pinchar el de reemplazo en el segundo slot:
<Samsung SSD 850 EVO 500GB EMT02B6Q> at scbus0 target 0 lun 0 (ada0,pass0)
<TOSHIBA MQ01ABF050 AM0P4C> at scbus1 target 0 lun 0 (ada1,pass1)
pool: zroot
state: DEGRADED
status: One or more devices could not be used because the label is missing or
invalid. Sufficient replicas exist for the pool to continue
functioning in a degraded state.
action: Replace the device using 'zpool replace'.
see: https://openzfs.github.io/openzfs-docs/msg/ZFS-8000-4J
scan: resilvered 20.5G in 00:00:52 with 0 errors on Thu May 12 09:40:08 2022
config:
NAME STATE READ WRITE CKSUM
zroot DEGRADED 0 0 0
mirror-0 DEGRADED 0 0 0
ada0p3 FAULTED 0 0 0 corrupted data
ada0p3 ONLINE 0 0 0
errors: No known data errors
- Clonar la tabla de particiones en el segundo disco:
- Localizar la partición freebsd-boot(por ser BIOS, UEFI es otro comando ):
40 1024 1 freebsd-boot (512K)
- Instalar el bootloader en la MBR y los ficheros de boot en la partición freebsd-boot(en este caso la primera partición: -i 1) para UEFI es otro comando :
- Reemplazar el disco, los parámetros del comando replace indican reemplaza este disco(1º param) por este otro(2º param).
Al hacer el replace ZFS de forma automática buscará el disco correcto desde el que hacer resilvering aunque el FAULTED y el ONLINE se llamen igual.
zpool replace -f zroot DISCO_FAULTED NUEVO_DISCO
pool: zroot
state: DEGRADED
status: One or more devices is currently being resilvered. The pool will
continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
scan: resilver in progress since Thu May 12 12:47:17 2022
19.3G scanned at 123M/s, 8.09G issued at 51.5M/s, 19.3G total
8.60G resilvered, 41.89% done, 00:03:43 to go
config:
NAME STATE READ WRITE CKSUM
zroot DEGRADED 0 0 0
mirror-0 DEGRADED 0 0 0
replacing-0 DEGRADED 0 0 0
ada0p3 FAULTED 0 0 0 corrupted data
ada1p3 ONLINE 0 0 0 (resilvering)
ada0p3 ONLINE 0 0 0
errors: No known data errors
Cuando termine:
pool: zroot
state: ONLINE
scan: resilvered 20.5G in 00:06:35 with 0 errors on Thu May 12 12:53:52 2022
config:
NAME STATE READ WRITE CKSUM
zroot ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
ada1p3 ONLINE 0 0 0
ada0p3 ONLINE 0 0 0
errors: No known data errors
Simulamos fallo del segundo disco
Sacamos el disco ada1:
Samsung SSD 850 EVO 500GB EMT02B6Q
Consultamos los discos y veremos que ha desaparecido:
<WDC WDS500G1B0A-00H9H0 X41100WD> at scbus0 target 0 lun 0 (ada0,pass0)
El estado del pool quedará asÃ:
pool: zroot
state: DEGRADED
status: One or more devices could not be opened. Sufficient replicas exist for
the pool to continue functioning in a degraded state.
action: Attach the missing device and online it using 'zpool online'.
see: https://openzfs.github.io/openzfs-docs/msg/ZFS-8000-2Q
config:
NAME STATE READ WRITE CKSUM
zroot DEGRADED 0 0 0
mirror-0 DEGRADED 0 0 0
ada0p3 ONLINE 0 0 0
ada1p3 UNAVAIL 0 0 0 cannot open
errors: No known data errors
Ya que no ha habido remapeo de discos, serÃa copiar el esquema de particiones del disco superviviente, instalar el bootloader y reemplazar el disco.
- Pinchar el de reemplazo en el segundo slot.
<WDC WDS500G1B0A-00H9H0 X41100WD> at scbus0 target 0 lun 0 (ada0,pass0)
<TOSHIBA MQ01ABF050 AM0P4C> at scbus1 target 0 lun 0 (ada1,pass1)
- Clonar la tabla de particiones en el segundo disco:
- Localizar la partición freebsd-boot(por ser BIOS, UEFI es otro comando ):
40 1024 1 freebsd-boot (512K)
- Instalar el bootloader en la MBR y los ficheros de boot en la partición freebsd-boot(en este caso la primera partición: -i 1) para UEFI es otro comando :
- Reemplazar el disco, los parámetros del comando replace indican reemplaza este disco(1º param) por este otro(2º param).
zpool replace -f zroot UNAVAIL NUEVO_DISCO
pool: zroot
state: DEGRADED
status: One or more devices is currently being resilvered. The pool will
continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
scan: resilver in progress since Thu May 12 15:14:54 2022
19.3G scanned at 1.07G/s, 526M issued at 29.2M/s, 19.3G total
567M resilvered, 2.66% done, 00:10:59 to go
config:
NAME STATE READ WRITE CKSUM
zroot DEGRADED 0 0 0
mirror-0 DEGRADED 0 0 0
ada0p3 ONLINE 0 0 0
replacing-1 DEGRADED 0 0 0
ada1p3/old UNAVAIL 0 0 0 cannot open
ada1p3 ONLINE 0 0 0 (resilvering)
errors: No known data errors
Cuando termine:
pool: zroot
state: ONLINE
scan: resilvered 20.5G in 00:06:35 with 0 errors on Thu May 12 15:21:29 2022
config:
NAME STATE READ WRITE CKSUM
zroot ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
ada0p3 ONLINE 0 0 0
ada1p3 ONLINE 0 0 0
errors: No known data errors
Troubleshooting
Puede que nos dé problemas manipulando la tabla de particiones en algunos discos:
gpart: Device busy
Puede ser por dos razones:
- El disco nuevo tenÃa una partición de swap que el sistema ha reconocido en el boot y la está utilizando:
Device 1K-blocks Used Avail Capacity
/dev/ada0p2 2097152 0 2097152 0%
/dev/ada1p2 2097152 0 2097152 0%
Total 4194304 0 4194304 0%
- O porque nos hemos confundido con el disco y estamos backupeando el incorrecto, al estar siendo utilizado por el SO no nos deja.
Lo que debe quedar claro es que el disco que se muestra ONLINE siempre es el que está funcionando correctamente independientemente del resto de información mostrada.
ada0p3 ONLINE 0 0 0
<Samsung SSD 850 EVO 500GB EMT02B6Q> at scbus1 target 0 lun 0 (ada0,pass0)
Si el disco bueno es ada0, habrá que backupear desde este a ada1