16

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

2 ответа2

23

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

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

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

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

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

5

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .