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"?
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 zpool
name__.
Réponse longue: j'ai obtenu le GUID du disque à l'aide de la commande zdb
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 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 zdb
avec la commande zpool
name__, avec la page de manuel de zpool.
Éditer
Comme indiqué par durval sous la commande zdb
name__, 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).
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 ...
@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é).
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 UNAVAILABLE
name__.
J'ai mis un lecteur de capacité similaire, et j'ai réussi à l'attribuer en tant que nouveau spare
qui était INUSE
et 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 replace
name__, 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
zpool status
.