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:
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):
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:
Comprobamos que los dos discos tengan el mismo esquema:
=> 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)
=> 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:
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:
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:
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:
=> 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:
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.
partcode written to vtbd1p2
bootcode written to vtbd1
Si desconectamos el disco vtbd0 el sistema arrancará sin problemas pero el pool estará degradado:
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 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:
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 bootcode -p /boot/boot1.efifat -i 1 vtbd0
partcode written to vtbd0p1
Realizamos el reemplazo:
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:
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:
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