Введение
Файловая система, используемая многими Unix и Unix-подобными операционными системами, реализация файловой системы в некоторых операционных системах Unix и BSD. Целью BSD FFS является попытка локализовать связанные блоки данных и метаданные в одной группе цилиндров и, в идеале, всё содержимое каталога (как данные, так и метаданные всех файлов) в одной или соседних группах цилиндров, тем самым уменьшая фрагментацию, вызванную рассеиванием содержимого каталога по всему диску. Некоторые параметры производительности в суперблоке включали количество дорожек и секторов, скорость вращения диска, скорость движения головок и выравнивание секторов между дорожками. В полностью оптимизированной системе головка могла перемещаться между близкими дорожками для чтения разбросанных секторов с чередующихся дорожек, ожидая вращения диска. По мере увеличения размеров дисков оптимизация на уровне секторов устарела (особенно на дисках с линейной нумерацией секторов и переменным количеством секторов на дорожку). С увеличением размеров дисков и файлов фрагментированные чтения стали более серьёзной проблемой. Для борьбы с этим BSD первоначально увеличил размер блока файловой системы с одного сектора до 1 КБ в 4.0 BSD; а в FFS – увеличил размер блока файловой системы с 1 КБ до 8 КБ. Это имеет несколько последствий. Вероятность непрерывного расположения секторов файла значительно возрастает. Уменьшается объём служебной информации для перечисления блоков файла, при этом увеличивается количество байтов, представимых заданным числом блоков. Также становятся возможными диски большего размера, поскольку максимальное количество блоков ограничено фиксированной разрядностью номера блока. Однако при больших размерах блоков диски с множеством мелких файлов будут неэффективно использовать пространство, поскольку каждый файл должен занимать как минимум один блок. В связи с этим BSD добавил фрагментацию на уровне блоков, также называемую субалокацией блоков, объединением хвостов или упаковкой хвостов, когда последний частичный блок данных из нескольких файлов может быть сохранён в одном "фрагментном" блоке вместо нескольких почти пустых блоков. Работа над Berkeley FFS была широко принята другими производителями Unix, а семейство файловых систем, произошедших от неё, коллективно известно как UFS.
the file system implementation in some Unix and BSD operating systems
The intent of BSD FFS is to try to localize associated data blocks and metadata in the same cylinder group and, ideally, all of the contents of a directory (both data and metadata for all the files) in the same or nearby cylinder group, thus reducing fragmentation caused by scattering a directory's contents over a whole disk. Some of the performance parameters in the superblock included number of tracks and sectors, disk rotation speed, head speed, and alignment of the sectors between tracks. In a fully optimized system, the head could be moved between close tracks to read scattered sectors from alternating tracks while waiting for the platter to spin around. As disks grew larger and larger, sector level optimization became obsolete (especially with disks that used linear sector numbering and variable sectors per track). With larger disks and larger files, fragmented reads became more of a problem. To combat this, BSD originally increased the filesystem block size from one sector to 1 K in 4.0 BSD; and, in FFS, increased the filesystem block size from 1 K to 8 K. This has several effects. The chance of a file's sectors being contiguous is much greater. The amount of overhead to list the file's blocks is reduced, while the number of bytes representable by any given number of blocks is increased. Larger disk sizes are also possible, since the maximum number of blocks is limited by a fixed bit width block number. However, with larger block sizes, disks with many small files will waste space, since each file must occupy at least one block. Because of this, BSD added block level fragmentation, also called block suballocation, tail merging, or tail packing, where the last partial block of data from several files may be stored in a single "fragment" block instead of multiple mostly empty blocks. The work on Berkeley FFS was widely adopted by other Unix vendors, and the family of filesystems derived from it are collectively known as 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 была полностью прекращена.