¿Cómo reemplazar un disco en un grupo ZFS no redundante?

8

He estado leyendo un poco, y parece que a ZFS no le gusta que los discos se eliminen de matrices no redundantes :

Puede usar el zpool detachcomando para separar un dispositivo de un grupo de almacenamiento reflejado. Por ejemplo:

# zpool detach zeepool c2t1d0

Sin embargo, esta operación se rechaza si no hay otras réplicas válidas de los datos. Por ejemplo:

# zpool detach newpool c1t2d0
cannot detach c1t2d0: only applicable to mirror and replacing vdevs

El problema básico es comprensible: eliminar la única copia de una pieza de datos (ya sean metadatos o datos de carga útil) de una matriz haría que esos datos no estén disponibles.

Los ejemplos para reemplazar dispositivos en un grupo de almacenamiento de ZFS ofrecen una descripción básica paso a paso sobre cómo reemplazar un dispositivo en un grupo de almacenamiento: desconectar el disco, extraer el disco, insertar el disco de reemplazo, ejecutar zpool replacepara informar a ZFS del cambio y en línea el disco. Obviamente, esto requiere que la matriz no dependa del disco que se está reemplazando, por lo tanto, la matriz debe tener redundancia; Si depende de la unidad en cuestión, este enfoque presenta el mismo problema que el anterior.

¿Cuál es la forma recomendada de reemplazar un disco en una matriz ZFS no redundante ?

Suponga que el disco existente funciona correctamente y suponga que el disco de reemplazo tiene al menos el mismo tamaño que el disco que se está reemplazando. (Si el disco existente ha fallado, claramente todo lo que se podría hacer es agregar un nuevo disco y restaurar todos los archivos afectados por la falla del disco desde la copia de seguridad).

un CVn
fuente

Respuestas:

3

No sé si las cosas eran tan diferentes en '13 pero' zfs replace 'funciona en grupos no redundantes. Simplemente ejecutas el comando 1 en lugar de desconectarte primero.

d1 es 1G, d2 es 2G, ambos son archivos vacíos en / tmp:

/t/test #> zpool create test /tmp/test/d1
/t/test #> zpool set autoexpand=on test
/t/test #> zpool status
  pool: test
 state: ONLINE
  scan: none requested
config:

    NAME            STATE     READ WRITE CKSUM
    test            ONLINE       0     0     0
      /tmp/test/d1  ONLINE       0     0     0

errors: No known data errors
/t/test #> zpool list
NAME    SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
test   1008M   258K  1008M         -     0%     0%  1.00x  ONLINE  -


/t/test #> zpool replace test /tmp/test/d1 /tmp/test/d2


/t/test #> zpool status
  pool: test
 state: ONLINE
  scan: resilvered 61K in 0h0m with 0 errors on Sun Sep 18 18:55:32 2016
config:

    NAME            STATE     READ WRITE CKSUM
    test            ONLINE       0     0     0
      /tmp/test/d2  ONLINE       0     0     0

errors: No known data errors
/t/test #> zpool list
NAME    SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
test   1.98G   408K  1.98G         -     0%     0%  1.00x  ONLINE  -
alaricljs
fuente
12
zpool attach pool old-disk new-disk

Eso convertirá el disco viejo en un espejo tanto con el disco viejo como con el disco nuevo y comenzará la recuperación después de lo cual puede separar el disco viejo.

zpool detach pool old-disk

Probado con dispositivos de bucle:

# truncate -s 1G a b
# truncate -s 1200M c
# losetup  /dev/loop0 a
# losetup  /dev/loop1 b
# losetup  /dev/loop2 c
# zpool create test loop{0,1}
# zpool attach test loop1 loop2
# zpool status
      pool: test
 state: ONLINE
  scan: resilvered 62K in 0h0m with 0 errors on Wed Jul 31 13:43:19 2013
config:

        NAME        STATE     READ WRITE CKSUM
        test        ONLINE       0     0     0
          loop0     ONLINE       0     0     0
          mirror-1  ONLINE       0     0     0
            loop1   ONLINE       0     0     0
            loop2   ONLINE       0     0     0
# zpool detach test loop1
# zpool status
  pool: test
 state: ONLINE
  scan: resilvered 62K in 0h0m with 0 errors on Wed Jul 31 13:43:19 2013
config:

        NAME        STATE     READ WRITE CKSUM
        test        ONLINE       0     0     0
          loop0     ONLINE       0     0     0
          loop2     ONLINE       0     0     0
Stéphane Chazelas
fuente
Entonces, ¿estás diciendo que ZFS no admite una operación de este tipo de forma nativa? Parece raro ( Parece que todo lo que se necesita es tener ambas unidades conectadas y luego informar a ZFS que la unidad anterior está a punto de desconectarse, lo que le da la oportunidad de migrar los datos a otras unidades de la misma manera que se haría si eso fue una recuperación en una matriz redundante.)
un CVn
@ MichaelKjörling, no estoy diciendo eso. Solo digo que lo anterior debería funcionar ya que no puedo ver ninguna razón por la que no debería.
Stéphane Chazelas
Dicho esto, parece que ZFS lo admite de hecho. Respuesta actualizada
Stéphane Chazelas
¡Excelente! Este es el tipo de respuesta que estaba buscando y que esperaba obtener. Te daría otro +1 por probarlo si pudiera.
un CVn