XFS — высокомасштабируемая высокопроизводительная файловая система, изначально разработанная в Silicon Graphics.
XFS поддерживает журналирование метаданных, что ускоряет восстановление после сбоев. Файловую систему XFS можно дефрагментировать и увеличивать в размерах, пока она смонтирована и активна.
XFS обладает следующими схемами распределения пространства:
- Выделение на основе экстентов (extent-based allocation)
- Политики распределения с учетом страйпов (stripe-aware allocation policies)
- Отложенное выделение (delayed allocation)
- Предварительное выделение пространства (space pre-allocation)
Создание или расширение файлов иногда завершается с неожиданной ошибкой записи ENOSPC, даже если места на диске, кажется, достаточно. Это связано с ориентированным на производительность дизайном XFS. На практике это не становится проблемой, так как происходит только в том случае, если оставшееся пространство составляет всего несколько блоков.
Файловая система XFS также поддерживает следующее:
- Расширенные атрибуты (xattr)
Это позволяет системе связывать с каждым файлом несколько дополнительных пар имя/значение. Включено по умолчанию. - Журналирование квот (quota journaling)
Это позволяет избежать длительных проверок целостности квот после сбоя. - Квоты на проекты/каталоги (project/directory quotas)
Это позволяет накладывать квотные ограничения на дерево каталогов. - Временные метки с субсекундной точностью (subsecond timestamps)
Это позволяет использовать временные метки с точностью до долей секунды. - Поведение atime по умолчанию — relatime
Для XFS по умолчанию используется relatime. Это почти не создает дополнительной нагрузки по сравнению с noatime, сохраняя при этом корректные значения времени последнего доступа (atime).
А теперь немного личных рекомендаций.
НЕ РЕКОМЕНДУЮ использовать XFS на системном диске.
Oracle Linux — баг с XFS
На высоконагруженном сервере при использовании файловой системы XFS на системном диске сервер может зависать на пару минут. В проде лучше под систему выделять диски с EXT4, а уже под сам проект, например, БД, использовать отдельные диски с XFS.
EXT4 → XFS
Сегодня простой кейс. Имеется раздел с файловой системой EXT4, меняем его на XFS. Алгоритм:
- Убрать всё с раздела EXT4, отмонтировать.
- Заменить файловую систему.
- Примонтировать раздел, вернуть на него данные.
Первый и третий пункты не интересны, сосредоточимся сразу на втором. Имеем раздел /dev/sdb1, посмотрим файловую систему.
blkid /dev/sdb1Используется EXT4. Заменим на XFS.
mkfs.xfs -f /dev/sdb1Используем ключ force. Естественно, все данные на разделе будут уничтожены.
Посмотрим файловую систему:
blkid /dev/sdb1Используется XFS.

Дополнительно
Проверка и восстановление файловой системы
Ext3/4 запускает утилиту e2fsck в пользовательском пространстве во время загрузки для восстановления журнала при необходимости. В XFS, в сравнении, восстановление журнала выполняется в пространстве ядра во время монтирования. Скрипт fsck.xfs предоставляется, но он не выполняет каких-либо полезных действий, так как существует лишь для удовлетворения требований сценариев инициализации.
Когда требуется проверка или восстановление файловой системы XFS, используйте команду xfs_repair. Используйте опцию -n для проверки в режиме "только чтение".
Команда xfs_repair не будет работать с файловой системой, у которой есть "грязный" журнал. Для восстановления такой файловой системы сначала необходимо выполнить монтирование и размонтирование, чтобы воспроизвести журнал. Если журнал поврежден и не может быть воспроизведен, можно использовать опцию -L для обнуления журнала.
Поведение при ошибках метаданных
Файловая система ext3/4 имеет настраиваемое поведение при обнаружении ошибок метаданных, по умолчанию — просто продолжать работу. Когда XFS сталкивается с неисправимой ошибкой метаданных, она отключает файловую систему и возвращает ошибку EFSCORRUPTED. В системных журналах будут содержаться сведения об обнаруженной ошибке, а также будет рекомендация запустить xfs_repair, если это необходимо.
Квоты
Квоты XFS не являются опцией, которую можно включить при повторном монтировании. Опция -o quota должна быть указана при первоначальном монтировании, чтобы квоты вступили в силу.
Хотя стандартные утилиты из пакета quota могут выполнять основные задачи администрирования квот (такие как setquota и repquota), инструмент xfs_quota может использоваться для специфических функций XFS, например, для администрирования Проектных квот.
Команда quotacheck не оказывает никакого эффекта на файловую систему XFS. При первом включении учета квот XFS автоматически выполняет внутреннюю проверку квот (quotacheck). Поскольку метаданные квот XFS являются полноценным, журналируемым объектом метаданных, система квот всегда будет находиться в согласованном состоянии до тех пор, пока квоты не будут отключены вручную.
Изменение размера файловой системы
У файловой системы XFS нет утилиты для уменьшения размера. Файловые системы XFS могут быть увеличена в режиме онлайн с помощью команды xfs_growfs.
Номера inode
Для файловых систем размером более 1 ТБ с 256-байтными inode или более 2 ТБ с 512-байтными inode, номера inode XFS могут превысить 2^32. Такие большие номера inode приводят к неудачному выполнению 32-битных вызовов stat с возвращаемым значением EOVERFLOW.
Приложения обычно корректно обрабатывают такие большие номера inode. При необходимости смонтируйте файловую систему XFS с параметром -o inode32, чтобы принудительно использовать номера inode ниже 2^32. Обратите внимание, что использование inode32 не влияет на inode, которые уже выделены с 64-битными номерами.
Не используйте опцию inode32, если она не требуется для конкретной среды. Опция inode32 изменяет поведение выделения. Как следствие, может возникнуть ошибка ENOSPC, если в нижних блоках диска нет места для выделения inode.
Спекулятивное предвыделение
XFS использует спекулятивное предвыделение для распределения блоков после конца файла (EOF) по мере записи файлов. Это предотвращает фрагментацию файлов из-за параллельных потоковых операций записи на NFS-серверах. По умолчанию это предвыделение увеличивается с размером файла и будет заметно в выводе команды "du". Если файл со спекулятивным предвыделением не изменялся в течение пяти минут, предвыделение будет отменено. Если inode был вытеснен из кэша раньше этого времени, то предвыделение будет отменено при освобождении inode.
Если наблюдаются преждевременные проблемы ENOSPC из-за спекулятивного предвыделения, фиксированный объем предвыделения может быть указан с помощью опции монтирования -o allocsize=размер.
Фрагментация
Фрагментация редко является значительной проблемой в файловых системах XFS благодаря эвристикам и таким механизмам, как отложенное выделение и спекулятивное предвыделение. Однако существуют инструменты для измерения фрагментации файловой системы, а также для дефрагментации файловых систем. Их использование не поощряется.
Команда xfs_db frag пытается свести все распределения файловой системы к одному числу фрагментации, выраженному в процентах. Для понимания смысла вывода этой команды требуются значительные знания. Например, коэффициент фрагментации 75% означает лишь 4 экстента в среднем на файл. По этой причине вывод frag из xfs_db не считается полезным, и рекомендуется более тщательный анализ любых проблем с фрагментацией.
Команда xfs_fsr может использоваться для дефрагментации отдельных файлов или всех файлов в файловой системе. Последнее особенно не рекомендуется, так как это может разрушить локальность файлов и фрагментировать свободное пространство.
Общие команды для ext3 и ext4 в сравнении с XFS
- Создание файловой системы mkfs.ext4 или mkfs.ext3 → mkfs.xfs
- Проверка файловой системы e2fsck → xfs_repair
- Изменение размера файловой системы resize2fs → xfs_growfs
- Сохранение образа файловой системы e2image → xfs_metadump и xfs_mdrestore
- Установка метки или настройка файловой системы tune2fs → xfs_admin
- Резервное копирование файловой системы dump и restore → xfsdump и xfsrestore
Общие инструменты для ext4 и XFS
- Квоты quota → xfs_quota
- Отображение файла filefrag → xfs_bmap
