Универсальная файловая система
Универсальная файловая система (Universal File System, UFS) — это обобщённое название для семейства файловых систем, разработанных в рамках проекта операционной системы Unix в конце 1970-х — начале 1980-х годов. В узком смысле термин относится к оригинальной файловой системе BSD (Berkeley Software Distribution), известной как UFS1, и её последующей версии UFS2. UFS является одной из старейших и наиболее влиятельных файловых систем, заложившей основы для многих современных решений, включая ext2/ext3/ext4 в Linux и ZFS. Она характеризуется использованием индексных дескрипторов (inode), битовых карт для управления свободным пространством и поддержкой жёстких ссылок.
История
Происхождение
Первая версия UFS была создана в 1978 году в Калифорнийском университете в Беркли (США) как часть операционной системы 4.2BSD. Разработчики, среди которых были Маршалл Кирк Маккьюсик и Роберт Свайндл, поставили задачу преодолеть ограничения файловой системы V7 Unix, которая использовала фиксированный размер блоков и не поддерживала длинные имена файлов. UFS ввела поддержку имён длиной до 255 символов, а также механизм кэширования через буферный кэш ядра.
Развитие
В 1984 году вышла версия 4.3BSD, в которой UFS получила поддержку мягких ссылок (symlinks) и увеличенный максимальный размер файла (до 2^32 байт). В 1994 году, с выходом 4.4BSD, была представлена UFS2 (также известная как FFS — Fast File System). Основные нововведения включали:
- Увеличение размера блока по умолчанию с 4 КБ до 8 КБ.
- Поддержка 64-битных адресов блоков, что позволило работать с разделами объёмом до 8 зеттабайт.
- Введение механизма журналирования (soft updates) для обеспечения целостности данных при сбоях.
Распространение
UFS стала стандартной файловой системой для всех версий BSD (FreeBSD, NetBSD, OpenBSD) и их производных (например, macOS до версии 10.6 Snow Leopard использовала UFS в качестве альтернативы HFS+). В 1990-х годах Linux-сообщество разработало собственную реализацию UFS (ext2), которая впоследствии эволюционировала в ext3 и ext4. Однако в современных системах UFS постепенно вытесняется более новыми файловыми системами, такими как ZFS, Btrfs и APFS.
Архитектура и устройство
Основные компоненты
UFS использует классическую структуру, основанную на индексных дескрипторах (inode). Каждый файл или каталог представлен inode, который хранит метаданные: права доступа, владельца, временные метки, размер и список адресов блоков данных. Inode не содержит имени файла — имя хранится в записях каталога, которые ссылаются на номер inode.
Структура раздела
Раздел UFS делится на несколько логических областей:
- Суперблок (superblock) — содержит глобальную информацию о файловой системе: размер блока, количество inode, размер раздела, флаги состояния. Для повышения надёжности суперблок дублируется в нескольких местах.
- Группа цилиндров (cylinder group) — UFS разбивает диск на группы цилиндров (в современных реализациях — группы блоков), каждая из которых содержит:
- Копию суперблока.
- Битовую карту занятых блоков (block bitmap).
- Битовую карту занятых inode (inode bitmap).
- Таблицу inode.
- Область данных.
- Блоки данных — минимальная единица хранения данных. Размер блока может быть 4 КБ, 8 КБ или 16 КБ (в UFS2). Для больших файлов используется механизм косвенной адресации: inode содержит до 12 прямых указателей на блоки, а также указатели на блоки косвенной, двойной косвенной и тройной косвенной адресации.
Типы блоков
- Прямые блоки — первые 12 блоков файла адресуются напрямую из inode.
- Косвенные блоки — содержат указатели на блоки данных (используются для файлов размером до 2^12 блоков).
- Двойные косвенные блоки — для файлов размером до 2^24 блоков.
- Тройные косвенные блоки — для файлов размером до 2^36 блоков (максимальный размер файла в UFS2 — 2^64 байт).
Классификация
UFS1 (FFS)
- Размер блока: 4 КБ (по умолчанию).
- Максимальный размер файла: 2^32 байт (4 ГБ).
- Максимальный размер раздела: 2^32 блоков (16 ТБ при 4 КБ блоке).
- Поддержка мягких ссылок: да.
- Журналирование: нет (используется soft updates).
UFS2
- Размер блока: 8 КБ (по умолчанию).
- Максимальный размер файла: 2^64 байт (16 ЭБ).
- Максимальный размер раздела: 2^64 блоков (128 ЗБ при 8 КБ блоке).
- Поддержка мягких ссылок: да.
- Журналирование: soft updates (с версии FreeBSD 5.0).
Реализации в других ОС
- Linux UFS — встроенная поддержка только для чтения (чтение UFS1/UFS2). Для записи требуется патч или сторонний модуль.
- macOS UFS — поддерживалась до версии 10.6 (Snow Leopard), затем заменена на HFS+.
- Solaris UFS — использовалась в SunOS до внедрения ZFS.
Применение
Операционные системы
UFS является основной файловой системой для всех современных BSD-систем (FreeBSD, NetBSD, OpenBSD). В FreeBSD, начиная с версии 7.0, UFS2 используется по умолчанию для корневых разделов и разделов данных. В macOS UFS применялась в ранних версиях (до 10.6) как альтернатива HFS+ для серверных конфигураций.
Встраиваемые системы
Благодаря простоте и низким требованиям к ресурсам, UFS часто используется во встраиваемых системах на базе BSD (например, в маршрутизаторах, сетевых хранилищах NAS). В некоторых дистрибутивах Linux (например, OpenWrt) UFS поддерживается через модуль ufs.
Историческое значение
UFS послужила основой для разработки файловой системы ext2 в Linux (1993 год). Структура inode, битовые карты и механизм косвенной адресации были заимствованы практически без изменений. В свою очередь, ext2 стала базой для ext3 (с журналированием) и ext4 (с увеличенным размером файлов и разбивкой на экстенты).
Критика и ограничения
Недостатки
- Отсутствие журналирования — в UFS1 и UFS2 (без soft updates) при сбое питания или системном сбое требуется длительная проверка целостности (fsck), которая может занимать часы на больших разделах.
- Фрагментация — при длительной эксплуатации и частых операциях записи/удаления мелких файлов возникает фрагментация, снижающая производительность.
- Ограниченная поддержка в Linux — встроенная поддержка UFS в Linux является экспериментальной и не поддерживает запись для UFS2.
- Отсутствие сжатия и шифрования — UFS не поддерживает встроенное сжатие данных или шифрование на уровне файловой системы (в отличие от ZFS или Btrfs).
Достоинства
- Простота и надёжность — архитектура UFS хорошо изучена и проверена десятилетиями эксплуатации.
- Эффективность для малых файлов — благодаря фиксированному размеру inode и прямому адресу блоков, UFS хорошо работает с файлами размером до 12 блоков.
- Совместимость — UFS поддерживается во всех BSD-системах и может быть прочитана в Linux, macOS и Windows (через сторонние драйверы).
Интересные факты
- Оригинальная UFS (4.2BSD) была одной из первых файловых систем, поддерживающих длинные имена файлов (до 255 символов) — до этого в Unix имена были ограничены 14 символами.
- В UFS2 максимальный размер файла составляет 16 эксабайт (2^64 байт), что теоретически позволяет хранить на одном разделе более 2 миллиардов фильмов в разрешении 4K.
- Разработчик UFS Маршалл Кирк Маккьюсик впоследствии участвовал в создании файловой системы ZFS (совместно с Sun Microsystems).
- В FreeBSD существует возможность использовать UFS с включённым журналированием (gjournal), что обеспечивает более высокую устойчивость к сбоям, чем soft updates.
Источники
- Marshall Kirk McKusick, William N. Joy, Samuel J. Leffler, Robert S. Fabry. «A Fast File System for UNIX» (1984).
- FreeBSD Handbook. «Chapter 8: File Systems» (FreeBSD Documentation Project).
- «The Design and Implementation of the 4.4BSD Operating System» (Addison-Wesley, 1996).
- Linux Kernel Documentation: «UFS Filesystem» (kernel.org).
- «UFS2: The Next Generation of the Unix File System» (USENIX Annual Technical Conference, 2002).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →