Remplacement d'un disque mort dans un zpool


31

J'utilise Ubuntu Server 13.04 64 bits en utilisant ZFS natif. J'ai un zpool composé de 4 disques durs dont l'un est mort hier et n'est plus reconnu par l'OS ou le BIOS.

Malheureusement, je n'ai vu le problème qu'après le prochain redémarrage alors maintenant l'étiquette du lecteur est manquante et je ne peux pas remplacer le disque en utilisant les instructions officielles ici et ici .

zpool status hermes -x

impressions

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

J'ai déjà remplacé le lecteur par un nouveau (qui a obtenu l'étiquette /dev/disk/by-id/ata-ST3500320AS_9QM03ATQ)

N'importe laquelle des commandes

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

échoue avec

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

car l'étiquette du lecteur mort n'existe plus dans le système. J'ai également essayé les commandes ci-dessus en omettant le chemin vers l'étiquette du lecteur en vain.

Comment remplacer le disque "fantôme"?

Réponses:


38

Après avoir creusé sans fin cette nuit, j'ai finalement trouvé la solution. La réponse courte est que vous pouvez utiliser les GUID des disques (qui persistent même après la déconnexion d'un lecteur) avec la zpoolcommande.

Réponse longue: j'ai obtenu le GUID du disque en utilisant la zdbcommande qui m'a donné la sortie suivante

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:

Le GUID que je recherchais 15935140517898495532m'a permis de faire

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

et alors

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

Une fois la réargenture terminée, tout a de nouveau bien fonctionné. Il aurait été bien d'inclure ces informations, que vous pouvez utiliser le GUID d'un disque obtenu via zdbla zpoolcommande, avec la page de manuel de zpool.

modifier

Comme indiqué par durval ci-dessous, la zdbcommande peut ne rien produire. Ensuite, vous pouvez essayer d'utiliser

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

pour répertorier explicitement les informations sur le périphérique (même si elles sont déjà absentes du système).


Cool, puis avant d'exécuter, ajoutez en utilisant le -ncommutateur, mais le -gcommutateur saisira également l'uuid de cette façon.
Brian Thomas

Merci, cela a été très utile car je fouinais sur le Web, je n'ai pas pu trouver d'informations pour obtenir des informations glanées sur zdb.
xamox

Je cherche depuis des semaines et finalement cette réponse a fait l'affaire. Mais les identifiants répertoriés par zpool status(noms comme sdab) n'étaient PAS les mêmes que les chemins d'accès /dev/disk/by-id(noms d'ID longs et fous). Mais ls -la /dev/disk/by-idrévèle qu'ils sont tous des liens vers /dev/..., j'ai donc trouvé celui pointant vers mon disque UNAVAIL (et par la suite OFFLINE), et j'ai pu terminer ces étapes avec succès. Il est en train de resilver. Merci!
Matt

Une autre manière plus courte d'obtenir le GUID est d'afficher zpool status -gl'état à l'aide des GUID pour chaque périphérique. En outre, pour @Matt, zpool status -Laffichera l'état en utilisant les noms de base des appareils au lieu des /dev/disk/by-idnoms longs .
StarNamer

Vous êtes un vrai MVP qui revient avec votre solution. Cela a fonctionné pour moi.
extracrispy

3

Le problème est que les disques sont référencés par des ID et non par des périphériques.

Voici une solution de contournement qui devrait fonctionner:

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

Edit: j'avais 30 secondes de retard ...


Merci. J'essayais de créer un lien vide vers le disque manquant mais ça n'arrêtait pas de le dire no such device in pool.
Marcus

Ma suggestion est presque identique à ce que vous avez fait. La seule différence est la façon d'obtenir le guide de l'appareil. Après avoir créé un lien symbolique vers / dev / null (qui est différent d'un lien vide) et exporté / importé le pool, il apparaît danszpool status
jlliagre

En utilisant cette méthode que j'ai réussi à récupérer le lecteur « défaut » en ligne sans le remplacer (donc je sauté offlineet replaceétapes). J'ai importé le pool une deuxième fois après avoir supprimé le lien nul. Peut-être que c'était juste un problème avec l'étiquette du lecteur? En fait, le nom du lecteur est resté le même. J'ai ensuite fait un gommage complet et aucune erreur n'a été trouvée.
Serrano

2

@Marcus: Merci d'avoir posté cette excellente réponse à votre propre question, cela m'a beaucoup aidé.

L'autre jour, j'ai trouvé une torsion qui pourrait vous intéresser (et toute autre personne qui viendra ici googler à l'avenir): j'ai eu un périphérique de cache qui a été supprimé du pool (et marqué comme "NON DISPONIBLE") en raison de cette même erreur (ZFS-8000-4J, "l'étiquette est manquante ou non valide"), et la tentative de connexion / suppression / remplacement hors ligne a échoué avec exactement le même message "aucun périphérique de ce type dans le pool".

MAIS, lorsque j'ai essayé d'appliquer votre solution, le simple "zdb" (sans argument) n'a pas répertorié le périphérique, encore moins son GUID.

Après quelques recherches, j'ai trouvé que "zdb -l / dev / DEVICENAME" répertoriait le GUID (en le prenant directement à partir du périphérique, et non à partir des enregistrements du pool), et l'utilisation de ce GUID m'a permis de faire le remplacement (en fait, j'ai fait un "zpool offline" suivi d'un "zpool remove" puis d'un "zpool add", qui a parfaitement fonctionné).


Merci! Un ajout d'un indice dans ma propre réponse acceptée avec une référence à votre commentaire.
Marcus

Pour moi, zdb -l /dev/...toujours montré "échoué à déballer l'étiquette".
Matt

0

J'ai eu un problème similaire:

Le lecteur a échoué de telle manière qu'il ne s'est plus enregistré dans le BIOS (totalement mort). Ils ont zpool statusindiqué que c'était le cas UNAVAILABLE.

J'ai mis un disque de capacité similaire, et j'ai réussi à l'allouer comme un nouveau sparequi était INUSEet à refaire le disque. Mais, il ne faisait pas réellement partie du zpool, plutôt que le pool avait une mémoire du lecteur manquant, pensant qu'il réapparaîtrait un jour.

La solution consistait d'abord à supprimer le lecteur manquant du zpool:

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

Ensuite, déposez le lecteur marqué spare-1 INUSEégalement:

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

Une fois que j'ai fait cela, il semble que FreeNAS l'a compris sans que je doive exécuter une replacecommande, mais si votre système ne le comprend pas lui-même, la commande suivante devrait remplacer un périphérique par l'autre:

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

Par exemple:

zpool replace hactar_data /dev/gptid/87410b00-adb0-11e6-9193-00241d738094 /dev/gptid/87410b00-adb0-11e6-9193-00241d
738094
  • Les gptides sont venus de mon zpool statuscommandement.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.