XFS (Русский)

From ArchWiki
Состояние перевода: На этой странице представлен перевод статьи 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. Основанная на 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 все улучшения включены по умолчанию[устаревшая ссылка 2021-11-19] (англ.).

Смотрите также xfs(5) для получения информации о доступных параметрах монтирования.

Совет: При использовании XFS на устройствах с RAID (англ.), улучшить производительность можно с помощью largeio, swalloc, увеличенными значениями logbsize, allocsize и так далее. В следующих статьях предоставлена дополнительная информация об этих флагах:

Размер и ширина полосы (stripe)

Если файловая система будет использоваться на чередующемся RAID-массиве, можно значительно повысить скорость, указав размер полосы (англ. stripe) в команде mkfs.xfs(8).

XFS иногда определяет "геометрию" программного RAID-массива, но если она изменяется или используется аппаратный RAID, то см. статью "How to calculate the correct sunit,swidth values for optimal performance[устаревшая ссылка 2021-11-19]" (англ.).

Время доступа

В некоторых файловых системах можно повысить производительность, добавив параметр монтирования 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][устаревшая ссылка 2022-09-23]. См. 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 не поддерживает[устаревшая ссылка 2021-11-19] уменьшение размера ФС.

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_undeleteAUR может восстановить (при определенных условиях) удаленные файлы на несмонтированной или смонтированной только для чтения файловой системе 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 были права на выполнение.

Смотрите также