Как известно, жесткие диски — штука шаткая. Особенно верно это в малом пользовательском классе, в котором и не мечтают о надежности, скажем, серверного оборудования. Однако отказы милых нашему сердцу железок в самый неподходящий для этого момент могут даже домашнему пользователю доставить очень много неприятных минут, часов или даже дней (об одном таком случае я недавно рассказывал, в резюмирующих строках статьи, к сожалении, не выразить, сколько времени было убито на борьбу с неверным оборудованием). Столкнувшись с задачей максимально быстро выяснить, в какой участок едва живого внешнего жесткого диска емкостью 160 Гб. воткнуть раздел размером хотя бы 10 и быть в нем более-менее уверенным, я с удивлением обнаружил, что, по крайней мере оставаясь верным операционным системам симейства Linux, сделать это существующими средствами не получится. Как пришлось выкручиваться — добро пожаловать под кат.
Что есть
Выяснилось, что на вооружении линуксоида для проверки на наличие ошибок и их корректировки существующих разделов ext2/ext3/ext4 стоит замечательная утилита e2fsck. Важное ее свойство — способность интегрироваться с другой утилитой — badblocks — и таким образом битые блоки диска и помечать их так, чтобы впоследствии они не использовались (активируется эта возможность с помощью ключа -c). Для проверки поверхности диска еще не имеющего файловых систем можно воспользоваться такой же интеграцией с badblocks утилиты mk2fs для создания файловых систем, запустив с тем же ключом. В описанных случаях по умолчанию запускается режим проверки read-only, в котором badblocks, что ясно, пытается делать выводы о работоспособности блоков диска только по операциям чтения. Удвоив в основных утилитах ключ -с (или используя ключ -n при прямом запуске badblocks), можно осуществить проверку в безопасном режиме чтения-записи, который не повредит ваши данные. Только вот работает он на порядок (если не более) дольше и сильно подвисает, как и основной режим, при столкновении с сильно поврежденными областями диска. Опасным методом ускорения проверки в режими чтения-записи может послужить явный запуск badblocks с ключом -w (разрушающий данные метод read-write проверки) и перенаправление его вывода (через поток или файл) утилитам mk2fs или e2fsck, безопасным — просьба прерывать проверку при большом числе ошибок (ключ -e n) — но вместо того, чтобы обойти битый участок с занесением его координат в лог, badblocks в этом случае просто прекращает работу. Вот имено это поведение и хочется исправить.
Чего хочется
А хочется, чтобы существовала утилита, которая шустро пробегает по диску, анализируя его адаптивным образом, и говорит пользователю, что такая-то и такая-то его часть безнадежны, а вот тут-то и там-то можно попробовать создать раздел и полномасштабно его проверить, рассчитывая, что во-первых время будет потрачено не впустую, а во-вторых вы действительно таким образом сделали все или почти все возможное в условиях спешки, чтобы относительно безопасно разместить ваши данные. Для начала можно попробовать создать надстройку над badblocks, которая позволит, пока на правах экспериментального исследования, гибко менять режим работы расширения badblocks, суть которого — пропуск сильноповрежденных участков и общее ускоренное тестирование за счет «нарезки» диска на куски и проверки в каждом куске лишь части блоков — это позволит с некоторой наперед заданной точностью (± n-мегабайт, например) находить подозрительные на непрерывную на протяжении m-мегабайт неповрежденность части диска, чтобы затем, как вариант, исследовать их плотнее и не тратить время на сильно фрагментированные повреждениями части диска.
Прототип (вполне рабочий, мою конкретную задачу с внешним диском он решил) можно найти в git-репозитории goodranges. Основная задача этой статьи — почерпнуть у сообщества идеи и замечания по поводу развития этого прототипа в действующую утилиту. Любые комментарии в любой удобной вам форме приветствуются, как и пулл риквесты.
Разумеется, прототип экспериментальный во всех отношениях и работы над ним — непочатый край, так что прошу не сильно бить тапками за стиль и архитектурные решения.
P.S. Названные в статье утилиты имеют исчерпывающие по содержанию man-страницы. Приятного чтения
Автор: ramntry