XFS (Русский)
XFS — высокопроизводительная журналируемая файловая система, созданная Silicon Graphics, Inc. XFS особенно хорошо справляется с параллельным вводом-выводом благодаря структуре на основе заголовков для групп (allocation groups), что обеспечивает исключительную масштабируемость потоков ввода-вывода, пропускной способности файловой системы, размера файлов и файловой системы при работе с несколькими устройствами хранения.
Установка
Установите пакет xfsprogs для получения утилит XFS в пространстве пользователя. Данный пакет содержит средства, необходимые для управления файловой системой XFS.
Создание
Для создания новой файловой системы на устройстве используйте:
# mkfs.xfs device
В целом, параметры по умолчанию оптимальны для обычного использования. [1][устаревшая ссылка 2024-10-12 ⓘ][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
-L label
.
- При использовании mkfs.xfs на блочном устройстве, содержащем существующую файловую систему, добавьте опцию
-f
для перезаписи этой файловой системы.[3].Эта операция уничтожит все данные, содержащиеся в предыдущей файловой системе.
После создания файловой системы 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
Формат XFS v5 на диске считается стабильным для производственных нагрузок, начиная с версии Linux Kernel 3.15.
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 все улучшения включены по умолчанию[устаревшая ссылка 2024-10-12 ⓘ] (англ.).
Смотрите также xfs(5) для получения информации о доступных параметрах монтирования.
largeio
, swalloc
, увеличенными значениями logbsize
, allocsize
и так далее. В следующих статьях предоставлена дополнительная информация об этих флагах:
Размер и ширина полосы (stripe)
Если файловая система будет использоваться на чередующемся RAID-массиве, можно значительно повысить скорость, указав размер полосы (англ. stripe) в команде mkfs.xfs(8).
XFS иногда определяет "геометрию" программного RAID-массива, но если она изменяется или используется аппаратный RAID, то см. статью "How to calculate the correct sunit,swidth values for optimal performance[устаревшая ссылка 2024-10-12 ⓘ]" (англ.).
Время доступа
В некоторых файловых системах можно повысить производительность, добавив параметр монтирования 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]. См. mkfs.xfs(8) для получения информации о параметре logdev
.
Укажите опцию -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_growfs
с указанием точки монтирования, что расширит файловую систему до максимально возможного размера.
# xfs_growfs /путь/к/точке/монтирования
Проверка метаданных "на лету" (scrub)
xfs_scrub
запрашивает ядро очистить (англ. scrub) все объекты метаданных в XFS.Записи метаданных сканируются на очевидно ошибочные значения, после чего перекрёстно ссылаются на остальные метаданные. Это делается для того, чтобы иметь достаточно уверенности в целостности всей файловой системы, анализируя отдельные записи метаданных на фоне остальных метаданных в файловой системе. Повреждённые метаданные можно восстановить из других метаданных при наличии неповреждённых избыточных структур данных.
Включите и запустите xfs_scrub_all.timer
для периодической проверки метаданных всех файловых систем XFS "на лету".
xfs_scrub_all.timer
: таймер выполняется каждое воскресенье в 3:10 и сразу же запускается, если последний запуск был пропущен (например, так как система была выключена).Восстановление файловой системы XFS
В отличие от других файловых систем 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.
Утилита xfs_repair не может восстановить файловую систему XFS с грязным журналом. Чтобы очистить журнал, смонтируйте и размонтируйте файловую систему XFS. Если журнал поврежден и не может быть воспроизведен, используйте опцию[13]-L
("принудительное обнуление журнала") для очистки журнала, то естьxfs_repair -L /dev/device
. Имейте в виду, что это может привести к дальнейшему повреждению или потере данных.
Сброс журнала может привести к тому, что файловая система окажется в непоследовательном состоянии, что приведет к потере и повреждению данных. Если у вас нет опыта отладки и восстановления файловых систем 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?[устаревшая ссылка 2024-10-12 ⓘ] и XFS Repair[устаревшая ссылка 2024-10-12 ⓘ].
Восстановление данных
Даже при монтировании только на чтение с помощью mount -o ro
журнал файловой системы XFS будет воспроизведен, если она не была размонтирована начисто.
Возможны ситуации, когда скомпрометированная файловая система XFS на поврежденном устройстве хранения должна быть смонтирована только для чтения, чтобы можно было надежно скопировать с нее файлы без дальнейшего повреждения, но ее нельзя смонтировать, потому что она не была размонтирована начисто и повреждена настолько, что журнал не может быть воспроизведен. Также учтите, что воспроизведение журнала означает запись в поврежденную файловую систему, что само по себе может быть плохой идеей.
Чтобы смонтировать файловую систему XFS без записи на нее и без воспроизведения журнала, используйте mount -o ro,norecovery
.
Undelete
xfs_undelete-gitAUR может восстановить (при определенных условиях) удаленные файлы на несмонтированной или смонтированной только для чтения файловой системе XFS. Дополнительную информацию см. на https://github.com/ianka/xfs_undelete.
Решение проблем
Квота корневой файловой системы
Параметры монтирования XFS (uquota
, gquota
, prjquota
и т.д.) не выполняются во время повторного монтирования файловой системы. Чтобы включить квоту корневой файловой системы, параметр монтирования должен быть передан initramfs как параметр ядра rootflags=
. Впоследствии его не следует указывать среди параметров монтирования в /etc/fstab
для корневой (/
) файловой системы.
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[устаревшая ссылка 2024-10-12 ⓘ] (англ.)
- Improving Metadata Performance By Reducing Journal Overhead[устаревшая ссылка 2024-10-12 ⓘ] (англ.)
- Статья об XFS на Википедии