Введение

Файловая система, используемая многими Unix и Unix-подобными операционными системами, реализация файловой системы в некоторых операционных системах Unix и BSD. Целью BSD FFS является попытка локализовать связанные блоки данных и метаданные в одной группе цилиндров и, в идеале, всё содержимое каталога (как данные, так и метаданные всех файлов) в одной или соседних группах цилиндров, тем самым уменьшая фрагментацию, вызванную рассеиванием содержимого каталога по всему диску. Некоторые параметры производительности в суперблоке включали количество дорожек и секторов, скорость вращения диска, скорость движения головок и выравнивание секторов между дорожками. В полностью оптимизированной системе головка могла перемещаться между близкими дорожками для чтения разбросанных секторов с чередующихся дорожек, ожидая вращения диска. По мере увеличения размеров дисков оптимизация на уровне секторов устарела (особенно на дисках с линейной нумерацией секторов и переменным количеством секторов на дорожку). С увеличением размеров дисков и файлов фрагментированные чтения стали более серьёзной проблемой. Для борьбы с этим BSD первоначально увеличил размер блока файловой системы с одного сектора до 1 КБ в 4.0 BSD; а в FFS – увеличил размер блока файловой системы с 1 КБ до 8 КБ. Это имеет несколько последствий. Вероятность непрерывного расположения секторов файла значительно возрастает. Уменьшается объём служебной информации для перечисления блоков файла, при этом увеличивается количество байтов, представимых заданным числом блоков. Также становятся возможными диски большего размера, поскольку максимальное количество блоков ограничено фиксированной разрядностью номера блока. Однако при больших размерах блоков диски с множеством мелких файлов будут неэффективно использовать пространство, поскольку каждый файл должен занимать как минимум один блок. В связи с этим BSD добавил фрагментацию на уровне блоков, также называемую субалокацией блоков, объединением хвостов или упаковкой хвостов, когда последний частичный блок данных из нескольких файлов может быть сохранён в одном "фрагментном" блоке вместо нескольких почти пустых блоков. Работа над Berkeley FFS была широко принята другими производителями Unix, а семейство файловых систем, произошедших от неё, коллективно известно как UFS.

Реализация

Продавцы некоторых проприетарных систем Unix, таких как SunOS / Solaris, System V Release 4, HP UX и Tru64 UNIX, а также открытых систем Unix, таких как illumos, приняли UFS. Большинство из них адаптировали UFS к собственным нуждам, добавив проприетарные расширения, которые могут быть не распознаны другими версиями Unix. Многие продолжали использовать оригинальный размер блока и ширину полей данных, как в оригинальном UFS, поэтому некоторая степень совместимости при чтении сохраняется между платформами. Совместимость между реализациями в целом оставляет желать лучшего. Начиная с Solaris 7, Sun Microsystems включила UFS Logging, которая внедрила журналирование файловой системы в UFS, и эта функция до сих пор доступна в текущих версиях Solaris и illumos. Solaris UFS также имеет расширения для больших файлов и дисков, а также другие возможности. В 4.4BSD и BSD Unix системах, производных от неё, таких как FreeBSD, NetBSD, OpenBSD и DragonFlyBSD, реализация UFS1 и UFS2 разделена на два уровня: верхний уровень, обеспечивающий структуру каталогов и поддерживающий метаданные (права доступа, владение и т. д.) в структуре inode, и нижние уровни, предоставляющие контейнеры данных, реализованные как inodes. Это было сделано для поддержки как традиционной FFS, так и LFS-системы файлов с общим кодом для общих функций. Верхний уровень называется "UFS", а нижние уровни называются "FFS" и "LFS". В некоторых из этих систем термин "FFS" используется для обозначения комбинации нижнего уровня FFS и верхнего уровня UFS, а термин "LFS" — для обозначения комбинации нижнего уровня LFS и верхнего уровня UFS. Кирк Маккусик реализовал перераспределение блоков — технику, которая переупорядочивает блоки в файловой системе непосредственно перед записью, чтобы уменьшить фрагментацию и контролировать старение файловой системы. Он также реализовал мягкие обновления — механизм, который поддерживает целостность файловой системы, не ограничивая производительность, как это делал традиционный режим синхронизации. Это имеет побочный эффект снижения необходимости проверки файловой системы после сбоя или отключения питания. Для устранения оставшихся проблем после сбоя была введена фоновая утилита fsck. В UFS2 Кирк Маккусик и Пол Хеннинг Камп расширили слои FreeBSD FFS и UFS, чтобы добавить 64-битные указатели блоков (позволяющие создавать тома объёмом до 8 зебибайт), блоки переменного размера (аналогичные экстентам), расширенные поля флагов, дополнительные метки времени создания, расширенную поддержку атрибутов и POSIX ACL. UFS2 стала поддерживаемой версией UFS, начиная с FreeBSD 5.0. FreeBSD также представила мягкие обновления и возможность создания снимков файловой системы как для UFS1, так и для UFS2. Эти функции были портированы в NetBSD, но в конечном итоге мягкие обновления (называемые мягкими зависимостями в NetBSD) были удалены из NetBSD 6.0 в пользу менее сложного механизма журналирования файловой системы под названием WAPBL (также называемого журналированием), который был добавлен в FFS в NetBSD 5.0. OpenBSD поддерживает мягкие обновления с версии 2.9 и имеет поддержку UFS2 (FFS2) (без ACL) с версии 4.2. OpenBSD теперь сделала UFS2 версией UFS по умолчанию, и она будет включена в релиз 6.7. Начиная с FreeBSD 7.0, UFS также поддерживает журналирование файловой системы с использованием провайдера GEOM gjournal. FreeBSD 9.0 добавляет поддержку легковесного журналирования поверх мягких обновлений (SU+J), что значительно снижает необходимость в фоновом fsck и поддерживает NFSv4 ACL. FreeBSD, NetBSD, OpenBSD и DragonFly BSD также включают систему Dirhash, разработанную Яном Доусом. Эта система поддерживает хэш-таблицу в памяти для ускорения поиска в каталогах. Dirhash решает ряд проблем с производительностью, связанных с большими каталогами в UFS. Linux включает реализацию UFS для обеспечения двоичной совместимости на уровне чтения с другими Unix-системами, но поскольку нет стандартной реализации для расширений поставщиков UFS, Linux не имеет полной поддержки записи в UFS. Нативная файловая система Linux ext2 была вдохновлена UFS1, но не поддерживает фрагменты, и нет планов по реализации мягких обновлений. (В некоторых системах, производных от 4.4BSD, слой UFS может использовать слой ext2 в качестве контейнерного слоя, как и FFS и LFS.) NeXTStep, производная от BSD, также использовала версию UFS. В Mac OS X от Apple она была доступна как альтернатива HFS+, их проприетарной файловой системе. Однако, начиная с Mac OS X Leopard, установка Mac OS X на том, отформатированный в UFS, стала невозможной. Кроме того, нельзя обновить старые версии Mac OS X, установленные на томах, отформатированных в UFS, до Leopard; обновление требует переформатирования загрузочного тома. В Mac OS X существовало ограничение на размер файла в 4 ГБ для дисков, отформатированных в UFS. Начиная с Mac OS X Lion, поддержка UFS была полностью прекращена.