Замена мертвого диска в zpool

Я запускаю 64-битный Ubuntu Server 13.04 с использованием собственного ZFS. У меня есть zpool, состоящий из 4 жестких дисков, из которых один умер вчера, и теперь он больше не распознается ОС или BIOS.

К сожалению, я видел проблему только после следующей перезагрузки, поэтому теперь отсутствует метка диска, и я не могу заменить диск, используя официальные инструкции здесь и здесь .

zpool status hermes -x 

печать

 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 

Я уже заменил диск новым (который получил метку /dev/disk/by-id/ata-ST3500320AS_9QM03ATQ )

Любая из команд

 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 

с

 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 

потому что ярлык диска, который умер, больше не существует в системе. Я также пробовал команды выше, опуская путь к метке диска, безрезультатно.

Как я могу заменить диск «призрак»?

После долгой рытья этой ночью я наконец нашел решение. Короткий ответ заключается в том, что вы можете использовать GUID дисков (которые сохраняются даже после отсоединения диска) с помощью команды zpool .

Длинный ответ: я получил идентификатор GUID диска, используя команду zdb которая дала мне следующий вывод

 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: 

GUID, который я искал, – это 15935140517898495532 что позволило мне сделать

 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 

а потом

 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 

После того, как было выполнено восстановление, все прошло хорошо. Было бы неплохо включить эту информацию, чтобы вы могли использовать GUID диска, полученный через zdb с помощью команды zpool , с man-страницей zpool.

редактировать

Как указано durval ниже команды zdb может ничего не выводить. Затем вы можете попытаться использовать

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

для явного перечня информации об устройстве (даже если он уже отсутствует в системе).

Проблема заключается в том, что диски ссылаются на идентификаторы, а не на устройство.

Вот обходной путь, который должен работать:

 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 

Редактировать: я опоздал на 30 секунд …

@Marcus: Спасибо, что опубликовали этот отличный ответ на свой вопрос, это очень помогло мне.

На днях я нашел поворот, который мог бы вас заинтересовать (и кто-нибудь еще, что приходит сюда в будущем): у меня было устройство кэширования, которое было удалено из пула (и отмечено как «UNAVAIL») из-за этой же ошибки (ZFS-8000-4J, «метка отсутствует или недействительна»), и попытка отключить / удалить / заменить его не удалось с помощью того же сообщения «нет такого устройства в пуле».

НО, когда я попытался применить ваше решение, простой «zdb» (без аргументов) не отобразил устройство, а тем более его GUID.

После некоторого копания я обнаружил, что «zdb -l / dev / DEVICENAME» перечисляет GUID (беря его непосредственно с устройства, а не из записей пула), и использование этого GUID позволило мне сделать замену (на самом деле я сделал «zpool offline», а затем «zpool remove», а затем «zpool add», который отлично работал).

У меня была аналогичная проблема:

Диск не удалось таким образом, что он больше не регистрировался в BIOS (полностью мертв). zpool status указывал, что он UNAVAILABLE .

Я поместил диск с аналогичной емкостью, и мне удалось выделить его как новый spare который был INUSE и resilvered the drive. Но на самом деле это не было частью zpool, а в пуле была память о пропавшем диске, и он думал, что когда-нибудь появится снова.

Решение состояло в том, чтобы сначала удалить отсутствующий диск из zpool:

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

Затем spare-1 INUSE диск, отмеченный как spare-1 INUSE также:

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

Как только я это сделал, похоже, что FreeNAS выяснил это без меня, чтобы выполнить команду replace , однако, если ваша система сама не понимает, следующая команда должна заменить одно устройство другим:

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

Например:

 zpool replace hactar_data /dev/gptid/87410b00-adb0-11e6-9193-00241d738094 /dev/gptid/87410b00-adb0-11e6-9193-00241d 738094 
  • Gptids пришли из моей команды zpool status .