Jump to content

F2FS (Русский)

From ArchWiki

F2FS (Flash-Friendly File System) — это файловая система которая в отличии от JFFS и UBIFS, предназначена для накопителей с флэш-памятью на основе технологии NAND, оснащенных flash-transition layer (FTL).

FTL-контроллер есть во всех накопителях с интерфейсом SCSI/SATA/PCIe/NVMe [1], и отвечает за распределение данных, обеспечивая более эффективное использование пространства и продление срока службы накопителя.

Примечание F2FS имеет ограниченную обратную совместимость между версиями ядра и f2fs-tools. Данные на разделах могут оказаться недоступными, если ядро, использованное для их создания, включало более новые функции, чем текущее. Это может проявиться при откате с ядра linux до linux-lts.

Известные проблемы

Потеря данных при внезапном отключении питании

Из-за архитектурных особенностей[2] и несовершенности механизмов восстановления fsck, F2FS склонна терять файлы после внезапного отключения.

Если перебои с электричеством или жесткие перезагрузки происходят часто, стоит рассмотреть альтернативные Файловые системы.

Ограниченная поддержка GRUB

GRUB поддерживает файловую систему F2FS с версии 2.0.4. Однако он не может правильно считывать загрузочные файлы с раздела F2FS, если тот создан с включенным флагом extra_attr.

Создание файловой системы

Установите f2fs-tools и используйте mkfs.f2fs для форматирования целевого раздела:

# mkfs.f2fs -l метка -i -O extra_attr,inode_checksum,sb_checksum,lost_found,flexible_inline_xattr /dev/раздел
Примечание
  • -i увеличивает базовый процент инодов предотвращая их нехватку.
  • inode_checksum, sb_checksum и lost_found - опции, позволяющие fsck.f2fs обнаруживать и исправлять некоторые типы повреждений файловой системы.

Смотрите mkfs.f2fs(8) для получения информации обо всех доступных вариантах.

Рекомендуемые опции монтирования

Ниже будут рассмотрены опции, которые могут улучшить внутреннюю работу и повысить надёжность файловой системы, однако обязательно используемыми они не являются..

  • gc_merge Асинхронная обработка запросов GC. Это позволяет устранить медленную работу при ограниченных ресурсах ввода-вывода и центрального процессора.
  • inline_data,inline_dentry Встраивание маленьких файлов и каталогов внутрь inode. Уменьшает фрагментацию, уменьшает WAF и ускоряет операции ввода-вывода этих файлов.
  • flush_merge Уменьшение задержек при множественных запросах FSYNC.
  • atgc Использование Age Threshold GC вместо классического. Существенно снижает WAF и задержки созданные работой GC.
Примечание Перед использование ознакомьтесь с #Failed to start Remount Root and Kernel File Systems.
  • data_flush При создании CP фиксирует не только метаданные, но обычные данные в кэше. Обеспечивает защиту от "нулевых файлов" при внезапном обесточивании.
  • checkpoint_merge Объединяет запросы на создание CP и задает им более высокий приоритет для уменьшения задержек.
  • discard_unit=section Увеличивает минимальный порог для работы механизма discard с блока до сегмента. Уменьшает задержки и снижает нагрузку на контроллер NVME.
  • age_extent_cache Продвинутые эвристики оценки возраста файлов для работы GC, хранимые в RAM кэше.
  • nat_bits Оптимизация bitmap. Значительно ускоряет массовые операции с метеданными при более низкой нагрузке на процессор.

Реализация discard

По умолчанию F2FS монтируется с использованием гибридного режима, который ведет себя как непрерывный TRIM. Эта реализация создает асинхронные потоки для уменьшения задержек. Он сохраняет кандидатов в памяти, и выдает их во время простоя [3].
Пользователям желающим периодический_TRIM потребуется неявно установить параметр монтирования nodiscard.

Сжатие

Примечание
  • Реализованное сжатие в F2FS направлено на увеличение срока службы накопителя путем сокращения операций ввода-вывода.
  • При использовании алгоритма LZ4 возможно добиться небольшого ускорения операций чтения.
    • По умолчанию LZ4 использует самый быстрый уровень сжатия и не требует его определения вручную.
  • Сжатое пространство по умолчанию не предоставляется пользователю, для возможности дальнейшей записи данных в тот же диапазон.
    • Однако, команда f2fs_io release_cblocks файл позволяет высвободить зарезервированное пространство до тех пор, пока файл неизменяем.

Чтобы использовать сжатие, добавьте при форматировании опцию compression.

# mkfs.f2fs -l метка -O extra_attr,inode_checksum,sb_checksum,lost_found,flexible_inline_xattr,compression /dev/раздел

По умолчанию F2FS сжимает только явно указанные каталоги/файлы с помощью:

  • Опции монтирования compress_extension с указанием расширения файла.
Совет

Для каждого отдельного расширения опцию нужно прописывать полностью.

Пример: compress_extension=txt,compress_extension=log

Опции монтирования для настройки сжатия

Помимо compress_extension, есть еще ряд опций которое можно использовать при монтировании:

compress_algorithm Выбор алгоритма сжатия (ZSTD,LZ4,lzo и lzo-rle). Для ZSTD и LZ4 доступна настройка уровней — ZSTD: 1-22, LZ4: 3-16.

compress_chksum Создание контрольных сумм для данных внутри сжатого кластера.

compress_cache Обеспечивает попадание сжатых блоков в кэш, для ускорения операций случайного чтения.

Шифрование

Начиная с ядра 4.2, F2FS поддерживает шифрование файлов fscrypt на уровне каталогов, и в разных каталогах могут использоваться разные ключи шифрования. Это отличается как от dm-crypt (Русский), который представляет собой шифрование на уровне блочного устройства, так и от eCryptfs (Русский), который представляет собой многоуровневую криптографическую файловую систему. Чтобы использовать встроенную поддержку шифрования в F2FS, ознакомьтесь со статьей fscrypt.


Создайте файловую систему с помощью:

 # mkfs.f2fs -l метка -O extra_attr,inode_checksum,sb_checksum,encrypt /dev/раздел

Или добавьте возможность шифрования позже с помощью: fsck.f2fs -O encrypt /dev/раздел.

Проверка и ремонт

Проверка и восстановление файловой системы F2FS выполняются с помощью fsck.f2fs, предоставляемого пакетом f2fs-tools. Чтобы проверить файловую систему, выполните:

# fsck.f2fs /dev/раздел

В зависимости от результата, смотрите fsck.f2fs(8). Например для принудительного устранения ошибок используйте:

# fsck.f2fs -f /dev/раздел

Увеличение раздела

Когда файловая система размонтирована, ее можно увеличить, если расширить раздел. Уменьшение в настоящее время не поддерживается.

Сначала используйте инструменты разметки чтобы изменить размер раздела: предположим, что команда print выводится в консоли parted следующим образом:

Number  Start   End     Size        File system     Name                  Flag
 1      1049kB  106MB   105MB       fat32           EFI system partition  boot, esp
 2      106MB   11,0GB  10,9GB      ext4
 3      11,0GB  12,3GB  1322MB      f2fs
 4      31,0GB  31,3GB  261MB       ext4

Чтобы изменить размер раздела f2fs так, чтобы он занимал все пространство до четвертого, просто укажите resizepart 3 31 ГБ и exit.


Теперь разверните файловую систему, чтобы заполнить новый раздел, используя:

# resize.f2fs /dev/раздел

где /dev/раздел том, который будет увеличивать целевой объем F2FS.
Смотрите раздел resize.f2fs(8) о поддерживаемых параметрах.

Примечание При использовании GPT, GUID раздела (отображается в /dev/disk/by-partuuid/) может измениться, но UUID (отображается в /dev/disk/by-uuid/) должен остаться прежним.

Решение проблем

Failed to start Remount Root and Kernel File Systems

Как упоминалось в Fsck_(Русский)#Проверка_при_загрузке, ядро по умолчанию поддерживает файловые системы в состоянии, доступном только для чтения, и необходимо либо явно передать rw в параметр ядра, либо systemd повторно подключает файловые системы для чтения и записи с помощью systemd-remount-fs.service.

При повторном подключении файловой системы из состояния только для чтения в состояние для записи mount -o remount,... / может завершиться ошибкой по нескольким причинам, что сделает корневую файловую систему доступной только для чтения, либо приведет к невозможности загрузки системы с ошибкой сообщение:

Failed to start Remount Root and Kernel File Systems.

Если параметр atgc указан в файле fstab, но не был передан в качестве параметра ядра, модуль ядра F2FS не разрешит повторное монтирование[4][5].

Для решения проблемы:

  • добавьте параметр ядра rootflags=atgc в конфигурацию вашего загрузчика,
  • добавьте параметр ядра rw в конфигурацию вашего загрузчика,
  • удалите параметр монтирования atgc из fstab.

Начиная с версии linux 6.2, в ядре выполняется проверка, опции flush_merge, если файловая система доступна только для чтения. Как объясняется в FS#77596, перед повторным монтированием также проверяется её состояние.

Для решения проблемы:

  • добавьте параметр ядра rw в конфигурацию вашего загрузчика,
  • удалите параметр монтирования flush_merge из fstab.

Cannot set file attributes for '/var/log/journal'

Cannot set file attributes for '/var/log/journal', maybe due to incompatibility in specified attributes, previous=0x10001000, current=0x10001000, expected=0x10801000, ignoring.

Если ваш журнал содержит такую запись, её можно спокойно проигнорировать: это связано с тем, что Systemd_(Русский)#systemd-tmpfiles пытается использовать функцию NOCOW, не поддерживаемую F2FS.
Для исправления этого создайте /etc/tmpfiles.d/journal-nocow.conf со следующими содержанием:

 #h /var/log/journal - - - - +C
 #h /var/log/journal/%m - - - - +C
 #h /var/log/journal/remote - - - - +C 

И перезагрузите службы systemd systemctl daemon-reload.