Главная страница Межпроцессное взаимодействие (состязание) обнаружить все неиспользуемые блоки. Каждый раз, встречая номер блока в списке свободных блоков, программа инкрементирует соответствующий счетчик во второй таблице. Если файловая система непротиворечива, каждый блок будет встречаться только один раз, либо в первой, либо во второй таблице, как показано на рис. 5.16, а. Однако в результате сбоя эти таблицы могут принять вид, соответствующий рис. 5.16, б. В этом случае блок два отсутствует в каждой таблице. О таком блоке программа сообщит как о недостающем. Хотя пропавшие блоки не причиняют вреда, они занимают место на диске, снижая его емкость. Учесть же пропавшие блоки очень просто: программа проверки файловой системы просто добавляет их к списку свободных. Номер блока
Занятые блоки Свободные блоки Номер блока 012345678 9 101112131415 Занятые блоки Свободные блоки 012345678 9 101112131415 Занятые блоки Свободные блоки 012345678 9101112131415 Занятые блоки Свободные блоки Рис. 5.1 е. Состояния файловой системы: а - непротиворечивое; б - пропавший блок; в - дубликат блока в списке свободных блоков; г - дубликат блока данных Другая возможная ситуация показана на рис. 5.16, в. Здесь мы видим блок номер 4, дважды появляющийся в списке свободных. (Дубликаты свободных блоков могут появиться лишь тогда, когда в файловой системе действительно применены списки свободных блоков; в случае битового массива это невозможно.) Решение этой проблемы также несложно: построить список свободных блоков заново. Гораздо хуже вариант, где один и тот же блок окажется сразу в двух файлах, как показано на рис. 5.16, г в случае с блоком 5. При удалении любого из этих файлов блок 5 будет помещен в список свободных блоков, что приведет к ситуации, в которой один и тот же блок одновременно является и свободным и занятым. Если удалить оба файла, этот блок будет помещен в список свободных блоков дважды. В такой ситуации программа проверки файловой системы должна взять свободный блок, скопировать в него содержимое блока 5 и вставить эту копию в один из файлов. Таким образом, содержимое файлов останется неизменным (хотя почти наверняка один из файлов уже испорчен), но, по крайней мере, структура файловой системы после этой операции становится непротиворечивой. Программа также должна выдать сообщение об ошибке, чтобы пользователь мог изучить повреждение. Помимо проверки правильности принадлежности блоков, программа проверки также анализирует каталоговую структуру. Для этого также используется таблица счетчиков, но уже не для блоков, а для файлов. Проверка начинается с корневого каталога с рекурсивным заходом в каждый каталог. Для каждого файла в каждом каталоге программа увеличивает на единицу счетчик использования файла. Благодаря жестким связям файл может присутствовать сразу в нескольких каталогах. Символьные связи не учитываются и не оказывают влияния на счетчик. Когда сканирование дерева каталогов завершено, программа получает список, индексированный по номерам г-узлов, сообщающий, в скольких каталогах присутствует каждый файл. Затем программа сравнивает полученные числа со счетчиками связей, хранящимися в самих г-узлах. Эти счетчики содержат единицу при создании файла и инкрементируются всякий раз, когда создается связь (жесткая) с данным файлом. В непротиворечивой файловой системе оба счетчика должны совпадать. Однако возможны два типа ошибок: значение счетчика связи в г-узле может оказаться слишком велико или слишком мало. Если счетчик связи больше, чем количество записей в каталоге, тогда даже при удалении всех файлов из каталогов счетчик все равно не уменьшится до нуля, и г-узел не будет удален. Эта ошибка не серьезная, но она приводит к расходованию дискового пространства файлом, находящимся вне всех каталогов. Чтобы исправить ее, следует установить значение счетчика равным числу существующих записей каталога. Вторая ошибка таит в себе катастрофические последствия. Если у файла есть две каталоговые записи, связанные с ним, но в г-узле утверждается, что описатель у файла только один, тогда при удалении описателя этого файла в любом каталоге счетчик г-узла уменьшится до нуля. При этом файловая система освободит все блоки, занимаемые файлом, в том числе и блок, в котором помещается сам г-узел. Таким образом, в одном из каталогов сохранится дескриптор файла, указывающий на неиспользуемый г-узел, чьи блоки могут быть вскоре выделены другим файлам. Решение здесь также заключается в присваивании значения счетчика г-узла фактическому числу дескрипторов файла. Часто эти две операции, проверки блоков и проверки каталогов, для увеличения эффективности объединяют в один проход. Возможно также проведение и других проверок. Например, формат каталогов должен соответствовать определенным требованиям относительно г-узлов и АЗСП-имен. Если г-узел оказывается больше числа г-узлов на диске, это означает, что каталог поврежден. Более того, у каждого г-узла могут оказаться значения режима доступа, являющиеся допустимыми, но странными, как, например, 0007. Такое значение совсем отказывает в доступе владельцу и его группе, но зато разрешает всем посторонним читать, писать и исполнять файл. Программа должна хотя бы сообщать обо всех файлах, предоставляющих сторонним пользователям больше прав, чем владельцам. Каталоги, содержащие, скажем, более 1000 описателей файлов, также подозрительны. Расположенные в каталогах пользователей файлы, владельцем которых является суперпользователь и у которых установлен бит SETUID, представляют собой потенциальную проблему безопасности, так как такие файлы при запуске любым пользователем приобретают полномочия суперпользователя. Список технически возможных, но необычных ситуаций, о которых программа должна информировать, можно продолжать довольно долго. До сих пор мы обсуждали проблему защиты пользователя от сбоев. Некоторые файловые системы также пытаются защитить пользователя от самого себя. Если пользователь собирается ввести команду гт *.о чтобы удалить все файлы с расширением .о (созданные компилятором объектные файлы), но случайно вместо этого набьет строку гт * .0 (обратите внимание на пробел после звездочки), программа rm удалит все файлы в текущем каталоге, после чего сообщит, что не может найти файл .о. В системе MS-DOS и некоторых других системах при удалении файла устанавливается всего лишь один бит в каталоге или г-узле, отмечая, что файл удален. Блоки диска не возвращаются в список свободных блоков до тех пор, пока они не понадобятся. Таким образом, если пользователь быстро обнаружит ошибку, он сможет восстановить удаленные файлы. В Windows удаленные файлы обычно помещаются в мусорную корзину , откуда их можно при необходимости из- В MS-DOS первый символ имени удаленного файла заменяется символом 0хЕ5, а блоки-секторы, занимаемые файлом, освобождаются. Создаваемый после этого новый файл может занять эти блоки-секторы и запись в каталоге. Но сразу после удаления файл может быть восстановлен по сохранившемуся (кроме первого символа имени) описателю в каталоге. - Примеч перев.
|
© 2000 - 2024 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования. |