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