Esta pagina se ve mejor con JavaScript habilitado

FreeBSD ZFS Vol4 Convertir zroot a Mirror

 ·  🎃 kr0m

Tener redundancia del SO es casi igual de importante como redundar los datos propiamente dichos, el fallo del SO puede implicar un downtime considerable dependiendo de los servicios que hubiesen instalados en este, a continuación veremos como pasar nuestro pool zroot a modo mirror, de este modo los datos del SO estarán duplicados en tantos discos como deseemos.

Antes de continuar con el artículo es aconsejable que revisemos  este anterior para que todos los conceptos queden claros.

Cuando se quiere convertir un pool bootable a mirror además de añadir los discos al vdev tendremos que replicar el esquema de particiones del disco original ya que en todos los discos debe existir una copia del bootloader.

En este caso vamos a pasar a mirror el pool zroot:

root@Melocotonazo:~ # zpool status

  pool: zroot  
 state: ONLINE  
  scan: none requested  
config:  
  
 NAME        STATE     READ WRITE CKSUM  
 zroot       ONLINE       0     0     0  
   vtbd0p4   ONLINE       0     0     0  
  
errors: No known data errors

Consultamos los discos disponibles(se trata de una VM CBSD con virtio-blk disks):

root@Melocotonazo:~ # ls -al /dev/vtbd*

crw-r-----  1 root  operator  0x61 Nov 13 22:51 /dev/vtbd0  
crw-r-----  1 root  operator  0x63 Nov 13 22:51 /dev/vtbd0p1  
crw-r-----  1 root  operator  0x64 Nov 13 22:51 /dev/vtbd0p2  
crw-r-----  1 root  operator  0x65 Nov 13 23:51 /dev/vtbd0p3  
crw-r-----  1 root  operator  0x66 Nov 13 22:51 /dev/vtbd0p4  
crw-r-----  1 root  operator  0x62 Nov 13 22:51 /dev/vtbd1

Replicamos el esquema de particiones en el segundo disco, este debe de ser del mismo tamaño o mayor que el primero:

root@Melocotonazo:~ # gpart backup vtbd0 | gpart restore -F vtbd1

Comprobamos que los dos discos tengan el mismo esquema:

root@Melocotonazo:~ # gpart show vtbd0

=>      40  20971696  vtbd0  GPT  (10G)  
        40    409600      1  efi  (200M)  
    409640      1024      2  freebsd-boot  (512K)  
    410664       984         - free -  (492K)  
    411648   4194304      3  freebsd-swap  (2.0G)  
   4605952  16365568      4  freebsd-zfs  (7.8G)  
  20971520       216         - free -  (108K)
root@Melocotonazo:~ # gpart show vtbd1
=>      40  20971696  vtbd1  GPT  (10G)  
        40    409600      1  efi  (200M)  
    409640      1024      2  freebsd-boot  (512K)  
    410664       984         - free -  (492K)  
    411648   4194304      3  freebsd-swap  (2.0G)  
   4605952  16365568      4  freebsd-zfs  (7.8G)  
  20971520       216         - free -  (108K)

Se puede apreciar que existen tanto la partición EFI como la de arranque tradicional utilizada por la BIOS, esto es debido a que cuando se instaló el SO se eligió GPT(BIOS+UEFI), este es el modo mas compatible ya que el disco puede ser arrancado por ambos sistemas.

Añadimos el disco al pool zroot:

root@Melocotonazo:~ # zpool attach zroot vtbd0p4 vtbd1p4

Make sure to wait until resilver is done before rebooting.  
  
If you boot from pool 'zroot', you may need to update  
boot code on newly attached disk 'vtbd1p4'.  
  
Assuming you use GPT partitioning and 'da0' is your new boot disk  
you may use the following command:  
  
 gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0

Al insertar un nuevo disco los datos deben ser copiados de un disco a otro, a este proceso se le llama resilver, podemos ver el progreso en la salida del comando zpool status:

root@Melocotonazo:~ # zpool status

  pool: zroot  
 state: ONLINE  
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 Sat Nov 14 00:02:32 2020  
 823M scanned at 51.5M/s, 803M issued at 50.2M/s, 824M total  
 794M resilvered, 97.43% done, 0 days 00:00:00 to go  
config:  
  
 NAME         STATE     READ WRITE CKSUM  
 zroot        ONLINE       0     0     0  
   mirror-0   ONLINE       0     0     0  
     vtbd0p4  ONLINE       0     0     0  
     vtbd1p4  ONLINE       0     0     0  
  
errors: No known data errors

Cuando termine el status aparecerá como resilvered:

root@Melocotonazo:~ # zpool status

  pool: zroot  
 state: ONLINE  
  scan: resilvered 823M in 0 days 00:00:15 with 0 errors on Fri Nov 13 23:03:12 2020  
config:  
  
 NAME         STATE     READ WRITE CKSUM  
 zroot        ONLINE       0     0     0  
   mirror-0   ONLINE       0     0     0  
     vtbd0p4  ONLINE       0     0     0  
     vtbd1p4  ONLINE       0     0     0  
  
errors: No known data errors

Copiamos el bootstrap code a la partición de EFI/BIOS vtbd1, de este modo no habrá problemas independientemente del disco del que arranque.
Recordemos el esquema de particiones del que disponemos:

root@Melocotonazo:~ # gpart show vtbd1

=>      40  20971696  vtbd1  GPT  (10G)  
        40    409600      1  efi  (200M)  
    409640      1024      2  freebsd-boot  (512K)

Según el tipo de arranque que estemos utilizando instalaremos el bootloader de un modo u otro en una partición u otra, recordemos que hemos instalado en SO en modo GPT(BIOS/UEFI) por esta razón tenemos dos particiones, una EFI y otra freebsd-boot, por lo tanto indicaremos mediante el parámetro -i donde deseamos instalar el bootloader.

UEFI:

root@Melocotonazo:~ # gpart bootcode -p /boot/boot1.efifat -i 1 vtbd1

partcode written to vtbd1p1

BIOS: Este sistema además de copiar los datos a la partición también escribe el MBR del disco indicado.

root@Melocotonazo:~ # gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 2 vtbd1

partcode written to vtbd1p2  
bootcode written to vtbd1

Si desconectamos el disco vtbd0 el sistema arrancará sin problemas pero el pool estará degradado:

root@Melocotonazo:~ # 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: http://illumos.org/msg/ZFS-8000-4J  
  scan: resilvered 823M in 0 days 00:00:16 with 0 errors on Sat Nov 14 00:02:48 2020  
config:  
  
 NAME                     STATE     READ WRITE CKSUM  
 zroot                    DEGRADED     0     0     0  
   mirror-0               DEGRADED     0     0     0  
     4177867918075153002  FAULTED      0     0     0  was /dev/vtbd0p4  
     vtbd0p4              ONLINE       0     0     0  
  
errors: No known data errors

Podemos optar por eliminar el disco fallido o reemplazarlo, vamos a ver ambos casos.

Eliminarlo:

root@Melocotonazo:~ # zpool detach zroot 4177867918075153002
root@Melocotonazo:~ # zpool status

  pool: zroot  
 state: ONLINE  
  scan: resilvered 823M in 0 days 00:00:16 with 0 errors on Sat Nov 14 00:02:48 2020  
config:  
  
 NAME        STATE     READ WRITE CKSUM  
 zroot       ONLINE       0     0     0  
   vtbd0p4   ONLINE       0     0     0  
  
errors: No known data errors

Reemplazarlo:

root@Melocotonazo:~ # 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: http://illumos.org/msg/ZFS-8000-2Q  
  scan: resilvered 823M in 0 days 00:00:14 with 0 errors on Sat Nov 14 11:52:53 2020  
config:  
  
 NAME                      STATE     READ WRITE CKSUM  
 zroot                     DEGRADED     0     0     0  
   mirror-0                DEGRADED     0     0     0  
     17957430762927248855  UNAVAIL      0     0     0  was /dev/vtbd0p4  
     vtbd1p4               ONLINE       0     0     0  
  
errors: No known data errors

Preparamos el disco de reemplazo:

root@Melocotonazo:~ # gpart backup vtbd1 | gpart restore -F vtbd0
root@Melocotonazo:~ # gpart bootcode -p /boot/boot1.efifat -i 1 vtbd0

partcode written to vtbd0p1

Realizamos el reemplazo:

root@Melocotonazo:~ # zpool replace zroot 17957430762927248855 vtbd0p4

Make sure to wait until resilver is done before rebooting.  
  
If you boot from pool 'zroot', you may need to update  
boot code on newly attached disk 'vtbd0p4'.  
  
Assuming you use GPT partitioning and 'da0' is your new boot disk  
you may use the following command:  
  
 gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0

Podemos ver que está realizando el resilver del disco:

root@Melocotonazo:~ # 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 Sat Nov 14 11:59:42 2020  
 823M scanned at 103M/s, 460M issued at 57.4M/s, 824M total  
 455M resilvered, 55.80% done, 0 days 00:00:06 to go  
config:  
  
 NAME                        STATE     READ WRITE CKSUM  
 zroot                       DEGRADED     0     0     0  
   mirror-0                  DEGRADED     0     0     0  
     replacing-0             UNAVAIL      0     0     0  
       17957430762927248855  UNAVAIL      0     0     0  was /dev/vtbd0p4/old  
       vtbd0p4               ONLINE       0     0     0  
     vtbd1p4                 ONLINE       0     0     0  
  
errors: No known data errors

Cuando termine el status aparecerá como resilvered y todos podremos volver a dormir tranquilos:

root@Melocotonazo:~ # zpool status

  pool: zroot  
 state: ONLINE  
  scan: resilvered 823M in 0 days 00:00:15 with 0 errors on Sat Nov 14 11:59:57 2020  
config:  
  
 NAME         STATE     READ WRITE CKSUM  
 zroot        ONLINE       0     0     0  
   mirror-0   ONLINE       0     0     0  
     vtbd0p4  ONLINE       0     0     0  
     vtbd1p4  ONLINE       0     0     0  
  
errors: No known data errors
Si te ha gustado el artículo puedes invitarme a un RedBull aquí