Целостность данных и файловой системы
Контроль доступа является лишь одной из составляющих защиты файлов. Другими составляющими является обеспечение сохранения или восстановления целостности информации при аппаратных сбоях и при параллельном доступе к ней. Методы защиты от потерь целостности, происходящих по причине аппаратных и программных ошибок, можно подразделить на основывающиеся на избыточности и основывающиеся на копировании.
Избыточность, поддерживаемая программно, на уровне ОС, обеспечивается, как правило, только для особо важной системной информации: дескрипторов дисков и файлов, таблиц размещения, каталогов и т.п. При записи одной и той же информации в два разных блока на диске даже, если сбой произойдет во время записи, один из блоков будет содержать корректный вариант информации - то ли до ее изменения, то ли после. Избыточность может вноситься как простым дублированием управляющих структур данных, так и внесением избыточности в сами эти структуры. Так, в структуры данных, которые связываются в списки, часто вводятся дополнительные указатели, позволяющие получить доступ к одной и той же структуре данных разными путями. Причем, при штатной работе используется только один путь, а остальные могут быть использованы для восстановления списка при нарушении указателей основного пути. Например, если сделать список свободных блоков на диске двунаправленным, то по обратным прошивкам можно восстановить этот список при потере указателя на его начало в дескрипторе диска. Другой пример: алгоритмы функционирования логической и базовой ФС не нуждаются в том, чтобы имя файла, имеющееся в элементе каталога, дублировалось в дескрипторе файла. Однако, такое дублирование чрезвычайно облегчит задачу восстановления доступа к файлам при разрушении системы каталогов.
Начнем с того, что весьма часто нарушение целостности происходит по вине пользователя - ошибочное удаление файлов или внесение в них неправильных изменений. Профилактикой этих ошибок является создание обратных копий (backup) файлов, к которым можно вернуться, если испорчена или уничтожена текущая копия.
Концепция обратных копий может быть расширена до сохранения нескольких поколений версий файлов: при изменении файла создается его новая версия, а старая версия сохраняется. Создание новых версий может производиться разными способами:
- вручную - пользователь сам копирует файл, версию которого он хочет сохранить, под новым именем;
- специальными утилитами - некоторые программы (например, текстовые редакторы) автоматически создают новую версию файла, который они изменяют (BAK-файлы, хорошо известные пользователям MS DOS);
- общей утилитой - которая проверяет версии всех файлов (или заданной группы файлов) и создает новые версии для изменившихся файлов;
- автоматически - самой ОС при открытии любого файла для записи.
Множественность версий может быть прозрачна для пользователя: все версии могут иметь одинаковое имя. Один элемент каталога может содержать массив ссылок на дескрипторы разных версий, или дескрипторы версий могут быть увязаны в список. Естественно, что по умолчанию всегда выбирается последняя версия и только специальным системным вызовом обеспечивается возврат к предыдущим версиям. Количество сохраняемых версий должно ограничиваться: это может быть либо общее для всех файлов ограничение, либо устанавливаемое индивидуально для каждого файла. При превышении числом версий файла установленного предела ОС автоматически выполняет удаление самой старой версии.
Профилактикой случайного удаления файла может быть неполное удаление. Такое удаление предполагает сохранение физического файла на диске, а следовательно, и возможность его последующего восстановления. Элемент каталога, соответствующий не полностью удаленному файлу, может помечаться специальным признаком или файл может переноситься в специальный каталог для удаленных файлов. Такой подход должен обеспечиваться двумя системными вызовами - deleteFile для неполного удаления и purgeFile - для полного. Неполное удаление создает, однако, проблему дискового пространства: неполное удаление файла не освобождает места на диске.
ОС может периодически проверять срок хранения не полностью удаленных файлов и физически удалять те из них, которые не были восстановлены за установленный срок, или же выполнять такую проверку только, когда дает о себе знать нехватка дискового пространства.
Средством, практически гарантирующим минимизацию потерь при порче информации, является восстановление по резервной копии. Без рекомендаций о сохранении копий своих файлов на дискетах не обходится ни одно руководство по работе на персональных компьютерах, но выполнение этих рекомендаций требует от пользователя некоторой самодисциплины, которая в массе пользователям персональных ЭВМ, увы, не свойственна. В любых неперсональных системах и при работе над любыми неперсональными проектами копирование информации является не возможностью по выбору, а необходимостью. Для хранения резервных копий применяются магнитные ленты - носители, отличающиеся большим временем доступа, но и большой емкостью и малой стоимостью. Отчасти забытые по времена "персонального бума", они сейчас опять восстанавливают свои позиции архивных носителей.
Схема копирования должна обеспечивать минимизацию времени поиска и восстановления информации как при локальных (в пределах одного или нескольких файлов) потерях, так и при полном разрушении структур ФС. Рекомендуемая схема включает в себя несколько уровней выгрузки (dump), обычно - три: полные, повторные и инкрементные выгрузки. Полная выгрузка выполняется редко (например, раз в год) и включает в себя все имеющиеся на диске файлы. Повторные выгрузки производятся несколько чаще (например, ежемесячно) в них включаются только файлы, изменившиеся со времени предыдущей повторной или полной выгрузки. Инкрементные выгрузки выполняются часто (ежедневно) и включают в себя файлы, изменившиеся со времени предыдущей инкрементной или повторной. Для возможности восстановления состояния информации на начало текущего дня при полном крахе системы необходимо сохранять:
- носитель последнего полного дампа;
- все носители повторных дампов, сделанных со времени последнего полного;
- все носители инкрементных дампов, сделанных со времени последнего повторного.
В таком порядке и используются носители при выполнении восстановления.
Создание архивных копий должно выполняться системными утилитами, которые могут также вести учет архивированных файлов: поддерживать на внешней памяти (и сохранять на отдельных архивных носителях) таблицу файлов с указанием для каждого файла сведений о том, когда сделана его архивная копия, и на каком носителе она находится. Наличие такой таблицы позволяет выполнить быстрое восстановление при локальных сбоях.
При наличии аппаратной избыточности в дисковой памяти ФС может (как правило, в качестве дополнительной возможности) поддерживать правила чтения/записи, обеспечивающие отказоустойчивость и возможность восстановления информации, а также повышение быстродействия дискового ввода-вывода за счет параллельной работы двух и более дисков.. Эти правила известны как технологии RAID (Redundant array of inexpensive disks - избыточный массив недорогих дисков). Определены 5 уровней технологии RAID:
- RAID 0 - разделение данных по дискам - отдельные блоки данных записываются на разные свободные диски. Надежная защита не обеспечивается, так как при выходе из строя одного диска все данные могут быть потеряны.
- RAID 1 - дублирование дисков - данные записываются на оба диска по одному и тому же каналу. При порче одного из дисков данные могут быть восстановлены по другому, но при сбое канала все данные будут потеряны.
- RAID 2 - разделение данных по дискам с чередованием битов и контрольной суммой - метод неэффективный как по надежности, так и по быстродействию. На практике не применяется.
- RAID 3 - разделение данных по дискам с чередованием битов и проверкой четности - более надежный, чем RAID 2, но столь же медленный. На практике не применяется.
- RAID 4 - разделение данных по дискам с чередованием блоков и проверкой четности - быстродействие выше, чем RAID 3, но все же недостаточно для практического применения.
- RAID 5 - разделение блоков по дискам, чередование блоков, распределенная четность - требует не менее трех дисков.
Каждый следующий блок данных помещается на другом физическом диске. В массиве блоков, имеющих одинаковые физические адреса на разных дисках, один блок используется как контрольный. Размещение контрольного блока - "скользящее", как показано на рис.7.5. Контрольный блок содержит результат операции XOR между содержимым блоков с тем же адресом всех остальных дисков. При потере информации на одном из дисков эта информация может быть восстановлена путем выполнения XOR между контрольным блоком и блоками всех уцелевших рабочих дисков.
Рис.7.5. Технология RAID 5 |
Промышленное применение в настоящее время имеют технологии RAID 0, 1 и 5.
Резервное копирование и даже аппаратная избыточность позволяют уменьшить потери, но не избежать их полностью. В предыдущей главе мы упоминали о том, что все современные файловые системы используют кеширование дискового ввода-вывода, а, следовательно, в них возникает ситуация отложенной или ленивой записи (lazy write), когда данные, уже записанные процессом в файл, на самом деле находятся в буферной оперативной памяти. При сбое системы такие данные могут быть потеряны. Наиболее опасно то, что отложенной записи подвергаются не только данные, но и метаданные файловой системы - дескрипторы дисков и файлов, каталоги и т.п. При потере изменений в метаданных недоступными могут стать все данные на диске. Поэтому в тех ФС, к целостности которых предъявляются высокие требования, ведется протоколирование операций над метаданными - запись информации по повторению или откату операции над метаданными в файл протокола (log) или журнала (journal). При сбое системы восстановление или откат операций производится по журналу. Поскольку журнал также подвергается отложенной записи, периодически производится фиксация контрольной точки - принудительная запись журнала на диск. При сбое системы, таким образом, гарантируется восстановление до последней контрольной точки.
Причиной нарушения целостности может являться одновременный доступ к файлу двух и более процессов.
Для предотвращения таких нарушений ОС накладывает "замки" (lock) на файлы: замок разделяемого доступа для файла, открытого для чтения, и замок монопольного доступа для файла, открытого для записи. Замок может входить в дескриптор открытого файла. Если новый замок конфликтует с замком, наложенным ранее начавшейся операцией, то новая операция должна быть заблокирована. Обычно ОС не поддерживает сложного управления синхронизацией операций, ограничиваясь замками файлов. Наиболее часто в ОС применяется, так называемая, двухфазная дисциплина, требующая, чтобы замок на файл накладывался при его открытии и снимался при его закрытии. Замыкаться могут не только файлы, но и целые диски или каталоги или наоборот - отдельные записи или байты файла. Задача обеспечения синхронизации является частным случаем задачи взаимного исключения, подробно рассматриваемой в главе 8.
Большинство ОС обеспечивает только разделение доступа к каждому отдельному файлу и восстановление целостности метаданных ФС, перепоручая управление сложными транзакциями и целостностью пользовательских данных промежуточному программному обеспечению - менеджерам транзакций (IBM CICS, MS Transaction Server и др.) и системам управления базами данных (Oracle, IBM DB2 и др.). В распоряжении процессов должны быть средства API для формирования структуры транзакций - системные вызовы или обращения к тому программному пакету, в среде которого функционирует процесс. Примером такого средства могут быть предложения языка SQL: COMMIT (фиксация) и ROLLBACK (откат).
Содержание раздела