Назад | Перейти на главную страницу

Ошибка контрольной суммы zfs в raidz1 vdev, но не на диске

Я выполняю резервное копирование данных, хранящихся в zpool, состоящем из одного raidz vdev с двумя жесткими дисками. Во время этой операции у меня были ошибки контрольной суммы, и теперь статус выглядит следующим образом:

  pool: tmp_zpool
 state: ONLINE
status: One or more devices has experienced an error resulting in data
    corruption.  Applications may be affected.
action: Restore the file in question if possible.  Otherwise restore the
    entire pool from backup.
   see: http://zfsonlinux.org/msg/ZFS-8000-8A
  scan: none requested
config:

    NAME                  STATE     READ WRITE CKSUM
    tmp_zpool             ONLINE       0     0     2
      raidz1-0            ONLINE       0     0     4
        tmp_cont_0        ONLINE       0     0     0
        tmp_cont_1        ONLINE       0     0     0

errors: Permanent errors have been detected in the following files:

        /some/file

Что меня сбивает с толку, так это то, что ошибка контрольной суммы появляется на уровне vdev, но не на уровне диска. Пожалуй, стоит отметить, что один из жестких дисков внутренний, а другой внешний (это временная ситуация). Может ли это быть проблемой контроллеров жестких дисков?

Могу я что-нибудь сделать, чтобы вернуть поврежденный файл? Например, очистить ошибку и импортировать деградировать vdev только с одним из дисков? Я даже не пытался снова прочитать файл, чтобы посмотреть, что происходит. (Не уверен, что это повлияет на что-нибудь.)

Обновить: Я отказался от ожидания объяснения того, что может пойти не так, если я устраню ошибки и попытаюсь повторить попытку, поэтому я пошел дальше и попробовал. Я сначала сделал zpool clear, затем zpool status ошибок не обнаружил. Затем я попытался прочитать файлы с ошибками (2 из них в итоге), но соответствующие блоки по-прежнему сообщались как плохие / нечитаемые. В это время, zpool status больше не показывал возрастающих ошибок контрольной суммы. Затем я попытался отключить один из дисков в raidz1 vdev и повторить процесс, но результаты не изменились. Всего я потерял 2 блока по 128К из 1,6Т.

Статус ответа: В настоящее время я не нахожу исчерпывающего ответа на этот вопрос. Если кто-то хочет написать или отредактировать существующий, обратитесь по следующему адресу:

  1. Что могло быть причиной такой ситуации.
  2. Что с этим можно было сделать.
  3. Как это можно было предотвратить.

Для 1 теории и их проблемы выглядят так:

Для 2:

Для 3:

Это проблема raidz1 (а также RAID5). Если данные на диске изменяются, но сбой диска не происходит, чтобы ZFS или RAID-контроллер узнал, какой диск вызвал ошибку, он не может узнать, какой диск правильный. С raidz2 (и выше) или RAID6 вы получаете кворум дисков, которые могут решить, какой из дисков игнорировать для восстановления.

Единственное решение здесь - перезаписать файл, восстановив резервную копию или записав /dev/null в файл.

У меня похожая проблема. Я не уверен, что это полезно, но я нашел этот соответствующий пост об ошибках контрольной суммы на уровне vdev от разработчика FreeBSD.

https://lists.freebsd.org/pipermail/freebsd-hackers/2014-October/046330.html

Ошибки контрольной суммы появятся в raidz vdev вместо листа, если vdev_raidz.c не может определить, какой лист vdev был ответственным. Это могло произойти, если два или более конечных vdev возвращают неверные данные для одного и того же блока, что также может привести к неисправимым ошибкам данных. Я вижу, что у вас есть неустранимые ошибки данных, так что, возможно, именно это и случилось с вами.

Незначительные ошибки дизайна в ZFS также могут привести к тому, что vdev_raidz.c не сможет определить, какой дочерний элемент был ответственен за ошибку контрольной суммы. Однако я видел это только тогда, когда у raidz vdev был зеркальный ребенок. Это может произойти только в том случае, если дочерний элемент является запасным или заменяющим vdev. Вы активировали какие-либо запчасти или вручную заменяли vdev?

Я сам подумываю удалить свой zpool.cache файл и импорт моего пула для регенерации этого zpool.cache файл.