Как работает btrfs scrub и что он делает?

19

Что именно делает скраб btrfs? Согласно странице руководства, которая совершенно неясна, она выполняет некоторую проверку ошибок. Что за проверка ошибок? Насколько это надежно? Это может восстановить некоторые ошибки? Как это работает? Работает ли он на каждом диске btrfs?

Petr
источник
3
Контекст: BTRFS хранит контрольные суммы, поэтому всегда может определить, в порядке ли файл (или метаданные) или он был поврежден. Почти все другие файловые системы, такие как ext4, не имеют контрольных сумм, поэтому они не помешают вам прочитать файл, который был поврежден из-за неисправного диска (который вот-вот умрет и уже начал повреждать данные). Это важная функция защиты данных в BTRFS, которая делает возможной очистку.
basic6

Ответы:

23

Я не знаю, делает ли он что-нибудь еще, но я знаю, что как минимум, btrfs scrubвыполняется очистка данных на полном диске. По сути, он считывает все данные * на диске, пересчитывает свою контрольную сумму и сравнивает пересчитанную контрольную сумму с сохраненной. Когда сохраненные и пересчитанные контрольные суммы не совпадают, система знает, что существует повреждение.

После обнаружения повреждения поведение зависит от настроек вашего диска. Например, если у вас есть RAID 1 (зеркальное отображение), вы btrfs scrubможете исправить поврежденные данные, скопировав не поврежденную версию с другого диска. Если все копии некоторых данных повреждены (например, повреждение нескольких дисков или, во-первых, отсутствие избыточных копий), то мало что btrfs scrubможно сделать, кроме как предупредить вас.

Это важно по той причине, что жесткие диски надежны на чтение и запись только на 99.999999999999%. Таким образом, каждые несколько терабайт данных ввода-вывода, вероятно, будет ошибка. Хотя ошибки могут быть и обнаруживаются (и исправляются, предполагая, что избыточная копия все еще действительна) во время обычного доступа к диску, обычная полная очистка диска может находить и исправлять ошибки до того, как накопится достаточное количество данных, что все копии одних и тех же данных будут повреждены.

* Я использую «данные» вместо «файл», чтобы включить метаданные. Btrfs хранит файлы и соответствующие метаданные (включая контрольные суммы) в блоках данных, все из которых проверяются и проверяются btrfs scrub.

Смотрите также:

Марк Хаферкамп
источник
Я не считал, но я готов предположить, что ваша достоверность на несколько порядков ниже. Потребительские жесткие диски обычно рассчитаны на скорость UBE 10 ^ -14 бит. Другими словами, одна неисправимая ошибка чтения на 10 ^ 14 бит чтения. Проблема в том, что это для полного сектора; вы либо получаете полный сектор, либо вообще ничего не получаете (или это идея; молчаливые ошибки - это еще одна чашка чая). Таким образом, ошибка усугубляется размером сектора, который для дисков расширенного формата составляет 32 768 бит. Следовательно, реальная частота ошибок больше похожа на ошибки от 10 ^ -10 до 10 -11 ^ readbit.
CVN
@ MichaelKjörling Я не думаю, что сектора имеют значение здесь .... У меня есть записи о последних 29 btrfs скрабы двух внутренних жестких дисков моего компьютера 1TB. Объем данных варьировался от 270 до 300 ГиБ (в общей сложности от 1,35 * 10 ^ 14 до 1,49 * 10 ^ 14 бит, считанных для всех скрабов, вместе взятых). Во время этих скрабов было найдено 3 ошибки. Если предположить, что ввод-вывод без очистки не вызвал и не зафиксировал гниение битов, то это всего лишь в 2–2 раза превышает ожидаемую частоту появления ошибок на дисках с надежностью 99,9999999999999%. Даже с только 4096-битными секторами, я думаю, ваш аргумент предполагает, что на моих дисках уже будут тысячи ошибок.
Марк Хаферкамп
@ MichaelKjörling Насколько я понимаю, спецификации производителя (Seagate и WD), это битовые ошибки, а не целые сектора, которые умирают. И число девяток в ответе даже оптимистично: 100-1/10^14имеет 16 девяток, а у поста только 14 (что соответствует 10 ^ 12).
Люк
@Luc Хорошо, если смерть сектора встречается реже; Умирающие сектора означают, что диск (возможно) действительно выходит из строя и может нуждаться в замене Битовые ошибки просто приводят к тихому повреждению данных, которое может быть достаточно шумным для восстановления из резервных копий. Примечание по математике: Фактический расчет - это то 1-10^n, что затем конвертируется в проценты, потому что людям не нравятся десятичные дроби. Кроме того, я не упомянул в своем предыдущем комментарии, что диски находятся в RAID 1 (следовательно, на каждом из них находятся те же данные по 270-300 ГБ), что исправляет еще одну очевидную ошибку вычисления.
Марк Хаферкамп
5

В продолжение превосходного ответа Марка Хаферкампа, btrfs scrubчтение всех данных, а не всех файлов, является критически важным свойством и фактически делает его таким полезным. Помните, что btrfs имеет встроенную поддержку RAID. Допустим, у вас есть файловая система btrfs, охватывающая два диска, которые вы настроили для использования RAID1. В этом случае при записи в файл эта запись реплицируется на оба диска. (С более сложным примером все усложняется, но в этом простом случае это всегда так.) Однако, когда вы читаете из этого файла, чтение попадет только на один диск (потому что чтение файла дважды если только первая копия не может быть использована по какой-либо причине).

Теперь скажите, что ваш второй диск btrfs ухудшается и начинает повреждать данные в вашей файловой системе. Когда вы читаете блоки с этого диска, btrfs заметит, что контрольная сумма не совпадает, и восстановит внутреннюю полосу из заведомо исправной копии - копии на первом диске. Он вернет данные в приложение, вызывающее read()(или что-то еще), как будто ничего не произошло.

Но что, если btrfs не решит читать со второго диска? Помните, что есть две копии, поэтому он может читать с первого или второго диска. Если он читает с первого диска, он не заметит ничего плохого. Единственный раз, когда он заметит, что что-то не так, это когда первый диск тоже деградирует. Теперь вы действительно в восторге, так как уже слишком поздно восстанавливать данные - копия второго диска некоторое время была повреждена, а первая копия (то, что вы использовали бы для восстановления второго диска) теперь тоже повреждена!

Вот где btrfs scrubприходит. Он читает все данные , а не все файлы. Это включает в себя метаданные, а также вторичные копии файлов, которые обычно не находятся в пути чтения. Когда он читает эти вторичные копии, это дает возможность внутриполосному исправлению ошибок btrfs включить и восстановить данные из избыточной копии.

strugee
источник
2
Вы уверены, что в RAID1 чтение осуществляется только с 1 диска? По крайней мере с mdadm RAID это не должно быть так. Чтение должно происходить параллельно с обоих дисков, но с разных данных, то есть это должно быть в два раза быстрее, чем чтение с одного диска. Повышение производительности чтения - одна из главных особенностей RAID 1.
Петр
@ Петр да, ты прав. отдельные блоки читаются только с одного диска.
Стружец
@Petr: Для уточнения, - при нормальном использовании ни MDADM, ни BTRFS не читают обе копии одних и тех же данных с обоих дисков. Они читают только одну копию. - MDADM может балансировать нагрузку и распределять чтение по копиям, чтобы получить вдвое большую скорость чтения. (потому что все копии A идут на диск 1, а все копии B идут на диск 2. Поскольку mdadm будет использовать ровно 2 диска). - BTRFS имеет больше трудностей. (потому что копии A и B будут помещаться на те диски, на которых 2 (из 2 или более ) оказались наиболее свободными в данный момент - т.е. 2 копии будут случайным образом распределены среди всех существующих дисков)
DrYak
и в отношении безопасности: - и MDADM, и BTRFS попробуют другую копию в случае возникновения проблемы. - для MDADM единственная проблема, которую он может обнаружить, это «диск не отвечает» (поскольку он не имеет никакого представления о файлах, хранящихся выше) - для BTRFS он может дополнительно обнаруживать повреждение данных в режиме без вывода сообщений (поскольку данные проверяются, и поэтому уровень RAID в BTRFS знает, можно ли доверять одной копии или нужно получить другую копию)
DrYak
И последнее, но не менее важное в отношении RAID5 / 6: - в MDADM это просто работает . (Но не будет обнаруживать повреждения без вывода сообщений) - в BTRFS пока не обрабатываются нарушения вывода без вывода сообщений (поскольку проще просто извлечь другую копию (в RAID1), а не выполнять вычисления Erasure Coding, чтобы угадать, какой элемент полосы поврежден и следует восстановить из оставшихся данных / четности). Другими словами: с сегодняшнего дня (август 2017 г.) не используйте btrfs RAID5 / 6.
DrYak