Sostituzione di un disco morto in uno zpool


31

Sto eseguendo Ubuntu Server 13.04 a 64 bit usando ZFS nativo. Ho uno zpool composto da 4 dischi rigidi di cui uno è morto ieri e ora non viene più riconosciuto dal sistema operativo o dal BIOS.

Sfortunatamente ho visto il problema solo dopo il prossimo riavvio, quindi ora manca l'etichetta dell'unità e non posso sostituire il disco usando le istruzioni ufficiali qui e qui .

zpool status hermes -x

stampe

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

Ho già sostituito l'unità con una nuova (che ha ottenuto l'etichetta /dev/disk/by-id/ata-ST3500320AS_9QM03ATQ)

Uno qualsiasi dei comandi

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

fallisce 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

perché l'etichetta dell'unità che è morta non esiste più nel sistema. Ho anche provato i comandi sopra omettendo il percorso dell'etichetta dell'unità senza alcun risultato.

Come posso sostituire il disco "fantasma"?

Risposte:


38

Dopo aver scavato all'infinito questa notte ho finalmente trovato la soluzione. La risposta breve è che è possibile utilizzare i GUID dei dischi (che persistono anche dopo aver disconnesso un'unità) con il zpoolcomando.

Risposta lunga: ho ottenuto il GUID del disco usando il zdbcomando che mi ha dato il seguente output

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:

Il GUID che stavo cercando è quello 15935140517898495532che mi ha permesso di fare

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

e poi

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

Dopo aver completato il resilver, tutto ha funzionato di nuovo bene. Sarebbe stato bello includere queste informazioni, che è possibile utilizzare il GUID di un disco ottenuto tramite zdbil zpoolcomando, con la manpage di zpool.

modificare

Come sottolineato da Durval sotto il zdbcomando potrebbe non produrre nulla. Quindi potresti provare a usare

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

per elencare esplicitamente le informazioni sul dispositivo (anche se manca già dal sistema).


Raffreddare, quindi prima di eseguire aggiungi utilizzando -nswitch, ma anche l' -ginterruttore prenderà anche il uuid in quel modo.
Brian Thomas,

Grazie, mi è stato di grande aiuto mentre frugando sul Web non sono riuscito a trovare informazioni su come ottenere cose raccolte da zdb.
xamox,

Sto cercando da settimane e finalmente questa risposta ha funzionato. Ma gli ID elencati da zpool status(nomi come sdab) NON erano gli stessi dei percorsi in /dev/disk/by-id(nomi ID lunghi e folli). Ma ls -la /dev/disk/by-idrivela che sono tutti collegamenti a, /dev/...quindi ho trovato quello che punta al mio disco UNAVAIL (e successivamente OFFLINE), e sono stato in grado di completare con successo questi passaggi. Ora è resilvering. Grazie!
Matt,

Un modo alternativo più breve per ottenere il GUID è zpool status -gche mostra lo stato utilizzando i GUID per ciascun dispositivo. Inoltre, per @Matt, zpool status -Lmostrerà lo stato utilizzando i nomi dei dispositivi di base anziché i /dev/disk/by-idnomi lunghi .
StarNamer,

Sei un vero MVP che torna con la tua soluzione. Questo ha funzionato per me.
extracrispy

3

Il problema è che i dischi fanno riferimento agli ID e non al dispositivo.

Ecco una soluzione alternativa che dovrebbe funzionare:

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

Modifica: ero in ritardo di 30 secondi ...


Grazie. Stavo cercando di creare un collegamento vuoto all'unità mancante, ma continuava a dire no such device in pool.
Marcus,

Il mio suggerimento è quasi identico a quello che hai fatto. L'unica differenza è il modo di ottenere la guida del dispositivo. Dopo aver creato un collegamento simbolico a / dev / null (che è diverso da un collegamento vuoto) ed esportato / importato il pool, questo appare inzpool status
jlliagre,

Utilizzando questo metodo sono effettivamente riuscito a riportare in linea l'unità "difetto" senza sostituirla (quindi ho saltato offlinee replacepassi). Ho importato il pool una seconda volta dopo aver rimosso il collegamento null. Forse era solo un problema con l'etichetta dell'unità? In effetti, il nome dell'unità è rimasto lo stesso. Successivamente ho fatto uno scrub completo e non sono stati rilevati errori.
Serrano,

2

@Marcus: grazie per aver pubblicato questa eccellente risposta alla tua domanda, mi ha aiutato molto.

L'altro giorno ho trovato un colpo di scena che potrebbe interessarti (e chiunque altro verrà qui a cercare su google in futuro): ho avuto un dispositivo cache che è stato eliminato dal pool (e contrassegnato come "UNAVAIL") a causa di questo stesso errore (ZFS-8000-4J, "l'etichetta è mancante o non valida") e il tentativo di disconnettersi / rimuoverlo / sostituirlo non è riuscito con esattamente lo stesso messaggio "nessun dispositivo del genere nel pool".

MA, quando ho provato ad applicare la tua soluzione, semplicemente "zdb" (senza argomenti) no elencato il dispositivo, tanto meno il suo GUID.

Dopo alcune ricerche, ho scoperto che "zdb -l / dev / DEVICENAME" ha elencato il GUID (prelevandolo direttamente dal dispositivo e non dai record del pool) e utilizzando quel GUID mi ha permesso di fare la sostituzione (in realtà ho fatto un "zpool offline" seguito da "zpool remove" e poi da "zpool add", che ha funzionato perfettamente).


Grazie! Un suggerimento aggiunto nella mia risposta accettata con riferimento al tuo commento.
Marcus,

Per me, ha zdb -l /dev/...sempre mostrato "impossibile decomprimere l'etichetta".
Matt,

0

Ho avuto un problema simile:

L'azionamento non è riuscito in modo tale da non essere più registrato nel BIOS (completamente morto). L' zpool statusindicato che lo era UNAVAILABLE.

Ho messo un altro di capacità simile, e sono riuscito a allocare come nuovo spareche era INUSEe resilvered l'unità. Ma in realtà non faceva parte dello zpool, piuttosto la piscina aveva un ricordo dell'unità mancante, pensando che un giorno sarebbe riapparsa.

La soluzione era innanzitutto eliminare l'unità mancante dallo zpool:

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

Quindi, rilasciare l'unità contrassegnata spare-1 INUSEanche:

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

Una volta fatto questo, sembra che FreeNAS lo abbia capito senza che io debba eseguire un replacecomando, tuttavia se il tuo sistema non lo capisce da solo, il comando seguente dovrebbe sostituire un dispositivo con l'altro:

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

Per esempio:

zpool replace hactar_data /dev/gptid/87410b00-adb0-11e6-9193-00241d738094 /dev/gptid/87410b00-adb0-11e6-9193-00241d
738094
  • I gptidi provenivano dal mio zpool statuscomando.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.