Введение

Журнальная файловая система

XFS — это высокопроизводительная 64-битная журнальная файловая система, разработанная компанией Silicon Graphics, Inc (SGI) в 1993 году. Она была файловой системой по умолчанию в операционной системе SGI IRIX, начиная с версии 5.3. XFS был портирован в ядро Linux в 2001 году; по состоянию на июнь 2014 года XFS поддерживается большинством дистрибутивов Linux; Red Hat Enterprise Linux использует её в качестве файловой системы по умолчанию. XFS отличается высокой эффективностью при выполнении параллельных операций ввода/вывода (I/O) благодаря своей архитектуре, основанной на группах выделения (тип подразделения физических томов, используемых в XFS, также обозначаемых как AG). Это обеспечивает XFS исключительную масштабируемость потоков ввода/вывода, пропускной способности файловой системы, а также размера файлов и самой файловой системы при использовании нескольких физических устройств хранения. XFS гарантирует целостность данных за счет журналирования метаданных и поддержки барьеров записи. Выделение пространства осуществляется посредством экстентов, структуры данных которых хранятся в B+ деревьях, что повышает общую производительность файловой системы, особенно при работе с большими файлами. Отложенное выделение помогает предотвратить фрагментацию файловой системы; также поддерживается онлайн-дефрагментация. Уникальной особенностью XFS является предварительное резервирование пропускной способности ввода/вывода с заранее заданной скоростью, что подходит для многих приложений реального времени. Однако эта функция поддерживалась только в IRIX и только со специализированным аппаратным обеспечением.

История

Silicon Graphics начала разработку XFS ("X" предполагалось заполнить позже, но этого так и не произошло) в 1993 году. Файловая система была выпущена под лицензией GNU General Public License (GPL) в мае 1999 года. Команда под руководством Стива Лорда из SGI портировала её на Linux, а первый дистрибутив Linux предоставил поддержку в 2001 году. Эта поддержка постепенно стала доступна практически во всех дистрибутивах Linux. Первоначальная поддержка XFS в ядре Linux была реализована через патчи от SGI. Она была включена в основную ветку ядра Linux для серии 2.6, а также отдельно – в феврале 2004 года в серии 2.4, в версии 2.4.25, что сделало XFS практически универсально доступной на системах Linux. Gentoo Linux стал первым дистрибутивом Linux, предложившим XFS в качестве файловой системы по умолчанию в середине 2002 года. FreeBSD добавила поддержку XFS в режиме «только чтение» в декабре 2005 года, а в июне 2006 года представила экспериментальную поддержку записи. Однако это предназначалось лишь для облегчения миграции с Linux, а не для использования в качестве «основной» файловой системы. FreeBSD 10 отказалась от поддержки XFS. В 2009 году версия 5.4 64-битного дистрибутива Red Hat Enterprise Linux (RHEL) содержала необходимую поддержку ядра для создания и использования файловых систем XFS, но не включала соответствующие инструменты командной строки. Инструменты, доступные из CentOS, могли использоваться для этой цели, и Red Hat также предоставляла их клиентам RHEL по запросу. RHEL 6.0, выпущенная в 2010 году, включает поддержку XFS за дополнительную плату как часть дополнения Red Hat "масштабируемая файловая система". Oracle Linux 6, выпущенная в 2011 году, также предоставляет возможность использования XFS. RHEL 7.0, выпущенная в июне 2014 года, использует XFS в качестве файловой системы по умолчанию, включая поддержку использования XFS для раздела /boot, что ранее было непрактично из-за ошибок в загрузчике GRUB. В ядре Linux 4.8, в августе 2016 года, была добавлена новая функция – «обратное отображение». Она является основой для большого набора запланированных функций: снимки, копирование данных при записи (COW), дедупликация данных, рефлинки, онлайн-очистка данных и метаданных, высокоточная отчетность о потере данных или поврежденных секторах и значительное улучшение восстановления поврежденных или поврежденных файловых систем. Для этой работы потребовались изменения в формате диска XFS. В ядре Linux 5.10, выпущенном в декабре 2020 года, был представлен «bigtime» – для хранения временных меток inode в виде 64-битного наносекундного счетчика вместо традиционного 32-битного секундочного счетчика. Это отодвигает проблему 2038 года на 2486 год.

Пропускная способность

XFS — это 64-битная файловая система, поддерживающая максимальный размер файловой системы в 8 экзибайт минус один байт (263 − 1 байт). Однако ограничения, накладываемые операционной системой, могут уменьшить этот предел. На 32-битных системах Linux размер как файла, так и файловой системы ограничен 16 тебибайтами.

Содержание дневника

В современных вычислениях, журналирование – это функция, обеспечивающая целостность данных в файловой системе, несмотря на возможные отключения питания или сбои системы. XFS обеспечивает журналирование метаданных файловой системы, при котором обновления файловой системы сначала записываются в последовательный журнал, а затем применяются к фактическим блокам диска. Журнал представляет собой кольцевой буфер дисковых блоков, который не считывается в ходе обычной работы файловой системы. Журнал XFS может располагаться в разделе данных файловой системы (в виде внутреннего журнала) или на отдельном устройстве для снижения конкуренции за дисковые ресурсы. В XFS журнал преимущественно содержит записи, описывающие измененные файловой системой части дисковых блоков. Обновления журнала выполняются асинхронно для предотвращения снижения производительности. В случае сбоя системы, операции файловой системы, выполненные непосредственно перед сбоем, могут быть повторно применены и завершены на основе записей в журнале, что обеспечивает целостность данных, хранящихся в файловых системах XFS. Восстановление выполняется автоматически при первом монтировании файловой системы после сбоя. Скорость восстановления зависит не от размера файловой системы, а от объема операций файловой системы, которые необходимо повторно применить.

Группы распределения

Файловые системы XFS внутренне разделены на группы распределения, представляющие собой линейные области одинакового размера внутри файловой системы. Файлы и каталоги могут занимать несколько групп распределения. Каждая группа распределения независимо управляет своими inode и свободным пространством, обеспечивая масштабируемость и параллелизм, позволяющие нескольким потокам и процессам одновременно выполнять операции ввода-вывода в одной файловой системе. Такая архитектура способствует оптимизации параллельной производительности ввода-вывода в системах с несколькими процессорами и/или ядрами, поскольку обновления метаданных также могут выполняться параллельно. Внутреннее разделение, обеспечиваемое группами распределения, особенно полезно, когда файловая система размещается на нескольких физических устройствах, что позволяет оптимально использовать пропускную способность базовых компонентов хранения.

Полосатое распределение

Если файловая система XFS должна быть создана на полосатом RAID-массиве, при создании файловой системы можно указать размер полосы. Это позволяет максимизировать пропускную способность, гарантируя, что распределение данных, выделение inode и внутренний журнал (журнал) будут выровнены по размеру полосы.

Распределение по площади

Блоки, используемые в файлах, хранящихся в файловых системах XFS, управляются переменными протяженностями, где одна протяженность описывает один или несколько смежных блоков. Это может значительно сократить список блоков по сравнению с файловыми системами, перечисляющими все используемые файлом блоки по отдельности. Блочно-ориентированные файловые системы управляют выделением пространства с помощью одной или нескольких блочных карт; в XFS эти структуры заменены структурой, ориентированной на протяженности, состоящей из пары B-деревьев для каждой группы выделения файловой системы. Одно из B-деревьев индексируется по длине свободных протяженностей, а другое – по начальному блоку свободных протяженностей. Эта схема двойной индексации обеспечивает высокоэффективное выделение свободных экстентов для операций файловой системы.

Переменные размеры блоков

Размер блока файловой системы представляет собой минимальный размер выделяемой единицы. XFS позволяет создавать файловые системы с размерами блоков в диапазоне от 512 байт до 64 КБ, что позволяет оптимизировать файловую систему под предполагаемый характер использования. Если ожидается большое количество мелких файлов, то небольшой размер блока обычно обеспечивает максимальную емкость, но для системы, работающей преимущественно с крупными файлами, больший размер блока может повысить эффективность работы.

Отсроченное распределение

XFS использует методы отложенного выделения для распределения файлов. Когда файл записывается в буферный кэш, вместо выделения экстентов для данных, XFS просто резервирует соответствующее количество блоков файловой системы под данные, находящиеся в памяти. Фактическое выделение блоков происходит только при окончательной записи данных на диск. Это увеличивает вероятность записи файла в непрерывную группу блоков, снижая фрагментацию и повышая производительность.

Рассеивание файлов

XFS предоставляет 64-битное разреженное адресное пространство для каждого файла, что позволяет работать с очень большими файлами, а также создавать "пробелы" внутри файлов, для которых не выделяется дисковое пространство. Поскольку файловая система использует карту диапазонов для каждого файла, размер карты выделения файлов остается небольшим. Если размер карты выделения слишком велик для хранения в inode, карта перемещается в B+-дерево, что обеспечивает быстрый доступ к данным в любой точке 64-битного адресного пространства, предоставляемого для файла.

Расширенные атрибуты

XFS предоставляет несколько потоков данных для файлов, что стало возможным благодаря реализации расширенных атрибутов. Эти атрибуты позволяют хранить множество пар «имя/значение», связанных с файлом. Имена представляют собой строки печатных символов, завершающиеся нулевым байтом, длиной до 256 байт, а соответствующие значения могут содержать до 64 КБ двоичных данных. Они дополнительно подразделяются на два пространства имен: root и user. Расширенные атрибуты, хранящиеся в пространстве имен root, могут быть изменены только суперпользователем, в то время как атрибуты в пространстве имен user могут быть изменены любым пользователем, имеющим разрешение на запись в файл. Расширенные атрибуты могут быть присоединены к любому типу inode XFS, включая символические ссылки, узлы устройств, каталоги и т. д. Утилита attr позволяет управлять расширенными атрибутами из командной строки, а утилиты xfsdump и xfsrestore учитывают расширенные атрибуты и выполняют резервное копирование и восстановление их содержимого. Многие другие системы резервного копирования не поддерживают работу с расширенными атрибутами.

Прямые вводы и выводы

Для приложений, которым требуется высокая скорость обмена данными с диском, XFS предоставляет реализацию прямого ввода-вывода, позволяющую выполнять некэшированные операции ввода-вывода непосредственно в пользовательском пространстве. Данные передаются между буфером приложения и диском с использованием DMA, что обеспечивает доступ к полной пропускной способности базовых дисковых устройств.

Гарантированная ставка I/O

Система гарантированной скорости ввода-вывода XFS предоставляет API, позволяющий приложениям резервировать пропускную способность файловой системы. XFS динамически вычисляет производительность, доступную от базовых устройств хранения, и резервирует полосу пропускания, достаточную для обеспечения запрошенной производительности в течение заданного времени. Эта функция является уникальной для файловой системы XFS. Гарантированные скорости могут быть "жесткими" или "мягкими", представляя собой компромисс между надежностью и производительностью; однако XFS разрешает "жесткие" гарантии только если базовая подсистема хранения это поддерживает. Эта возможность в основном используется для приложений реального времени, таких как потоковое видео. Гарантированная скорость ввода-вывода поддерживалась только в IRIX и требовала для этого специального оборудования.

DMAPI

XFS реализовал интерфейс DMAPI для поддержки иерархического управления хранилищем в IRIX. По состоянию на октябрь 2010 года реализация XFS в Linux поддерживала необходимые метаданные на диске для реализации DMAPI, однако поддержка в ядре, по сообщениям, была неработоспособной. В течение некоторого времени SGI поддерживала ветку ядра, включающую хуки DMAPI, но эта поддержка не получала должного развития, хотя разработчики ядра заявляли о намерении актуализировать её.

Снимок

XFS пока не предоставляет прямой поддержки снимков, поскольку в настоящее время предполагает, что процесс создания снимков должен быть реализован менеджером томов. Создание снимка файловой системы XFS включает в себя временную приостановку операций ввода/вывода в файловой системе с помощью утилиты xfs freeze, выполнение фактического создания снимка менеджером томов, а затем возобновление операций ввода/вывода для продолжения нормальной работы. Затем снимок можно смонтировать только для чтения для целей резервного копирования. Версии XFS в IRIX включали интегрированный менеджер томов под названием XLV. Этот менеджер томов не был портирован на Linux, и XFS работает со стандартным LVM в системах Linux. В последних ядрах Linux функциональность xfs freeze реализована в слое VFS и выполняется автоматически при вызове функциональности создания снимков менеджером томов. Это когда-то было значительным преимуществом, поскольку файловую систему ext3 нельзя было приостановить, и менеджер томов не мог создать согласованный "горячий" снимок для резервного копирования сильно загруженной базы данных. К счастью, это больше не так. Начиная с Linux 2.6.29, файловые системы ext3, ext4, GFS2 и JFS также имеют функцию заморозки.

Онлайн-дефрагментация

Хотя масштабируемая природа XFS и используемая ею стратегия отложенного выделения значительно повышают устойчивость файловой системы к фрагментации, XFS предоставляет утилиту дефрагментации файловой системы (xfs fsr, сокращение от XFS filesystem reorganizer), которая может дефрагментировать файлы на смонтированной и активной файловой системе XFS.

Онлайн-рост

XFS предоставляет утилиту xfs growfs для онлайн-расширения файловых систем XFS. Файловые системы XFS можно расширять, пока на устройстве, содержащем файловую систему, имеется неиспользованное пространство. Эта функция обычно используется совместно с системами управления томами, поскольку в противном случае потребуется отдельно увеличивать размер раздела, на котором размещена файловая система.

Недостатки

Файловые системы XFS не могут быть уменьшены на месте (по состоянию на 2023 год), хотя обсуждались различные обходные пути. Операции с метаданными в XFS были медленнее по сравнению с файловыми системами с журналированием, реализованными позднее и разработанными для работы с гораздо большими журналами, что приводило, например, к снижению производительности при удалении большого количества файлов. Однако, новая функция XFS, разработанная Джоном Нельсоном и называемая отложенным журналированием, доступная начиная с версии 2.6.39 основного ядра Linux, заявлена как решение этой проблемы. Результаты тестов производительности, проведенных разработчиком в 2010 году, показали производительность, сопоставимую с ext4 при небольшом количестве потоков, и превосходящую при большом количестве потоков. Отключить журналирование невозможно. Однако XFS может записывать журнал на внешнее блочное устройство.