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

31

Я использую Ubuntu Server 13.04 64-bit, используя нативную 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

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

Как заменить диск-призрак?

Маркус
источник

Ответы:

38

После бесконечной копки этой ночью я наконец нашел решение. Краткий ответ: с помощью команды вы можете использовать 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>

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

Маркус
источник
Охладите, затем перед запуском добавьте с помощью -nпереключателя, но также и -gпереключатель получит uuid таким же образом.
Брайан Томас
Спасибо, что это было очень полезно, так как я не мог найти информацию о том, как почерпнуть материал из zdb.
xamox
Я искал недели и, наконец, этот ответ добился цели. Но идентификаторы, перечисленные zpool status(такие имена, как sdab), НЕ совпадали с путями в /dev/disk/by-id(сумасшедшие длинные имена идентификаторов). Но ls -la /dev/disk/by-idобнаруживает, что все они являются ссылками, /dev/...поэтому я нашел ту, которая указывает на мой диск UNAVAIL (и впоследствии в автономном режиме), и я смог успешно выполнить эти шаги. Это теперь снова и снова. Спасибо!
Мэтт
Альтернативный более короткий способ получить GUID - zpool status -gпоказать состояние, используя GUID для каждого устройства. Кроме того, для @Matt zpool status -Lбудет отображаться состояние с использованием основных имен устройств вместо длинных /dev/disk/by-idимен.
StarNamer
Вы настоящий MVP, возвращающийся с вашим решением. Это сработало для меня.
экстравагантный
3

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

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

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 секунд ...

jlliagre
источник
Спасибо. Я пытался создать пустую ссылку на отсутствующий диск, но он продолжал говорить no such device in pool.
Маркус
Мое предложение почти идентично тому, что вы сделали. Разница лишь в том, как получить руководство по устройству. После создания символической ссылки на / dev / null (которая отличается от пустой ссылки) и экспорта / импорта пула она появляется вzpool status
jlliagre
Используя этот метод, мне действительно удалось вернуть «неисправный» диск в оперативный режим без его замены (поэтому я пропустил offlineи replaceпошагово). Я импортировал пул во второй раз после удаления нулевой ссылки. Может быть, это просто проблема с этикеткой диска? На самом деле название диска осталось прежним. Я сделал полный скраб после этого, и никаких ошибок не было найдено.
Серрано
2

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

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

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

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

Durval
источник
Благодарность! Добавил подсказку в мой собственный принятый ответ со ссылкой на ваш комментарий.
Маркус
Для меня zdb -l /dev/...всегда показывали «не удалось распаковать ярлык».
Мэтт
0

У меня была похожая проблема:

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

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

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

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

Затем опустите диск, отмеченный 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
  • Гптиды пришли из моего zpool status команды.
Frood
источник