Розгортаючись на відмінну відповідь Марка Хаферкампа, btrfs scrub
читаючи всі дані замість усіх файлів є критичною властивістю і насправді є тим, що робить це настільки корисним. Пам'ятайте, що btrfs має вбудовану підтримку RAID. Скажімо, у вас є файлова система btrfs, що охоплює два диски, налаштовані на використання RAID1. У цьому випадку, коли ви пишете у файл, це записування реплікується на обидва диски. (Це ускладнюється більш складним прикладом, але для цього простого випадку це завжди відбувається.) Однак, коли ви читаєте з цього файлу, прочитане потрапить лише на один диск (тому що це марно прочитати файл двічі якщо тільки перша копія з якихось причин непридатна).
Тепер скажіть, що ваш другий диск btrfs погіршує і почне пошкоджувати дані у вашій файловій системі. Коли ви читаєте блоки з цього диска, btrfs помітить, що контрольна сума не збігається, і відновить блок в діапазоні з відомої хорошої копії - копії на першому диску. Він поверне дані в програму, яка дзвонить read()
(або як би там не було), як ніби нічого не сталося.
Але що робити, якщо btrfs не вирішить читати з другого диска? Пам’ятайте, є дві копії, тому вона може читати з першого чи другого диска. Якщо він читає з першого диска, він не помітить нічого поганого. Єдиний раз, коли він помітить щось не так, - коли перший диск теж деградує. Тепер вам дуже потрібен шланг, оскільки відновити дані вже пізно - копія другого диска була пошкоджена на деякий час, а перша копія (що саме ви використали для відновлення другого диска) також пошкоджена!
Це місце, де btrfs scrub
надходить. Він читає всі дані , а не всі файли. Сюди входять метадані, але також вторинні копії файлів, які зазвичай не знаходяться на шляху читання. Коли він читає ці вторинні копії, це створює можливість для виправлення помилок btrfs, щоб почати та відновити дані із зайвої копії.