Ядро поддерживает целостность
системы в своей обычной работе. Тем
не менее, такие чрезвычайные
обстоятельства, как отказ питания,
могут привести к фатальному сбою
системы, в результате которого
содержимое системы утрачивает свою
согласованность: большинство
данных в файловой системе доступно
для использования, но некоторая
несогласованность между ними имеет
место. Команда fsck проверяет
согласованность данных и в случае
необходимости вносит в файловую
систему исправления. Она
обращается к файловой системе
через блочный или строковый
интерфейс (глава 10) в
обход традиционных методов доступа
к файлам. В этом разделе
рассматриваются некоторые примеры
противоречивости данных, которая
обнаруживается командой fsck. Дисковый блок может принадлежать
более чем одному индексу или списку
свободных блоков. Когда файловая
система открывается в первый раз,
все дисковые блоки находятся в
списке свободных блоков. Когда
дисковый блок выбирается для
использования, ядро удаляет его
номер из списка свободных блоков и
назначает блок индексу. Ядро не
может переназначить дисковый блок
другому индексу до тех пор, пока
блок не будет возвращен в список
свободных блоков. Таким образом,
дисковый блок может либо
находиться в списке свободных
блоков, либо быть назначенным
одному из индексов. Рассмотрим
различные ситуации, могущие иметь
место при освобождении ядром
дискового блока, принадлежавшего
файлу, с возвращением номера блока
в суперблок, находящийся в памяти, и
при выделении дискового блока
новому файлу. Если ядро записывало
на диск индекс и блоки нового файла,
но перед внесением изменений в
индекс прежнего файла на диске
произошел сбой, оба индекса будут
адресовать к одному и тому же
номеру дискового блока. Подобным же
образом, если ядро переписывало на
диск суперблок и его списки
свободных ресурсов и перед
переписью старого индекса случился
сбой, дисковый блок появится
одновременно и в списке свободных
блоков, и в старом индексе. Если блок отсутствует как в
списке свободных блоков, так и в
файле, файловая система является
несогласованной, ибо, как уже
говорилось выше, все блоки обязаны
где-нибудь присутствовать. Такая
ситуация могла бы произойти, если
бы блок был удален из файла и
помещен в список свободных блоков в
суперблоке. Если производилась
запись прежнего файла на диск и
система дала сбой перед записью
суперблока, блок будет
отсутствовать во всех списках,
хранящихся на диске. Индекс может иметь счетчик связей
с ненулевым значением при том, что
его номер отсутствует во всех
каталогах файловой системы. Все
файлы, за исключением каналов
(непоименованных), должны
присутствовать в древовидной
структуре файловой системы. Если
система дала сбой после создания
канала или обычного файла, но перед
созданием соответствующей этому
каналу или файлу точки входа в
каталог, индекс будет иметь в поле
счетчика связей установленное
значение, пусть даже он явно не
присутствует в файловой системе.
Еще одна проблема может возникнуть,
если с помощью функции unlink была
удалена связь каталога без
проверки удаления из каталога всех
содержащихся в нем связей с
отдельными файлами. Если формат индекса неверен
(например, если значение поля типа
файла не определено), значит где-то
имеется ошибка. Это может
произойти, если администратор
смонтировал файловую систему,
которая отформатирована
неправильно. Ядро обращается к тем
дисковым блокам, которые, как
кажется ядру, содержат индексы, но в
действительности оказывается, что
они содержат данные. Если номер индекса присутствует в
записи каталога, но сам индекс
свободен, файловая система
является несогласованной,
поскольку номер индекса в записи
каталога должен быть номером
назначенного индекса. Это могло бы
произойти, если бы ядро, создавая
новый файл и записывая на диск
новую точку входа в каталог, не
успела бы скопировать на диск
индекс файла из-за сбоя. Также это
может случиться, если процесс,
удаляя связь файла с каталогом,
запишет освободившийся индекс на
диск, но не успеет откорректировать
каталог из-за сбоя. Возникновение
подобных ситуаций можно
предотвратить, копируя на диск
результаты работы в надлежащем
порядке. Если число свободных блоков или
свободных индексов, записанное в
суперблоке, не совпадает с их
количеством на диске, файловая
система так же является
несогласованной. Итоговая
информация в суперблоке всегда
должна соответствовать информации
о текущем состоянии файловой
системы. Предыдущая
глава || Оглавление
|| Следующая глава
5.18 СОПРОВОЖДЕНИЕ
ФАЙЛОВОЙ СИСТЕМЫ