Изначально стандартной файловой системой для Linux была Ext2fs. Ext2 основана на структуре i-node. I-node содержит информацию о файле и указатели на блоки данных, в которых расположен файл. Для повышения быстродействия операций ввода/вывода данные временно располагаются в оперативной памяти. Проблема возникает, если сбой происходит до того, как данные из кэша перепишутся на диск. Это вызывает несоответствие в файловой системе. Например, возникает ссылка на файл, еще не созданный на диске, или файлы были уже удалены, но их i-nodes и блоки данных остались на диске. Fsck (File system check – проверка файловой системы) – стандартная программа для устранения несоответствий. Единственный способ это сделать – просканировать весь диск, и проверить все зависимости между i-nodes, блоками данных и содержанием директорий. С увеличением объемов дисков эта процедура стала занимать огромное количество времени – серьезная проблема для серверов, которые должны работать постоянно.
Это и стало главной причиной внедрения в файловые системы технологии транзакций, взятой из баз данных, и технологии восстановления, и это привело к появлению журналируемых файловых систем.
Журналируемая файловая система – это устойчивая к сбоям файловая система, в которой целостность данных гарантирована, потому что обновления в meta-данных файлов записываются в log на диске перед любыми изменениями в структуре файловой системы. В случае сбоя журналируемая файловая система гарантирует восстановление всех потерянных данных. Самый распространенный подход – это метод журналирования или логгирования meta-данных файлов. Его суть в том, что информация о любом изменении записывается в зарезервированную область файловой системы, и только после этого совершается само изменение.
При перезагрузке компьютера, который использует журналируемую файловую систему, программа монтирования может гарантировать целостность файловой системы простой проверкой журнала на наличие ожидаемых, но не произведенных изменений и записью их в файловую систему. В большинстве случаев, системе не нужно проводить проверку целостности файловой системы, а это означает, что компьютер будет доступен для работы практически сразу после перезагрузки. Соответственно шансы потери данных в связи с проблемами в файловой системе значительно снижаются.
Linux имеет три основные журналируемые FS – это ReiserFS от Namesys, XFS от SGI, и Ext3, разработанная Stephen Tweedie, участвовавшим в создании Ext2.
Самый простой инструмент для улучшенного по сравнению с традиционными Unix-системами быстродействия – это избежание использования связанных списков или bitmaps, которые содержат в себе проблему масштабируемости и неприменимы для новых дисков с огромной вместимостью. Все новые системы используют Balanced Trees (B-Trees), или их вариацию (B+Trees).
Дерево состоит из внутренних и листовых узлов. Каждый узел (node) – это дисковый блок. Каждому объекту (файлу, каталогу) назначается уникальный ключ, аналогичный номеру inode в других файловых системах. Внутренние узлы, главным образом, состоят из ключей и указателей на узлы-потомки. Узел, который начинает дерево, известен как корень; узлы, которые сидят на конце ветви дерева иногда называются листьями.
Время поиска в B+Trees пропорционально не количеству объектов (файлов в каталоге или числа блоков на диске), а логарифму этого числа. В сбалансированном дереве все ветви (пути от корня до «листа») имеют одинаковую (или примерно одинаковую) длину.
ReiserFS базируется на B+Tree в организации объектов файловой системы. ReiserFS предоставляет только журналирование meta-данных. В случае незапланированной перезагрузки данные в блоках, используемых во время сбоя, могут быть повреждены, так что ReiserFS не гарантирует того, что после сбоя данные останутся неповрежденными.
ReiserFS также имеет ряд особенностей, нацеленных специально для улучшения работы с маленькими файлами. Одна из специальных возможностей ReiserFS – это Tail Packing. Tail – это файл, размер которого меньше, чем логический блок, или какие-то части файлов, занимающие меньше, чем один блок. Для сохранения свободного места ReiserFS использует сжатие tail-файлов, и это позволяет примерно на 5 % увеличить свободное место по сравнению с Ext2. Для увеличения скорости, ReiserFS способен хранить содержимое файлов непосредственно внутри b*tree, а не в виде указателя на дисковый блок.
XFS была создана в начале 90-х (1992–1993) фирмой Silicon Grapgics (сейчас SGI) для мультимедийных компьютеров с ОС Irix. Файловая система была ориентирована на очень большие файлы и файловые системы. 1 мая 2001 года SGI выпустила первый релиз XFS для Linux.
Для увеличения масштабируемости файловой системы XFS обширно использует B+Trees. XFS допускает хранение журнала на другом блочном устройстве.
XFS имеет такую возможность, как delayed allocation (Отложенное размещение) – вместо того, что бы выделять блоки файлу в момент его записи в кэш, XFS просто резервирует блоки в файловой системе, размещая данные в специальных виртуальных зонах (virtual extents). Когда весь файл содержится в памяти, то он обычно может быть размещен в одном куске непрерывного дискового пространства. Тем самым предотвращается фрагментация файлов.
Максимальный размер файла – 9 млн. Тбайт
В ReiserFS неожиданная перезагрузка может иметь результатом попадание в изменяемый файл фрагмента из когда-то удаленного файла. Помимо очевидной потери данных, гипотетически это может иметь более серьезные последствия. В XFS имеется гарантия, что любые «недозаписанные» блоки заполнены нулями. Так как блоки с нулевыми байтами в системных файлах игнорируются, устраняется лазейка в безопасности.
Ext3 – надстройка над Ext2. С одной стороны, она позволяет вести лог операций для более быстрого восстановления. Но эта файловая система унаследовала некоторые ограничения от Ext2 (например, она базируется на блоках и использует полный перебор при поиске файлов и директорий), и поэтому ее нельзя назвать чистой журналируемой файловой системой.
Журнал располагаться в любой другой файловой системе. Возможно иметь несколько файловых систем Ext3 с совместным журналом.
Типы журналирования поддерживаемые Ext3, которые могут быть активированы из файла /etc/fstab:
- data=journal (full data journaling mode) – все новые данные сначала пишутся в журнал и только после этого переносятся на свое постоянное место. В случае аварийного отказа журнал можно повторно перечитать, приведя данные и метаданные в непротиворечивое состояние. Самый медленный, но самый надежный.
- data=ordered – записываются изменения только метаданных файловой системы, но логически metadata и data блоки группируются в единый модуль, называемый transaction. Перед записью новых метаданных на диск, связанные data блоки записываются первыми. Этот режим установлен по умолчанию. При добавлении данных в конец файла режим data=ordered гарантированно обеспечивает целостность (как при full data journaling mode). Однако, если данные в файл пишутся поверх существующих, то есть вероятность перемешивания «оригинальных» блоков с модифицированными. Это результат того, что data=ordered не отслеживает записи, при которых новый блок ложится поверх существующего и не вызывает модификации метаданных.
- data=writeback (metadata only) – записываются только изменения метаданных файловой системы. Самый быстрый метод журналирования. Аналогичен используемому в XFS и ReiserFS.
Файловая система NTFS начала свое существование вместе с Windows NT 3.5 в 1993 году. Она умеет управлять дисками размером до нескольких сотен терабайт.
Каждый файл на томе NTFS представлен записью в специальном файле, называемом главной файловой таблицей (MFT – master file table). Первая запись этой таблицы описывает непосредственно главную файловую таблицу;
За ней следует зеркальная запись (mirror record) MFT. Если первая запись MFT разрушена, то NTFS читает вторую запись для отыскания зеркального файла MFT.
Третья запись MFT – файл регистрации (log file); содержит список шагов транзакции, используемых Log File System для восстановления файлов в случае сбоя. Семнадцатая и последующие записи главной файловой таблицы используются собственно файлами и каталогами.
Небольшие файлы и каталоги могут полностью содержаться внутри записи главной файловой таблицы. Большие каталоги организованы в B-tree, имея записи с указателями на внешние кластеры, содержащие элементы каталога, которые не могли быть записаны внутри структуры MFT.
А.О. Козлова