Содержание
- Краткое резюме
- Контекст и основные концепты файловых систем
- UNIX Berkeley File System (BSD)
- EXT2 и EXT3 (Linux)
- Windows NTFS
- Работа с памятью: memory mapping (mmap)
- Буферный кеш (Buffer Cache)
- Надежность и долговечность файловых систем
- Дополнительные особенности файловых систем
- Итоги
Краткое резюме
- Файловая система обеспечивает отображение путей файлов на блоки данных на диске через структуры inode и индексы.
- FAT — простая файловая система с одним уровнем указателей и широко используется в флешках и камерах.
- BSD UNIX FS (4.1 и 4.2 Fast FS) добавляет многоуровневые индексы и блоки групп для повышения производительности и надежности.
- NTFS использует мастер-файл-таблицу (MFT) с переменными экстентами, объединяя метаданные и данные, что улучшает эффективность мелких файлов.
- mmap позволяет отображать файлы в память, упрощая доступ и модификацию данных через операции с памятью.
- Буферный кеш (buffer cache) в ОС кэширует блоки с диска для повышения скорости, поддерживает отложенную запись (delayed write) для производительности.
- Для повышения надежности и долговечности данных используются RAID и схемы с избыточностью.
- Ключевые «-ility» характеристики файловых систем: доступность (availability), долговечность (durability) и надежность (reliability), каждая из которых отвечает за разные аспекты работы системы.
Контекст и основные концепты файловых систем
Файловая система — это набор структур, преобразующих привычные для пользователей пути файлов в конкретные физические блоки данных на диске. В основе лежит разрешение пути через директории к inode (индексному дескриптору), в котором содержится метаданные файла и указатели на блоки.
FAT (File Allocation Table)
- Самая простая и давняя файловая система (с 1970-х), до сих пор используется в USB, камерах и других устройствах.
- FAT — это массив, где каждой позиции соответствует блок диска и указатель на следующий блок файла.
- Файл представлен цепочкой блоков, связанных через FAT.
- Таблица FAT хранится в заранее определенной области диска, дублируется для надежности.
- FAT легко реализуется в прошивке, поэтому широко применяется на встраиваемых устройствах.
«FAT — простая файловая система, выдержавшая испытание временем и доступная на большинстве флешек и камер.»
UNIX Berkeley File System (BSD)
Структура inode
- Содержит метаданные (права, владелец, временные метки, размер).
- Указатели на данные организованы в многоуровневую структуру:
- Прямые блоки (10-12 штук), указывающие непосредственно на данные.
- Косвенные блоки: одинарные, двойные, тройные косвенные — позволяющие адресовать очень большие файлы.
Производительность и размещение
- 4.1BSD не оптимизировал размещение данных по диску, что привело к постепенному ухудшению производительности из-за фрагментации.
- Fast File System (FFS, 4.2BSD) внедрил улучшения:
- Деление диска на группы блоков (block groups), где inode, данные и bitmap свободного пространства размещаются совместно для локальности.
- Свободное пространство учитывается с резервом ~10%, позволяя находить большие непрерывные области.
- Внедрены алгоритмы положения блоков, учитывающие вращение диска (skip sectoring).
- Вводится цилиндрическая группировка (cylinder group) — сборка блок-групп с разных пластин диска.
Преимущества Fast File System
- Хорошая локальность метаданных и данных для маленьких и средних файлов.
- Минимизация количества переключений головки по диску благодаря распределению блоков.
- Более высокая надежность, так как повреждение одной группы вряд ли уничтожит все inode.
Ограничения
- Эффективность для очень маленьких файлов все еще низкая, поскольку каждый файл требует отдельный inode и минимум один блок данных.
- Поиск в больших директориях остается линейным в большинстве реализаций.
EXT2 и EXT3 (Linux)
- Потомки BSD файловой системы.
- EXT3 добавляет журналирование для повышения надежности.
- Поддерживаются блоки размером 1K–4K (стандартно 4К).
- Иерархия директорий и работа с inode усложнены, но принципы аналогичны BSD.
Windows NTFS
- Переменные размеры экстентов (континуальных участков), а не фиксированные блоки, что позволяет снижать фрагментацию.
- Мастер-файл-таблица (MFT) — база данных, где каждая запись (обычно 1 КБ) содержит метаданные и либо данные (для малых файлов), либо ссылки на экстенты.
- Позволяет сразу хранить метаданные и данные вместе, сокращая расход дискового пространства для маленьких файлов.
- Поддерживается журналирование.
- В случае больших файлов MFT может содержать указатели на записи, формируя цепочку.
- NTFS напрямую управляет именами файлов и может хранить все названия, включая hardlinks.
«NTFS — это база данных с переменными экстентами, позволяющая эффективно работать как с малыми, так и с очень большими файлами.»
Работа с памятью: memory mapping (mmap)
- Альтернатива классическим open/read/write/close — отображение файла напрямую в виртуальное адресное пространство процесса.
- Механизм подгружает части файла по требованию при обращении к памяти (page fault).
- Позволяет работать с файлами как с обычной памятью: чтение и запись через операции над указателями.
- Пример показывает, как изображение файла в память позволяет изменить его содержимое просто изменяя области памяти.
- Поддерживает совместное использование файла несколькими процессами через отображение по одному или разным адресам.
- Есть режим "анонимной" памяти, когда отображение выделяется без backing файла.
Буферный кеш (Buffer Cache)
- Кеш блоков в оперативной памяти, включая данные, метаданные, inode, директории и карты свободных блоков.
- Позволяет существенно ускорить доступ к диску, минимизируя операции чтения/записи.
- Удерживает состояние "грязных" блоков (dirty blocks) — данные изменены в памяти, но еще не записаны на диск.
- Поддерживает отложенную запись (delayed write), возвращая управление процессу быстро, а запись на диск откладывая.
- Замена блоков в кеше обычно реализована через алгоритм LRU.
- Размер буферного кеша динамически регулируется современными ОС, балансируя с памятью, выделенной под виртуальную память.
- Используется предвычитывание (prefetching) последовательных блоков для оптимизации последовательных обращений к файлам.
- Написанные, но не записанные данные могут быть потеряны при сбое, поскольку flushing происходит периодически (~30 секунд по умолчанию).
Надежность и долговечность файловых систем
Основные характеристики («-ilities»)
- Доступность (Availability) — вероятность отклика системы на запросы, не обязательно гарантирует правильность работы.
- Долговечность (Durability) — способность сохранить данные без потерь.
- Надежность (Reliability) — способность корректно выполнять свои функции; включает безопасность, отказоустойчивость и корректность.
Обеспечение долговечности
- Использование кодов коррекции ошибок (ECC) на уровне дисков для восстановления данных.
- Применение батарейно поддерживаемой RAM и flash-кэшей для сохранения данных между записью и фиксацией на диск.
- Множественные копии данных:
- На одном диске (лучшее распределение дисковых секторов, но малополезно при отказе всего диска).
- На разных дисках серверов или даже в разных географических локациях.
- RAID-массивы:
- RAID 1 (зеркалирование) — полное дублирование данных, высокая надежность и простое восстановление.
- RAID 5 — распределение данных и контрольной суммы (parity) с меньшими затратами на избыточность.
- Современные диски требуют RAID 6 или выше, поскольку время восстановления больших объемов данных слишком велико, и риск двух отказов растет.
«Надежность достигается за счет независимости отказов: копии хранятся в местах, где маловероятен одновременный сбой.»
Дополнительные особенности файловых систем
Жесткие и символические ссылки
- Hard link — новое имя для существующего inode, увеличивает счетчик ссылок, файл удаляется только когда счетчик равен нулю и нет открытых дескрипторов.
- Symbolic link (soft link) — специальный файл, содержащий путь к другому файлу, разрешается динамически при обращении. Может указывать на несуществующий файл.
Поиск иерархии директорий
- Директории — специальные файлы с записями имени и inode файла.
- Поиск происходит последовательно (линейно) в большинстве UNIX-систем.
- В некоторых системах опционально используется индексирование через B-деревья.
Итоги
- Файловая система — это сложный уровень абстракции между пользователем и физическим носителем, кардинально влияющий на производительность и надежность.
- Основные подходы — индексация через inode, распределение данных по блокам и группам, журналирование для восстановления.
- Современные файловые системы стремятся сочетать эффективность по размеру и быстродействию с максимальной надежностью и удобством.
- Значительная часть оптимизаций связана с минимизацией перемещений головки, снижением фрагментации и использованием кэширования.
- Важнейшие требования: сохранить данные, обеспечить быстрый доступ, минимизировать потери при сбоях и оптимизировать работу с разными типами файлов и сценариев использования.
🚀 Файловая система — это «сердце» хранения данных, и понимание её принципов позволяет грамотнее проектировать и использовать современные вычислительные системы.