Backup doméstico seguro con Linux, cifrado y ZFS (V)

Antes de continuar, lee:

En esos artículo explico la migración de mi sistema de backup de una máquina virtual a un servidor físico. Proporciona el contexto para este documento.

Por supuesto es conveniente curiosear un poco la historia y la motivación de la tecnología:

El primer cambio de disco con el nuevo sistema se produjo en verano de 2015. Veamos los pasos:

Añadimos el segundo disco duro y sincronizamos el mirror

  1. Conectamos el segundo disco duro y arrancamos el sistema.

  2. Entramos en la máquina por SSH.

  3. Modificamos el script z-mount:

    El contenido inicial era:

    zpool export datos
    #cryptsetup luksOpen --key-file /mnt/z-clave_ZFS-CSI /dev/disk/by-id/scsi-SATA_WDC_WD20EARX-32_WD-WCAZAJ224496-part1 segundodisco && \
    cryptsetup luksOpen --key-file /mnt/z-clave_ZFS-CSI /dev/disk/by-id/scsi-SATA_WDC_WD20EARX-00_WD-WCAZAK648702-part1 primerdisco && \
    zpool import datos && \
    echo "Disco ZFS montado OK!!"
    #dd if=/dev/urandom of=/mnt/z-clave_ZFS-CSI bs=65536 count=2048
    vars=`ssh-agent`
    eval "$vars"
    ssh-add /datos/backups/scripts/id_rsa
    

    Lo cambiamos a:

    zpool export datos
    cryptsetup luksOpen --key-file /mnt/z-clave_ZFS-CSI /dev/disk/by-id/scsi-SATA_WDC_WD20EARX-32_WD-WCAZAJ224496-part1 segundodisco && \
    cryptsetup luksOpen --key-file /mnt/z-clave_ZFS-CSI /dev/disk/by-id/scsi-SATA_WDC_WD20EARX-00_WD-WCAZAK648702-part1 primerdisco && \
    zpool import datos && \
    echo "Disco ZFS montado OK!!"
    #dd if=/dev/urandom of=/mnt/z-clave_ZFS-CSI bs=65536 count=2048
    vars=`ssh-agent`
    eval "$vars"
    ssh-add /datos/backups/scripts/id_rsa
    
  4. Modificamos el script z-umount:

    El contenido inicial era:

    ssh-add -D && \
    zpool export datos && \
    #cryptsetup luksClose /dev/mapper/segundodisco && \
    cryptsetup luksClose /dev/mapper/primerdisco && \
    echo "DONE!"
    

    Lo cambiamos a:

    ssh-add -D && \
    zpool export datos && \
    cryptsetup luksClose /dev/mapper/segundodisco && \
    cryptsetup luksClose /dev/mapper/primerdisco && \
    echo "DONE!"
    

    Con estos cambios el servidor debería descifrar y activar los dos discos duros.

  5. Desde mi portátil lanzo el script ./z-activar-disco-csi.

    Esto activa el zpool.

  6. Entro por SSH y veo cual es la situación actual:

    root@csi:~# zpool status
      pool: datos
     state: DEGRADED
    status: One or more devices has been taken offline by the administrator.
            Sufficient replicas exist for the pool to continue functioning in a
            degraded state.
    action: Online the device using 'zpool online' or replace the device with
            'zpool replace'.
      scan: scrub repaired 0 in 17h2m with 0 errors on Mon Jan  5 21:16:27 2015
    config:
    
            NAME                      STATE     READ WRITE CKSUM
            datos                     DEGRADED     0     0     0
              mirror-0                DEGRADED     0     0     0
                primerdisco           ONLINE       0     0     0
                10256769708510827902  OFFLINE      0     0     0  was /dev/mapper/segundodisco
    
    errors: No known data errors
    

    Indicamos a ZFS que puede utilizar el disco duro que acabamos de conectar a la máquina:

    zpool online datos /dev/mapper/segundodisco
    

    Veamos qué opina ZFS del asunto:

    zpool status
      pool: datos
     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 Sun Jul 19 15:08:54 2015
        21.3M scanned out of 1.57T at 910K/s, 515h58m to go
        20.7M resilvered, 0.00% done
    config:
    
            NAME              STATE     READ WRITE CKSUM
            datos             ONLINE       0     0     0
              mirror-0        ONLINE       0     0     0
                primerdisco   ONLINE       0     0     0
                segundodisco  ONLINE       0     0     0  (resilvering)
    
    errors: No known data errors
    

    ZFS activa el segundo disco y empieza a sincronizar los cambios que se han producido desde navidad.

  7. Ahora es cuestión de esperar a que termine. Si la máquina se reinicia por cualquier motivo, ZFS continuará la sincronización en el mismo punto donde se hubiera quedado.

  8. Cuando la sincronización se complete veremos algo así:

    root@csi:~# zpool status
      pool: datos
     state: ONLINE
      scan: resilvered 56.1G in 4h20m with 0 errors on Sun Jul 19 19:29:48 2015
    config:
    
            NAME              STATE     READ WRITE CKSUM
            datos             ONLINE       0     0     0
              mirror-0        ONLINE       0     0     0
                primerdisco   ONLINE       0     0     0
                segundodisco  ONLINE       0     0     0
    
    errors: No known data errors
    

    Aquí vemos que hemos añadido 56GBytes desde navidades y que la sincronización ha supuesto 4 horas y 20 minutos de tiempo.

    El zpool se puede usar con normalidad durante el resilvering, aunque la latencia aumenta.

Revisamos la integridad del ZPOOL

El resilvering de ZFS resincroniza los discos copiando los cambios al disco que acabamos de enchufar. Antes de desenchufar el disco duro viejo es buena idea revisar la integridad completa del zpool ZFS haciendo un scrubbing:

root@csi:~# zpool scrub datos

Es cuestión de esperar a que acabe. Como con el resilvering, si la máquina se reinicia, el scrubbing continuará en el punto donde se hubiese quedado.

El proceso es bastante lento, proporcional al volumen de datos totales del zpool. El zpool se puede usar con normalidad, aunque con algo más de latencia. En caso necesario el scrubbing se puede cancelar con un zpool scrub -s datos.

Cuando termine veremos algo así:

root@csi:~# zpool status
  pool: datos
 state: ONLINE
  scan: scrub repaired 0 in 17h34m with 0 errors on Mon Jul 20 18:05:11 2015
config:

        NAME              STATE     READ WRITE CKSUM
        datos             ONLINE       0     0     0
          mirror-0        ONLINE       0     0     0
            primerdisco   ONLINE       0     0     0
            segundodisco  ONLINE       0     0     0

errors: No known data errors

La revisión total de 4 terabytes de datos ha necesitado 17 horas y media. Durante el proceso no se han encontrado errores. Bien.

Si hubiera habido algún tipo de problema, se hubiera corregido el error de un disco duro con el contenido del otro, automáticamente. En este caso no ha hecho falta.

Verificamos el S.M.A.R.T. de los discos duros

Una vez que hemos comprobado la integridad completa del zpool ZFS, echamos un vistazo a sus valores S.M.A.R.T.:

root@csi:~# smartctl -a /dev/disk/by-id/scsi-SATA_WDC_WD20EARX-32_WD-WCAZAJ224496
[...]
SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x002f   200   200   051    Pre-fail  Always       -       1
  3 Spin_Up_Time            0x0027   188   167   021    Pre-fail  Always       -       5558
  4 Start_Stop_Count        0x0032   099   099   000    Old_age   Always       -       1389
  5 Reallocated_Sector_Ct   0x0033   200   200   140    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x002e   200   200   000    Old_age   Always       -       0
  9 Power_On_Hours          0x0032   097   097   000    Old_age   Always       -       2586
 10 Spin_Retry_Count        0x0032   100   100   000    Old_age   Always       -       0
 11 Calibration_Retry_Count 0x0032   100   100   000    Old_age   Always       -       0
 12 Power_Cycle_Count       0x0032   099   099   000    Old_age   Always       -       1348
192 Power-Off_Retract_Count 0x0032   200   200   000    Old_age   Always       -       159
193 Load_Cycle_Count        0x0032   197   197   000    Old_age   Always       -       9570
194 Temperature_Celsius     0x0022   114   107   000    Old_age   Always       -       36
196 Reallocated_Event_Count 0x0032   200   200   000    Old_age   Always       -       0
197 Current_Pending_Sector  0x0032   200   200   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0030   200   200   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x0032   200   200   000    Old_age   Always       -       0
200 Multi_Zone_Error_Rate   0x0008   200   200   000    Old_age   Offline      -       0
[...]

root@csi:~# smartctl -a /dev/disk/by-id/scsi-SATA_WDC_WD20EARX-00_WD-WCAZAK648702
[...]
SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x002f   200   200   051    Pre-fail  Always       -       0
  3 Spin_Up_Time            0x0027   167   164   021    Pre-fail  Always       -       6625
  4 Start_Stop_Count        0x0032   099   099   000    Old_age   Always       -       1198
  5 Reallocated_Sector_Ct   0x0033   200   200   140    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x002e   200   200   000    Old_age   Always       -       0
  9 Power_On_Hours          0x0032   097   097   000    Old_age   Always       -       2275
 10 Spin_Retry_Count        0x0032   100   100   000    Old_age   Always       -       0
 11 Calibration_Retry_Count 0x0032   100   100   000    Old_age   Always       -       0
 12 Power_Cycle_Count       0x0032   099   099   000    Old_age   Always       -       1175
192 Power-Off_Retract_Count 0x0032   200   200   000    Old_age   Always       -       23
193 Load_Cycle_Count        0x0032   198   198   000    Old_age   Always       -       8792
194 Temperature_Celsius     0x0022   116   109   000    Old_age   Always       -       34
196 Reallocated_Event_Count 0x0032   200   200   000    Old_age   Always       -       0
197 Current_Pending_Sector  0x0032   200   200   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0030   200   200   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x0032   200   200   000    Old_age   Always       -       0
200 Multi_Zone_Error_Rate   0x0008   200   200   000    Old_age   Offline      -       0
[...]

Vemos que ambos discos gozan de una salud excelente, al menos según S.M.A.R.T..

Desenchufamos el disco duro viejo

Tras una semana con los dos discos funcionando simultáneamente, llega el momento de extraer el disco duro "viejo" y dejar solo el "nuevo".

  1. Primero vemos cómo va todo:

    root@csi:~# zpool status
      pool: datos
     state: ONLINE
      scan: scrub repaired 0 in 17h34m with 0 errors on Mon Jul 20 18:05:11 2015
    config:
    
        NAME              STATE     READ WRITE CKSUM
        datos             ONLINE       0     0     0
          mirror-0        ONLINE       0     0     0
            primerdisco   ONLINE       0     0     0
            segundodisco  ONLINE       0     0     0
    
    errors: No known data errors
    

    Todo parece OK.

  2. Pedimos a ZFS que deje de utilizar el disco duro viejo:

    root@csi:~# zpool offline datos primerdisco
    root@csi:~# zpool status
      pool: datos
     state: DEGRADED
    status: One or more devices has been taken offline by the administrator.
        Sufficient replicas exist for the pool to continue functioning in a
        degraded state.
    action: Online the device using 'zpool online' or replace the device with
        'zpool replace'.
      scan: scrub repaired 0 in 17h34m with 0 errors on Mon Jul 20 18:05:11 2015
    config:
    
        NAME              STATE     READ WRITE CKSUM
        datos             DEGRADED     0     0     0
          mirror-0        DEGRADED     0     0     0
            primerdisco   OFFLINE      0     0     0
            segundodisco  ONLINE       0     0     0
    
    errors: No known data errors
    
  3. Desmontamos el zpool ZFS con ./z-umount.

  4. Actualizamos los scripts z-mount y z-umount para que ignoren el disco duro viejo que ya no está conectado al servidor.

  5. Apago el servidor y desenchufo el disco duro viejo.

  6. Aprovecho para cambiar del bahía el disco duro nuevo para probar las cuatro que tiene el servidor.

  7. Tras reiniciar:

    root@csi:~# zpool status
      pool: datos
     state: DEGRADED
    status: One or more devices has been taken offline by the administrator.
        Sufficient replicas exist for the pool to continue functioning in a
        degraded state.
    action: Online the device using 'zpool online' or replace the device with
        'zpool replace'.
      scan: scrub repaired 0 in 17h34m with 0 errors on Mon Jul 20 18:05:11 2015
    config:
    
        NAME              STATE     READ WRITE CKSUM
        datos             DEGRADED     0     0     0
          mirror-0        DEGRADED     0     0     0
            primerdisco   OFFLINE      0     0     0
            segundodisco  ONLINE       0     0     0
    
    errors: No known data errors
    

Todo está bien.

Empaquetamos el disco duro viejo y lo guardamos a buen recaudo en la casa de un amigo de confianza.