Esta pagina se ve mejor con JavaScript habilitado

Root ZFS Mirror FreeBSD

 ·  🎃 kr0m

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:

root@odissey:~ # camcontrol devlist
<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)
root@odissey:~ # zpool status
  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:

odyssey # ~> camcontrol devlist

<Samsung SSD 850 EVO 500GB EMT02B6Q>  at scbus1 target 0 lun 0 (ada0,pass0)

El estado del pool quedará así:

odyssey # ~> zpool status

  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:

odyssey # ~> camcontrol devlist
<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)
odyssey # ~> zpool status
  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:
gpart backup ada0 | gpart restore -F ada1
gpart show ada1 | grep freebsd-boot
         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 :
gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1
  • 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
zpool replace -f zroot ada0p3 ada1p3
odyssey # ~> zpool status
  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:

odyssey # ~> zpool status

  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:

root@odissey:~ # camcontrol devlist

<WDC WDS500G1B0A-00H9H0 X41100WD>  at scbus0 target 0 lun 0 (ada0,pass0)

El estado del pool quedará así:

root@odissey:~ # zpool status

  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.
odyssey # ~> camcontrol devlist
<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:
gpart backup ada0 | gpart restore -F ada1
gpart show ada1 | grep freebsd-boot
         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 :
gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1
  • 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
zpool replace -f zroot ada1p3 ada1p3
odyssey # ~> zpool status
  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:

odyssey # ~> zpool status

  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:

odyssey # ~> gpart backup ada0 | gpart restore -F ada1

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:
odyssey # ~> swapinfo
Device          1K-blocks     Used    Avail Capacity
/dev/ada0p2       2097152        0  2097152     0%
/dev/ada1p2       2097152        0  2097152     0%
Total             4194304        0  4194304     0%
odyssey # ~> swapoff /dev/ada1p2
  • 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

Si te ha gustado el artículo puedes invitarme a un RedBull aquí