Я не могу найти способ сказать mdadm исправить этот конкретный кусок.
Это происходит потому, что когда происходит молчаливое повреждение данных, у md недостаточно информации, чтобы узнать, какой блок молча поврежден.
Я предлагаю вам прочитать мой ответ на вопрос № 4 («Почему по- md
прежнему используется устройство с недействительными данными?»), Который объясняет это более подробно.
Что еще хуже для предложенного макета, если блок контроля четности страдает от повреждения данных без вывода сообщений, слой Btrfs выше не может его увидеть! Если диск с соответствующим блоком данных выходит из строя и вы пытаетесь заменить его, md будет использовать поврежденную четность и необратимо испортить ваши данные. Только когда этот диск выйдет из строя, Btrfs распознает повреждение, но вы уже потеряли данные.
Это потому, что md не читает из блоков четности, если массив не ухудшен.
Так есть ли способ заставить mdadm восстановить один чанк (который не является четным) и, возможно, даже пометить сектор диска как плохой? Может быть, создание ошибки чтения IO?
Для плохих секторов, которые сам жесткий диск определил, md может легко справиться с этим, потому что плохой сектор идентифицирован для md.
С технической точки зрения вы можете создать плохой сектор hdparm --make-bad-sector
, но как узнать, на каком диске находится блок, на который повлияло тихое повреждение данных?
Рассмотрим этот упрощенный пример:
Формула паритета: PARITY = DATA_1 + DATA_2
+--------+--------+--------+ | DATA_1 | DATA_2 | PARITY | +--------+--------+--------+ | 1 | 1 | 2 | # OK +--------+--------+--------+
Теперь давайте молча испортим каждый из блоков со значением 3
:
+--------+--------+--------+ | DATA_1 | DATA_2 | PARITY | +--------+--------+--------+ | 3 | 1 | 2 | # Integrity failed – Expected: PARITY = 4 | 1 | 3 | 2 | # Integrity failed – Expected: PARITY = 4 | 1 | 1 | 3 | # Integrity failed – Expected: PARITY = 2 +--------+--------+--------+
Если бы у вас не было первой таблицы для просмотра, как бы вы узнали, какой блок был поврежден?
Вы не можете знать наверняка.
Вот почему Btrfs и ZFS блокируют контрольную сумму. Это занимает немного больше места на диске, но эта дополнительная информация позволяет системе хранения определить, какой блок лежит.
Из статьи Джеффа Бонвика в блоге «RAID-Z» :
Всякий раз, когда вы читаете блок RAID-Z, ZFS сравнивает его с контрольной суммой. Если диски с данными не вернули правильный ответ, ZFS считывает четность, а затем выполняет комбинаторную реконструкцию, чтобы выяснить, какой диск вернул неверные данные.
Чтобы сделать это с Btrfs на md, вам нужно будет попытаться пересчитать каждый блок до совпадения контрольной суммы в Btrfs, трудоемкий процесс без простого интерфейса, предоставляемого пользователю / скрипту.
Я знаю, что ZFS может делать все это самостоятельно, но я не хочу использовать память ECC
Ни ZFS, ни Btrfs над md не зависят и даже не знают о памяти ECC. Память ECC обнаруживает только незаметное повреждение данных в памяти, поэтому она не зависит от системы хранения.
Я рекомендовал ZFS поверх Btrfs для RAID-5 и RAID-6 (аналог ZFS RAID-Z и RAID-Z2 соответственно), прежде чем в Btrfs over mdadm raid6? и сбой устройства в md RAID, когда ATA перестает отвечать на запросы, но я хотел бы воспользоваться этой возможностью, чтобы наметить еще несколько преимуществ ZFS:
- Когда ZFS обнаруживает молчаливое повреждение данных, оно автоматически и немедленно исправляется на месте без какого-либо вмешательства человека.
- Если вам нужно перестроить весь диск, ZFS будет только «восстанавливать» фактические данные, а не работать без необходимости на всем блочном устройстве.
- ZFS - это комплексное решение для логических томов и файловых систем, что делает его менее сложным в управлении, чем Btrfs поверх md.
- RAID-Z и RAID-Z2 надежны и стабильны, в отличие от
- Btrfs на md RAID-5 / RAID-6, который предлагает обнаружение ошибок только в незаметно поврежденных блоках данных (плюс незаметно поврежденные блоки четности могут остаться незамеченными, пока не станет слишком поздно), и нет простого способа исправления ошибок, и
- Btrfs RAID-5 / RAID-6, в котором « имеется множество серьезных ошибок потери данных ».
- Если бы я молча повредил весь диск с помощью ZFS RAID-Z2, я бы вообще не потерял данные, тогда как на md RAID-6 я фактически потерял 455 681 inode .