Чаще всего суперблок неустойчивых ФС содержит флаг
flirty ("грязный"), сигнализирующий о том, что ФС, возможно,
нуждается в восстановлении. Этот флаг сбрасывается при нормальном размонтировании
ФС и устанавливается при ее монтировании или при первой модификации после
монтирования. Таким образом, если ОС погибла, не успев размонтировать
свои дисковые тома, после перезагрузки на этих томах dirty-флаг будет
установлен, что и станет сигналом необходимости починки.
Восстановление состоит в том, что система проверяет пространство, выделенное
всем файлам. При этом должны выполняться следующие требования.
Практически все ФС при выделении блока сначала удаляют его из списка свободных и лишь потом отдают файлу, поэтому при "обычных" сбоях перекрещивание файлов возникнуть может только как следствие отложенной записи в сочетании с сортировкой запросов. Возникновение таких ошибок обычно сигнализирует либо об ошибке в самом файловом менеджере, либо об аппаратных сбоях на диске, либо о том, что структуры ФС были модифицированы в обход файлового менеджера. Например, в ДОС это может быть признаком вирусной активности.
Обычно программа восстановления не помечает потерянные блоки как свободные,
а выделяет из них непрерывные цепочки и создает из этих цепочек файлы.
Например, в OS/2 программа восстановления пытается найти в потерянных
блоках файловые записи, а потом создает ссылки на найденные таким образом
файлы в каталоге \FOUND.XXX. В DOS эти файлы помещаются в корневой каталог
ФС под именами FILEXXXX.CHK (вместо ХХХХ подставляется номер). Предполагается,
что пользователь просматривает все такие файлы и определяет, не содержит
ли какой-то из них ценной информации, например, конца насильственно укороченного
файла.
В системах семейства Unix существует несколько специфических ошибок, связанных
с инодами.
Рис. 11.20. Инод-сирота
Ручное восстановление файловой системы
В некоторых особенно тяжелых случаях программа восстановления оказывается
не в состоянии справиться с происшедшей аварией и администратору системы
приходится браться за дисковый редактор.
В процессе эксплуатации системы SCO Open Desktop 4.0 у автора неоднократно
возникала необходимость выполнять холодную перезагрузку без нормального
размонтирования файловых систем. Одна из таких перезагрузок привела к
катастрофе.
Дисковая подсистема машины состояла из кэширующего контроллера дискового
массива. Контроллер активно использовал отложенную запись, что, по-видимому,
и послужило причиной катастрофы. Во время планового резервного копирования
драйвер лентопротяжки "впал в ступор" и заблокировал процесс
копирования (механизм возникновения этой аварии подробнее обсуждался в
разд. Обмен данными с пользовательским
процессом). Из-за наличия зависшего процесса оказалось невозможно
размонтировать файловую систему, и машина была перезагружена нажатием
кнопки RESET без выполнения нормального закрытия, в том числе и без выполнения
операции закрытия драйвера дискового массива, которая должна была сбросить
на диски содержимое буферов контроллера.
После перезагрузки система автоматически запустила программу восстановления
файловой системы fsck (File System ChecK), которая выдала радостное сообщение:
DUP in inode 2. Для незнакомых с системными утилитами Unix н обходимо
сказать, что DUP означает ошибку перекрещивания файлов, а инп~ 2— это
инод корневого каталога ФС. Таким образом, корневая директория дискового
тома объемом около 2 Гбайт оказалась испорчена. При этом пода ляющее большинство
каталогов и файлов были не затронуты катаклизмом оказались недоступны.
Программа восстановления не могла перенести ссылк на соответствующие иноды
в каталог lost+found, так как ссылка на него такж идет из корневого каталога.
Ситуация представлялась безвыходной. Катастрофа усугублялась тем, что
произошла она во время резервного копирования, а последняя "хорошая"
копия была сделана неделю назад. Большую часть пользовательских данных
можно было бы восстановить, но среди потерянных файлов оказался журнальный
файл сервера СУБД ORACLE (сама база данных находилась в другом разделе
диска). Пришлось заняться восстановлением ФС с использованием дискового
редактора, мотивируя это тем, что "терять все равно уже нечего"
Собственно, в восстановлении ФС участвовало два человека — автор и штатный
администратор системы. Автор ни в коем случае не хочет создать у читателя
впечатление, что план восстановления был разработан лично им — это был
плод совместных усилий, проб и ошибок.
Редактирование системных данных "сложных" ФС с использованием
простого шестнадцатеричного дискового редактора является крайне неблагодарным
занятием. Есть основания утверждать, что это вообще невозможно. Во всяком
случае, автору не доводилось слышать об успехе такого предприятия. К счастью,
системы семейства Unix предоставляют для редактирования ФС специальную
программу fsdb (File System DeBugger— отладчик файловой системы). Пользовательским
интерфейсом эта программа напоминает программу DEBUG.COM, поставляемую
с MS DOS; главным ее преимуществом является то, что она "знакома"
с основными понятиями файловой системы. Так, например, fsdb позволяет
просмотреть содержимое 10-го логического блока файла с инодом 23 456,
выделить физический блок 567 345 файлу с инодом 2 или пометить инод 1245
как свободный.
Первая попытка восстановления состояла в том, что мы удалили тот инод,
с которым перекрещивался корневой каталог, смонтировали том командой "безусловного"
монтирования (которая позволяла монтировать поврежденные тома), создали
командой mkdir каталог lost+found и вновь запустили fsck. Попытка завершилась
крахом. Беда была в том, что, как оказалось, корневой каталог пересекался
также и со списком свободных блоков, т. е. создание каталога, а потом
его расширение командой f sck снова приводило к порче корневого каталога
и задача сводилась к предыдущей.
Таким образом, нам необходимо было либо исправить вручную список свободных
блоков, либо найти способ создать директорию lost+found без обращений
к этому списку. Дополнительная сложность состояла в том, что с каталогом
lost+found не связано фиксированного инода, а определить инод старого
lost+found не представлялось возможным.
Мы решили не связываться с восстановлением списка свободных блоков. Вместо
этого мы просмотрели листинг последней "правильной" резервной
копии, нашли там ненужный пустой каталог и присоединили его к корневому
под названием lost+found. После этого нам оставалось лишь уповать на то,
что вновь создаваемые f sck-ссылки на файлы не приведут к необходимости
удлинить наш lost+found. К счастью, этого не произошло: все потомки корневого
каталога благополучно получили имена в lost+found. По существу, ФС пришла
в пригодное для чтения состояние, оставалось лишь правильно определить
имена найденных каталогов. Это также оказалось относительно несложной
задачей: большая часть каталогов на томе состояла из домашних каталогов
пользователей и их имена можно было восстановить на основании того, кому
эти каталоги принадлежали. Для остальных каталогов имя достаточно легко
определялось после сопоставления их содержимого с листингом резервной
копии.
Во многих современных ОС реализованы устойчивые к сбоям файловые системы:
jfs в AIX и OS/2 v4.5, Veritas в UnixWare, NTFS в Windows NT/2000/XP.
Практически все такие ФС основаны на механизме, который по-английски называется
intention logging (регистрация намерений).