web-dev-qa-db-fra.com

Remplacement d'un disque mort dans un zpool

J'utilise Ubuntu Server 13.04 64 bits avec ZFS natif. J'ai un zpool composé de 4 disques durs dont un est mort hier et maintenant n'est plus reconnu par le système d'exploitation ou le BIOS.

Malheureusement, je n'ai vu le problème qu'après le prochain redémarrage. Le libellé du lecteur est donc manquant et je ne peux pas remplacer le disque à l'aide des instructions officielles ici et ici .

zpool status hermes -x

empreintes

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 (portant 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

parce que l’étiquette du lecteur qui est mort n’existe plus dans le système. J’ai également essayé les commandes ci-dessus en omettant le chemin d'accès à l'étiquette du lecteur sans résultat.

Comment puis-je remplacer le disque "fantôme"?

31
Marcus

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 commande zpoolname__.

Réponse longue: j'ai obtenu le GUID du disque à l'aide de la commande zdbqui 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 cherchais est 15935140517898495532, ce qui m'a permis de le 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ésilience terminée, tout a bien fonctionné. Il aurait été agréable d'inclure cette information, à savoir que vous pouvez utiliser le GUID d'un disque obtenu via zdbavec la commande zpoolname__, avec la page de manuel de zpool.

Éditer

Comme indiqué par durval sous la commande zdbname__, il se peut que rien ne soit généré. Ensuite, vous pouvez essayer d'utiliser

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

pour lister explicitement les informations sur le périphérique (même s'il manque déjà du système).

38
Marcus

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

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 ...

3
jlliagre

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

L’autre jour, j’ai trouvé un tournant qui pourrait vous intéresser (et tous les autres qui viennent ici pour googler à l’avenir): j’ai eu un périphérique de cache qui a été retiré de la piscine (et marqué "UNAVAIL") en raison de cette même erreur (ZFS-8000-4J, "l’étiquette est manquante ou invalide") et l’essai de déconnecter/supprimer/remplacer 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, "zdb" (sans arguments) ne ne répertoriait pas le périphérique, encore moins son GUID.

Après quelques recherches, j’ai trouvé que "zdb -l/dev/DEVICENAME" répertoriait le GUID (le prenant directement à partir du périphérique et non des enregistrements de pool), et l’utilisant ainsi 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", ce qui a parfaitement fonctionné).

2
durval

J'ai eu un problème similaire:

Le lecteur a échoué de telle sorte qu'il ne soit plus enregistré dans le BIOS (totalement mort). Le zpool status indique qu'il s'agit de UNAVAILABLEname__.

J'ai mis un lecteur de capacité similaire, et j'ai réussi à l'attribuer en tant que nouveau sparequi était INUSEet a reconverti le lecteur. Mais, cela ne faisait pas vraiment partie du zpool, mais le pool avait en mémoire le lecteur manquant, pensant qu'il réapparaîtrait un jour.

La solution était d'abord déposez le disque manquant depuis zpool:

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

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

[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'ait découvert sans que je doive faire une commande replacename__, cependant si votre système ne le découvre pas lui-même, la commande suivante devrait remplacer un périphérique par un 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 gptids proviennent de ma commande zpool status.
0
Frood