Файловая система UFS¶
UFS (Unix File System) — семейство файловых систем, разработанных для операционных систем семейства Unix. Первоначально создана в начале 1980-х годов в Калифорнийском университете в Беркли на основе более ранней файловой системы FS (File System) из UNIX версии 7. UFS стала стандартной файловой системой для Berkeley Software Distribution (BSD) и её производных, включая FreeBSD, NetBSD и OpenBSD, а также оказала значительное влияние на разработку файловых систем в других операционных системах, таких как Solaris и Linux.
¶История
Разработка UFS началась в 1982 году в рамках проекта 4.2BSD под руководством Маршалла Кирка Макьюсика. Основной целью было преодоление ограничений старой файловой системы FS, включая низкую производительность при работе с большими дисками и ограничение на максимальный размер файла в 1 гигабайт. Новая система, представленная в 4.2BSD, получила название «быстрая файловая система» (Fast File System, FFS) и была оптимизирована для работы с дисками, используя цилиндрические группы для уменьшения фрагментации и повышения скорости доступа.
В 1994 году в составе 4.4BSD появилась вторая версия — UFS2, которая добавила поддержку 64-битных указателей на блоки, что позволило создавать файлы размером до 8 терабайт и тома до 16 терабайт. UFS2 стала стандартной файловой системой в FreeBSD начиная с версии 5.0. Развитие системы продолжалось в рамках проектов BSD, а также в коммерческих Unix-системах: Sun Microsystems использовала UFS в Solaris, добавив поддержку журналирования (UFS Logging) в версии Solaris 7.
¶Архитектура и устройство
UFS хранит данные на диске в виде последовательности блоков, объединённых в цилиндрические группы (cylinder groups). Каждая цилиндрическая группа содержит резервную копию суперблока — структуры, содержащей общую информацию о файловой системе: размер, количество свободных блоков, флаги состояния. Такое дублирование повышает устойчивость к сбоям: при повреждении основного суперблока система может восстановиться по резервным копиям.
¶Основные компоненты
- Суперблок — хранит метаданные всей файловой системы: размер, число блоков и инод, флаги.
- Иноды (inode) — структуры данных, описывающие файлы: владелец, права доступа, размер, временные метки, список блоков с данными. Каждый файл и каталог имеет уникальный номер иноды.
- Блоки данных — непосредственно содержат содержимое файлов. Размер блока обычно кратен 512 байтам и может составлять 4, 8 или 16 килобайт.
- Цилиндрические группы — подразделы диска, каждый со своей копией суперблока, таблицей инод и картой свободных блоков.
Для хранения адресов блоков файла используется схема с прямой, одиночной, двойной и тройной косвенной адресацией. Первые 12 блоков файла адресуются напрямую через иноду, что обеспечивает быстрый доступ к небольшим файлам. Для файлов большего размера используются блоки косвенной адресации, что позволяет поддерживать очень большие файлы.
¶Версии и разновидности
¶UFS1 и UFS2
UFS1 поддерживает 32-битные адреса блоков, максимальный размер файла — 2 гигабайта (при размере блока 4 КБ) или 4 гигабайта (при блоке 8 КБ). UFS2, представленная в 4.4BSD, использует 64-битные адреса и позволяет работать с файлами до 8 терабайт. Также UFS2 добавила расширенные атрибуты и улучшенную поддержку больших дисков.
¶UFS/FFS в различных системах
- FreeBSD — использует UFS2 по умолчанию, поддерживает мягкие обновления (soft updates) и журналирование.
- Solaris — использует UFS с журналированием (UFS Logging) и поддержкой расширенных атрибутов.
- Linux — имеет встроенную поддержку чтения и записи UFS, но она считается экспериментальной и не рекомендуется для боевого использования.
- macOS — ранние версии использовали UFS, но начиная с Mac OS X 10.5 система перешла на HFS+.
¶Журналирование и восстановление
Изначально UFS не была журналируемой файловой системой: при сбое питания или системном сбое требовалась длительная проверка целостности программой fsck. Для решения этой проблемы в FreeBSD были разработаны механизмы мягких обновлений (soft updates), которые упорядочивают запись метаданных таким образом, чтобы избежать повреждения структуры файловой системы без полного журналирования.
Позднее, в FreeBSD 7.0, появилась полноценная поддержка журналирования (gjournal), а в Solaris — UFS Logging. Журналирование записывает изменения метаданных в отдельный журнал, что позволяет быстро восстановить систему после сбоя без полного сканирования диска.
¶Применение
UFS использовалась в большинстве операционных систем семейства BSD, включая FreeBSD, NetBSD, OpenBSD и DragonFly BSD. Она также была основной файловой системой в Solaris до перехода на ZFS. В настоящее время UFS продолжает использоваться во FreeBSD, особенно для загрузочных разделов и небольших дисков, хотя для большинства задач рекомендуется более современная ZFS.
В Linux поддержка UFS ограничена и используется преимущественно для чтения данных с дисков, созданных в системах BSD или Solaris. В macOS поддержка UFS была удалена в версии 10.6 Snow Leopard.
¶Ограничения
Несмотря на надёжность и простоту, UFS имеет ряд ограничений по сравнению с современными файловыми системами:
- Отсутствие встроенной поддержки контрольных сумм для данных (появляется только в UFS2 с расширениями).
- Нет поддержки снапшотов (снимков состояния) в базовой версии — эта функция реализована только в некоторых реализациях, например, в FreeBSD через механизм snapshot.
- Фрагментация файлов со временем увеличивается, несмотря на использование цилиндрических групп.
- Максимальный размер тома ограничен 16 терабайтами в UFS2, что недостаточно для современных дисковых массивов.
¶Влияние
Архитектура UFS, особенно концепция цилиндрических групп и косвенной адресации, оказала значительное влияние на проектирование последующих файловых систем. Многие элементы UFS были заимствованы в ext2/ext3/ext4 (Linux), которые имеют схожую структуру суперблока и инод. Разработка UFS также стимулировала исследования в области надёжности и производительности файловых систем, что привело к созданию журналируемых систем (ext3, NTFS) и copy-on-write систем (ZFS, Btrfs).