Sustitución de un disco muerto en un zpool

31

Estoy ejecutando Ubuntu Server 13.04 de 64 bits con ZFS nativo. Tengo un zpool que consta de 4 discos duros, uno de los cuales murió ayer y ahora el sistema operativo o el BIOS ya no lo reconocen.

Desafortunadamente, vi el problema solo después del siguiente reinicio, así que ahora falta la etiqueta de la unidad y no puedo reemplazar el disco usando las instrucciones oficiales aquí y aquí .

zpool status hermes -x

huellas dactilares

root@zeus:~# zpool status hermes -x
  pool: hermes
 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://zfsonlinux.org/msg/ZFS-8000-4J
  scan: scrub repaired 0 in 2h4m with 0 errors on Sun Jun  9 00:28:24 2013
config:

        NAME                         STATE     READ WRITE CKSUM
        hermes                       DEGRADED     0     0     0
          raidz1-0                   DEGRADED     0     0     0
            ata-ST3300620A_5QF0MJFP  ONLINE       0     0     0
            ata-ST3300831A_5NF0552X  UNAVAIL      0     0     0
            ata-ST3200822A_5LJ1CHMS  ONLINE       0     0     0
            ata-ST3200822A_3LJ0189C  ONLINE       0     0     0

errors: No known data errors

Ya reemplacé el disco por uno nuevo (que obtuvo la etiqueta /dev/disk/by-id/ata-ST3500320AS_9QM03ATQ)

Cualquiera de los comandos

zpool replace hermes /dev/disk/by-id/ata-ST3300831A_5NF0552X /dev/disk/by-id/ata-ST3500320AS_9QM03ATQ
zpool offline hermes /dev/disk/by-id/ata-ST3300831A_5NF0552X
zpool detatch hermes /dev/disk/by-id/ata-ST3300831A_5NF0552X

falla con

root@zeus:~# zpool offline hermes /dev/disk/by-id/ata-ST3300831A_5NF0552X
cannot offline /dev/disk/by-id/ata-ST3300831A_5NF0552X: no such device in pool

porque la etiqueta de la unidad que murió ya no existe en el sistema. También probé los comandos anteriores omitiendo la ruta a la etiqueta de la unidad en vano.

¿Cómo puedo reemplazar el disco "fantasma"?

Marcus
fuente

Respuestas:

38

Después de cavar sin parar esta noche, finalmente encontré la solución. La respuesta breve es que puede usar los GUID de los discos (que persisten incluso después de desconectar una unidad) con el zpoolcomando.

Respuesta larga: obtuve el GUID del disco usando el zdbcomando que me dio el siguiente resultado

root@zeus:/dev# zdb
hermes:
    version: 28
    name: 'hermes'
    state: 0
    txg: 162804
    pool_guid: 14829240649900366534
    hostname: 'zeus'
    vdev_children: 1
    vdev_tree:
        type: 'root'
        id: 0
        guid: 14829240649900366534
        children[0]:
            type: 'raidz'
            id: 0
            guid: 5355850150368902284
            nparity: 1
            metaslab_array: 31
            metaslab_shift: 32
            ashift: 9
            asize: 791588896768
            is_log: 0
            create_txg: 4
            children[0]:
                type: 'disk'
                id: 0
                guid: 11426107064765252810
                path: '/dev/disk/by-id/ata-ST3300620A_5QF0MJFP-part2'
                phys_path: '/dev/gptid/73b31683-537f-11e2-bad7-50465d4eb8b0'
                whole_disk: 1
                create_txg: 4
            children[1]:
                type: 'disk'
                id: 1
                guid: 15935140517898495532
                path: '/dev/disk/by-id/ata-ST3300831A_5NF0552X-part2'
                phys_path: '/dev/gptid/746c949a-537f-11e2-bad7-50465d4eb8b0'
                whole_disk: 1
                create_txg: 4
            children[2]:
                type: 'disk'
                id: 2
                guid: 7183706725091321492
                path: '/dev/disk/by-id/ata-ST3200822A_5LJ1CHMS-part2'
                phys_path: '/dev/gptid/7541115a-537f-11e2-bad7-50465d4eb8b0'
                whole_disk: 1
                create_txg: 4
            children[3]:
                type: 'disk'
                id: 3
                guid: 17196042497722925662
                path: '/dev/disk/by-id/ata-ST3200822A_3LJ0189C-part2'
                phys_path: '/dev/gptid/760a94ee-537f-11e2-bad7-50465d4eb8b0'
                whole_disk: 1
                create_txg: 4
    features_for_read:

El GUID que estaba buscando es el 15935140517898495532que me permitió hacer

root@zeus:/dev# zpool offline hermes 15935140517898495532
root@zeus:/dev# zpool status
  pool: hermes
 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 2h4m with 0 errors on Sun Jun  9 00:28:24 2013
config:

        NAME                         STATE     READ WRITE CKSUM
        hermes                       DEGRADED     0     0     0
          raidz1-0                   DEGRADED     0     0     0
            ata-ST3300620A_5QF0MJFP  ONLINE       0     0     0
            ata-ST3300831A_5NF0552X  OFFLINE      0     0     0
            ata-ST3200822A_5LJ1CHMS  ONLINE       0     0     0
            ata-ST3200822A_3LJ0189C  ONLINE       0     0     0

errors: No known data errors

y entonces

root@zeus:/dev# zpool replace hermes 15935140517898495532 /dev/disk/by-id/ata-ST3500320AS_9QM03ATQ
root@zeus:/dev# zpool status
  pool: hermes
 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 Sun Jun  9 01:44:36 2013
    408M scanned out of 419G at 20,4M/s, 5h50m to go
    101M resilvered, 0,10% done
config:

        NAME                            STATE     READ WRITE CKSUM
        hermes                          DEGRADED     0     0     0
          raidz1-0                      DEGRADED     0     0     0
            ata-ST3300620A_5QF0MJFP     ONLINE       0     0     0
            replacing-1                 OFFLINE      0     0     0
              ata-ST3300831A_5NF0552X   OFFLINE      0     0     0
              ata-ST3500320AS_9QM03ATQ  ONLINE       0     0     0  (resilvering)
            ata-ST3200822A_5LJ1CHMS     ONLINE       0     0     0
            ata-ST3200822A_3LJ0189C     ONLINE       0     0     0

errors: No known data errors

Después de completar la recuperación, todo volvió a funcionar bien. Hubiera sido bueno incluir esta información, que puede usar el GUID de un disco obtenido zdbcon el zpoolcomando, con la página de manual de zpool.

Editar

Como lo señala durval debajo, el zdbcomando puede no generar nada. Entonces puedes intentar usar

zdb -l /dev/<name-of-device>

para enumerar explícitamente información sobre el dispositivo (incluso si ya falta en el sistema).

Marcus
fuente
Genial, luego, antes de ejecutar, agregue usando el -ninterruptor, pero también el -ginterruptor tomará el líquido de esa manera también.
Brian Thomas
Gracias, esto fue bastante útil ya que hurgando en la web no pude encontrar información sobre cómo obtener cosas extraídas de zdb.
xamox
He estado buscando durante semanas y finalmente esta respuesta funcionó. Pero las ID enumeradas por zpool status(nombres como sdab) NO eran las mismas que las rutas en /dev/disk/by-id(nombres de ID largos y locos). Pero ls -la /dev/disk/by-idrevela que todos son enlaces, /dev/...así que encontré el que apuntaba a mi disco UNAVAIL (y, posteriormente, OFFLINE), y pude completar estos pasos con éxito. Ahora es resistente. ¡Gracias!
Matt
Una forma alternativa más corta de obtener el GUID es zpool status -gmostrar el estado mediante GUID para cada dispositivo. Además, para @Matt, zpool status -Lmostrará el estado utilizando los nombres básicos del dispositivo en lugar de los /dev/disk/by-idnombres largos .
StarNamer
Eres un MVP real que regresa con tu solución. Esto funcionó para mí.
extracrispy 01 de
3

El problema es que los discos están referenciados por identificadores y no por dispositivo.

Aquí hay una solución que debería funcionar:

ln -s /dev/null /dev/ata-ST3300831A_5NF0552X
zpool export hermes
zpool import hermes
zpool status
# note the new device name that should appear here
zpool offline hermes xxxx
zpool replace hermes xxxx /dev/disk/by-id/ata-ST3500320AS_9QM03ATQ

Editar: llegué 30 segundos tarde ...

jlliagre
fuente
Gracias. Estaba tratando de crear un enlace vacío a la unidad que faltaba, pero seguía diciendo no such device in pool.
Marcus
Mi sugerencia es casi idéntica a lo que hiciste. La única diferencia es la forma de obtener el dispositivo guid. Después de crear un enlace simbólico a / dev / null (que es diferente de un enlace vacío) y exportar / importar el grupo, aparece enzpool status
jlliagre
El uso de este método en realidad me las arreglé para conseguir la unidad "defecto" de nuevo en línea sin reemplazarlo (así que me salté offliney replacepasos). Importé el grupo por segunda vez después de eliminar el enlace nulo. ¿Quizás fue solo un problema con la etiqueta de la unidad? De hecho, el nombre del disco seguía siendo el mismo. Luego hice un exfoliante completo y no se encontraron errores.
Serrano
2

@ Marcus: Gracias por publicar esta excelente respuesta a su propia pregunta, me ayudó mucho.

El otro día encontré un giro que podría interesarle (y a cualquier otra persona que venga a buscar en Google en el futuro): tuve un dispositivo de caché que se eliminó del grupo (y se marcó como "UNAVAIL") debido a este mismo error (ZFS-8000-4J, "falta la etiqueta o no es válida"), y al intentar desconectarlo / eliminarlo / reemplazarlo falló exactamente con el mismo mensaje "ningún dispositivo en el grupo".

PERO, cuando traté de aplicar la solución, claro "ZDB" (sin argumentos) no no lista el dispositivo, y mucho menos su GUID.

Después de investigar un poco, descubrí que "zdb -l / dev / DEVICENAME" enumeraba el GUID (tomándolo directamente del dispositivo y no de los registros del grupo), y usar ese GUID me permitió hacer el reemplazo (en realidad hice un "zpool offline" seguido de un "zpool remove" y luego un "zpool add", que funcionó perfectamente).

Durval
fuente
¡Gracias! A agregué una pista en mi propia respuesta aceptada con una referencia a su comentario.
Marcus
Para mí, zdb -l /dev/...siempre mostró "no se pudo descomprimir la etiqueta".
Matt
0

Tuve un problema similar:

La unidad falló de tal manera que ya no se registró en el BIOS (totalmente muerta). El zpool statusindicado que era UNAVAILABLE.

Puse una unidad de capacidad similar y logré asignarla como una nueva spareque fue INUSEy recargué la unidad. Pero, en realidad no era parte del zpool, más bien el grupo tenía un recuerdo del disco perdido, pensando que algún día volvería a aparecer.

La solución fue soltar primero la unidad faltante del zpool:

[root@hactar ~]# zpool detach hactar_data /dev/gptid/87410b00-adb0-11e6-9193-00241d738094  

Luego, suelte la unidad marcada spare-1 INUSEtambién:

[root@hactar ~]# zpool detach hactar_data /dev/gptid/f2089b59-2654-11e5-8d99-00241d738094

Una vez que hice esto, parece que FreeNAS lo descubrió sin que yo tuviera que hacer un replacecomando, sin embargo, si su sistema no lo resuelve, el siguiente comando debería reemplazar un dispositivo con el otro:

zpool replace {your_poolname} {drive to be replaced} {new drive to take its place}

Por ejemplo:

zpool replace hactar_data /dev/gptid/87410b00-adb0-11e6-9193-00241d738094 /dev/gptid/87410b00-adb0-11e6-9193-00241d
738094
  • Los gptidos vinieron de mi zpool statuscomando.
Comida
fuente