XFS (Русский)

Ссылки по теме
Файловые системы
Состояние перевода:
На этой странице представлен перевод статьи
XFS
. Дата последней синхронизации: 23 августа 2020. Вы можете
помочь
синхронизировать перевод, если в английской версии произошли
изменения
.
XFS — высокопроизводительная журналируемая файловая система, созданная Silicon Graphics, Inc. XFS особенно хорошо справляется с параллельным вводом-выводом благодаря структуре на основе заголовков для групп (allocation groups), что обеспечивает исключительную масштабируемость потоков ввода-вывода, пропускной способности файловой системы, размера файлов и файловой системы при работе с несколькими устройствами хранения.
Установка
Установите
пакет
xfsprogs
для получения утилит XFS в пространстве пользователя. Данный пакет содержит средства, необходимые для управления файловой системой XFS.
Создание
Для создания новой файловой системы на устройстве используйте:
# mkfs.xfs
device
В целом, параметры по умолчанию оптимальны для обычного использования.
[1]
[2]
Пример вывода:
meta-data=/dev/device            isize=256    agcount=4, agsize=3277258 blks
         =                       sectsz=512   attr=2
data     =                       bsize=4096   blocks=13109032, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0
log      =internal log           bsize=4096   blocks=6400, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
Tip
* По желанию можно присвоить файловой системе метку, используя опцию
-L
label
.
При использовании
mkfs.xfs
на блочном устройстве, содержащем существующую файловую систему, добавьте опцию
-f
для перезаписи этой файловой системы.
[3]
.
Эта операция уничтожит все данные, содержащиеся в предыдущей файловой системе
.
Note
После создания файловой системы XFS её размер не может быть уменьшен. Однако её можно увеличить с помощью команды xfs_growfs.
[4]
Смотрите
#Изменение размера
.
Контрольная сумма
xfsprogs
В версии 3.2.0 был представлен новый дисковый формат (v5), включающий схему контрольной суммы метаданных под названием
Self-Describing Metadata
[
устаревшая ссылка
2024-03-03 ⓘ]
. Основанная на CRC32, она обеспечивает, например, дополнительную защиту от повреждения метаданных при неожиданном отключении питания. Контрольная сумма включена по умолчанию при использовании
xfsprogs
3.2.3 или более поздней версии. Если вам нужен монтируемый xfs с возможностью чтения-записи для более старого ядра, ее можно легко отключить с помощью ключа
-m crc=0
при вызове
mkfs.xfs(8)
:
# mkfs.xfs -m crc=0 /dev/
target_partition
Note
Отключение CRC метаданных также приведет к отключению поддержки функций
#B-дерево со свободными inode
,
#Reverse mapping btree
и
#Большие метки времени
, описанных ниже, а также "reference count btrees" (см.
mkfs.xfs(8) § OPTIONS
для подробностей).
Формат XFS v5 на диске считается стабильным для производственных нагрузок, начиная с версии Linux Kernel 3.15.
Note
В отличие от
Btrfs
и
ZFS
, контрольная сумма CRC32 применяется только к метаданным, но не к фактическим данным.
B-дерево со свободными inode
Начиная с Linux 3.16, в XFS добавлено btree, которое отслеживает свободные inode. Оно эквивалентно существующему дереву распределения инодов, за исключением того, что дерево свободных инодов отслеживает куски инодов с хотя бы одним свободным инодом. Целью является улучшение поиска кластеров свободных inode для распределения inode. Это улучшает производительность на старых файловых системах, т.е. спустя месяцы или годы, когда вы добавили и удалили миллионы файлов в/из файловой системы. Использование этой функции не влияет на общий уровень надежности файловой системы или возможности восстановления.
Эта функция опирается на новый дисковый формат v5, который считается стабильным для производственных рабочих нагрузок, начиная с Linux Kernel 3.15. Она не изменяет существующие структуры на диске, но добавляет новую, которая должна оставаться согласованной с btree распределения инодов; по этой причине старые ядра смогут монтировать только для чтения, файловые системы с функцией free inode btree.
Эта функция включена по умолчанию при использовании xfsprogs 3.2.3 или более поздней версии. Если вам нужна файловая система с возможностью записи для старых ядер, ее можно отключить с помощью ключа
finobt=0
при форматировании раздела XFS. Вам также понадобится
crc=0
:
# mkfs.xfs -m crc=0,finobt=0 /dev/
target_partition
или коротко (потому что
finobt
зависит от
crc
):
# mkfs.xfs -m crc=0 /dev/
target_partition
Reverse mapping btree
Обратное отображение btree по своей сути является
вторичным индексом использования пространства хранения, который эффективно обеспечивает избыточную копию первичных метаданных об использовании пространства. Это добавляет некоторые накладные расходы на операции с файловой системой, но его включение в файловую систему делает перекрестные ссылки очень быстрыми. Это важная функция для восстановления файловых систем в режиме онлайн, поскольку мы можем восстановить поврежденные первичные метаданные из вторичной копии.
[5]
В Linux 4.16 эта функция вышла из статуса ЭКСПЕРИМЕНТАЛЬНОЙ и готова к использованию на производстве. Однако онлайн проверка и восстановление файловой системы является (пока) единственным случаем использования этой функции, поэтому она будет оставаться опциональной, по крайней мере, до тех пор, пока онлайн проверка не перейдет в статус производственной готовности.
С сайта
mkfs.xfs(8) § OPTIONS
:
Обратное отображение btree сопоставляет блоки файловой системы с владельцем блока файловой системы. Большинство сопоставлений будет связано с номером inode и смещением, но есть и сопоставления с метаданными файловой системы. Эти вторичные метаданные могут быть использованы для проверки первичных метаданных или для точного определения того, какие данные были потеряны при ошибке диска.
Смотрите также
[6]
and
[7]
для дополнительной информации.
Чтобы опробовать эту возможность или защитить новые файловые системы, передайте параметр
-m rmapbt=1
при создании файловой системы:
# mkfs.xfs -m rmapbt=1
device
Большие метки времени
Начиная с Linux 5.10, XFS поддерживает использование рефакторинговых функций кодирования временных меток и инодов для работы с временными метками в виде 64-битного наносекундного счетчика и сдвига битов для увеличения эффективного размера. Это теперь позволяет XFS работать намного дольше, чем
Year 2038 problem
до 2486 года. Создание новой файловой системы XFS с включенной функцией
bigtime
позволяет использовать диапазон временных меток с декабря 1901 по июль 2486 года, а не с декабря 1901 по январь 2038 года. Эта функция также позволит использовать таймеры квот с января 1970 по июль 2486, а не с января 1970 по февраль 2106.
Апгрейд
Проверьте, включена ли в существующей файловой системе функция bigtime с помощью
xfs_info(8)
:
# xfs_info / | grep bigtime
... bigtime=0 ...
В
xfsprogs
5.11 и новее вы можете обновить существующую (несмонтированную) файловую систему с помощью
xfs_admin(8)
:
# xfs_admin -O bigtime=1
device
Или с помощью
xfs_repair(8)
:
# xfs_repair -c bigtime=1
device
Там же вы можете включить
inobtcount
(еще одно новое значение по умолчанию).
Производительность
Просто создайте файловую систему XFS, чтобы достичь оптимальной скорости:
# mkfs.xfs /dev/
необходимый_раздел
В XFS
все улучшения включены по умолчанию
(англ.).
Смотрите также
xfs(5)
для получения информации о доступных параметрах монтирования.
Совет
При использовании XFS на устройствах с
RAID
(англ.), улучшить производительность можно с помощью
largeio
,
swalloc
, увеличенными значениями
logbsize
,
allocsize
и так далее. В следующих статьях предоставлена дополнительная информация об этих флагах:
https://www.beegfs.io/wiki/StorageServerTuning
(англ.)
https://help.marklogic.com/Knowledgebase/Article/View/505/0/recommended-xfs-settings-for-marklogic-server
(англ.)
Размер и ширина полосы (stripe)
Если файловая система будет использоваться на чередующемся RAID-массиве, можно значительно повысить скорость, указав размер полосы (англ. stripe) в команде
mkfs.xfs(8)
.
XFS иногда определяет "геометрию" программного RAID-массива, но если она изменяется или используется аппаратный RAID, то см. статью "
How to calculate the correct sunit,swidth values for optimal performance
" (англ.).
Время доступа
В некоторых файловых системах можно повысить производительность, добавив параметр монтирования
noatime
в файле
/etc/fstab
. Для XFS стандартным поведением atime является
relatime
, которое почти не имеет накладных расходов по сравнению с noatime, но при этом сохраняет нормальные значения atime. Все файловые системы Linux теперь используют это в качестве значения по умолчанию (примерно с версии 2.6.30), но XFS использует relatime-поведение с 2006 года, поэтому нет никакой необходимости использовать noatime по соображениям производительности.
Кроме того,
noatime
подразумевает
nodiratime
, поэтому нет необходимости указывать
nodiratime
при уже заданном
noatime
.
Discard
Несмотря на то, что XFS поддерживает async discard
[8]
начиная с ядра 4.7
[9]
[10]
,
xfs(5)
все еще рекомендуется
использовать приложение
fstrim
для удаления неиспользуемых блоков, а не опцию discard mount, поскольку эта опция довольно сильно влияет на производительность.
Дефрагментация
Хотя основанная на экстентах природа XFS и используемая стратегия отложенного размещения значительно повышают устойчивость файловой системы к проблемам фрагментации, XFS предоставляет утилиту
xfs_fsr
(сокращение от "реорганизатора файловой системы XFS") для дефрагменентации файлов на смонтированной и активной файловой системе XFS. Также полезно периодически проверять фрагментацию XFS.
xfs_fsr(8)
улучшает организацию смонтированных файловых систем. Алгоритм реорганизации работает с одним файлом за раз, сжимая или улучшая размещение экстентов файла (последовательных блоков данных файла).
Проверка уровня фрагментации
Проверить уровень фрагментации в данный момент можно следующей командой:
# xfs_db -c frag -r /dev/sda3
Выполнение дефрагментации
Используйте команду
xfs_fsr(8)
, чтобы начать дефрагментацию:
# xfs_fsr /dev/sda3
Дедупликация
Функция
reflink
, доступная с версии ядра 4.9 и включенная по умолчанию с
mkfs.xfs
версии 5.1.0, позволяет создавать быстрые reflink копии файлов, а также дедупликацию после факта, аналогично
btrfs
Рефлинковые копии
Копии Reflink изначально не используют дополнительного пространства:
$ cp --reflink bigfile1 bigfile2
Пока любой из файлов не будет отредактирован, происходит копирование при записи. Это может быть очень полезно для создания моментальных снимков (больших) файлов.
Дедупликация
Существующие файловые системы могут быть дедуплицированы с помощью таких инструментов, как
duperemove
.
Внешний журнал XFS
Использование внешнего лога (журнала метаданных), например, на
SSD (Русский)
, может улучшить производительность
[11]
[
устаревшая ссылка
2025-08-16 ⓘ]
. См.
mkfs.xfs(8)
для получения информации о параметре
logdev
.
Важно
Учтите, что использование флеш-памяти для этих целей может ускорить износ диска. См. раздел
Improving performance#Reduce disk reads/writes
(англ.) для получения информации об износе SSD.
Укажите опцию
-l logdev=device,size=size
команде
mkfs.xfs
для резервации внешнего журнала определённого размера при создании файловой системы XFS. Если пропустить параметр
size
, размер журнала будет зависеть от размера ФС. Укажите опцию
-o logdev=device
команде
mount
для монтирования XFS с использованием внешнего журнала.
Интервал синхронизации
В XFS существует отдельная переменная
sysctl
для настройки
интервала обратной записи
(англ. writeback interval).  По умолчанию в Arch используется значение "3000". Возможно также задать и большее значение, однако стоит учитывать, что слишком большое значение может привести к потери данных в некоторых случаях:
/etc/sysctl.d/20-xfs-sync-interval.conf
fs.xfs.xfssyncd_centisecs = 10000
Администрирование
Изменение размера
Примечание
На данный момент XFS
не поддерживает
уменьшение размера ФС.
XFS позволяет изменять размер файловой системы "на лету". Достаточно выполнить
xfs_growfs
с указанием точки монтирования, что расширит файловую систему до максимально возможного размера.
# xfs_growfs
/путь/к/точке/монтирования
Проверка метаданных "на лету" (scrub)
Важно
Эта программа является
экспериментальной
, соответственно, её поведение и интерфейс могут измениться в любое время, см.
xfs_scrub(8)
.
xfs_scrub
запрашивает ядро очистить (англ. scrub) все объекты метаданных в XFS.Записи метаданных сканируются на очевидно ошибочные значения, после чего перекрёстно ссылаются на остальные метаданные. Это делается для того, чтобы иметь достаточно уверенности в целостности всей файловой системы, анализируя отдельные записи метаданных на фоне остальных метаданных в файловой системе. Повреждённые метаданные можно восстановить из других метаданных при наличии неповреждённых избыточных структур данных.
Включите
и
запустите
xfs_scrub_all.timer
для периодической проверки метаданных всех файловых систем XFS "на лету".
Примечание
Для удобства, можно
отредактировать
xfs_scrub_all.timer
: таймер выполняется каждое воскресенье в 3:10 и
сразу же запускается
, если последний запуск был пропущен (например, так как система была выключена).
Восстановление файловой системы XFS
Note
В отличие от других файловых систем Linux,
xfs_repair
не запускается во время загрузки, даже если файловая система XFS не была чисто размонтирована. В случае нечистого размонтирования,
xfs_repair
просто воспроизводит журнал во время монтирования, обеспечивая целостность файловой системы.
[12]
С сайта
Checking and Repairing an XFS File System
:
Если вы не можете смонтировать файловую систему XFS, вы можете использовать команду
xfs_repair -n
для проверки ее согласованности. Обычно эту команду выполняют только для устройства немонтируемой файловой системы, в которой, по вашему мнению, есть проблема. Команда
xfs_repair -n
выводит вывод, указывающий на изменения, которые будут внесены в файловую систему в случае, если потребуется выполнить операцию восстановления, но не изменяет файловую систему напрямую.
Если вы можете подключить файловую систему и у вас нет подходящей резервной копии, вы можете использовать
xfsdump
, чтобы попытаться создать резервную копию существующих данных файловой системы. Однако команда может не сработать, если метаданные файловой системы слишком повреждены.
Вы можете использовать команду
xfs_repair
для попытки восстановления файловой системы XFS, указанного устройства. Команда воспроизводит журнал регистрации, чтобы исправить любые несоответствия, которые могли возникнуть в результате того, что файловая система не была чисто размонтирована. Если в файловой системе нет несоответствий, обычно нет необходимости использовать эту команду, так как журнал воспроизводится каждый раз, когда вы монтируете файловую систему XFS.
Сначала размонтируйте файловую систему, затем запустите инструмент
xfs_repair(8)
:
# umount /dev/sdxY
# xfs_repair
device
Если журнал был поврежден, вы можете сбросить журнал, указав опцию
-L
для
xfs_repair
.
Warning
Утилита
xfs_repair
не может восстановить файловую систему XFS с грязным журналом. Чтобы очистить журнал, смонтируйте и размонтируйте файловую систему XFS. Если журнал поврежден и не может быть воспроизведен, используйте опцию
-L
("принудительное обнуление журнала") для очистки журнала, то есть
xfs_repair -L /dev/device
. Имейте в виду, что это может привести к дальнейшему повреждению или потере данных.
[13]
Warning
Сброс журнала может привести к тому, что файловая система окажется в непоследовательном состоянии, что приведет к потере и повреждению данных. Если у вас нет опыта отладки и восстановления файловых систем XFS с помощью
xfs_db
, рекомендуется вместо этого воссоздать файловую систему и восстановить ее содержимое из резервной копии.
[14]
Если вы не можете смонтировать файловую систему или у вас нет подходящей резервной копии, запуск
xfs_repair
- единственный возможный вариант, если у вас нет опыта использования
xfs_db
.
xfs_db
предоставляет внутренний набор команд, позволяющий отлаживать и восстанавливать файловую систему XFS вручную. Команды позволяют выполнять сканирование файловой системы, перемещаться и отображать ее структуры данных. Если указать опцию
-x
для включения экспертного режима, можно изменять структуры данных.
# xfs_db [-x] device
Для получения дополнительной информации смотрите
xfs_db(8)
и
xfs_repair(8)
, а также команду
help
в разделе
xfs_db
.
См. также
Какие факторы влияют на использование памяти xfs_repair?
и
XFS Repair
.
Восстановление данных
Даже при монтировании только на чтение с помощью
mount -o ro
журнал файловой системы XFS будет воспроизведен, если она не была размонтирована начисто.
Возможны ситуации, когда скомпрометированная файловая система XFS на поврежденном устройстве хранения должна быть смонтирована только для чтения, чтобы можно было надежно скопировать с нее файлы без дальнейшего повреждения, но ее нельзя смонтировать, потому что она не была размонтирована начисто и повреждена настолько, что журнал не может быть воспроизведен.
Также учтите, что воспроизведение журнала означает запись в поврежденную файловую систему, что само по себе может быть плохой идеей.
Чтобы смонтировать файловую систему XFS без записи на нее и без воспроизведения журнала, используйте
mount -o ro,norecovery
.
Undelete
xfs_undelete-git
AUR
может восстановить (при определенных условиях) удаленные файлы на несмонтированной или смонтированной только для чтения файловой системе XFS.  Дополнительную информацию см. на
https://github.com/ianka/xfs_undelete
.
Решение проблем
Квота корневой файловой системы
Параметры монтирования XFS (
uquota
,
gquota
,
prjquota
и т.д.) не выполняются во время повторного монтирования файловой системы. Чтобы включить квоту корневой файловой системы, параметр монтирования должен быть передан initramfs как
параметр ядра
rootflags=
. Впоследствии его не следует указывать среди параметров монтирования в
/etc/fstab
для корневой (
/
) файловой системы.
Примечание
Существуют некоторые различия между квотой XFS и стандартной
дисковой квотой
(англ.) Linux, также стоит прочитать статью
https://inai.de/linux/adm_quota
(англ.).
xfs_scrub_all отказывается работать, если пользователь "nobody" не может получить доступ к точке монтирования
При запуске
xfs_scrub_all
также запускается
xfs_scrub@.service
для каждой примонтированной файловой системы XFS. Данная служба запускается от пользователя
nobody
и соответственно, если
nobody
не может перейти в директорию, команда завершится со следующей ошибкой:
xfs_scrub@
точка_монтирования
.service: Changing to the requested working directory failed: Permission denied
xfs_scrub@
точка_монтирования
.service: Failed at step CHDIR spawning /usr/bin/xfs_scrub: Permission denied
xfs_scrub@
точка_монтирования
.service: Main process exited, code=exited, status=200/CHDIR
Чтобы разрешить запуск службы, измените
разрешения
точки монтирования таким образом, чтобы у пользователя
nobody
были права на выполнение.
Смотрите также
XFS FAQ
(англ.)
Improving Metadata Performance By Reducing Journal Overhead
(англ.)
Статья об XFS на Википедии