Jump to content

F2FS (Русский)

From ArchWiki

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

FTL-контроллер есть во всех флеш-накопителях с интерфейсом SCSI/SATA/PCIe/NVMe [1], в отличие от обычной флеш-памяти NAND и карт памяти SmartMediaCard [2].

Примечание Данные на разделах F2FS могут стать недоступными, если ядро, использованное для их создания, поддерживает более новые функции, чем текущее. Например, это ограничение может проявиться, если раздел F2FS был создан на основном ядре, предоставляемом linux, но системе необходимо перейти на более старую версию ядра, предоставляемую linux-lts. Пример: начиная с ядра 6.12 в ядро была добавлена одна новая функция (device aliasing), которую нельзя было использовать до выхода f2fs-tools.

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

Сбои fsck

В файловой системе F2FS есть проблема с fsck. Она может вызвать потерю данных при неожиданном отключении питания [3][4].

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

Поддержка GRUB

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

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

В этой статье предполагается, что на устройстве уже установлены Partitioning (Русский). Установите f2fs-tools. Используйте mkfs.f2fs для форматирования целевого раздела, называемого "/dev/sdXY":

# mkfs.f2fs -l mylabel -i -O extra_attr,inode_checksum,sb_checksum /dev/sdxY
Примечание
  • Опция -i включена, чтобы обеспечить больше места для индексных индексов.
  • extra_attr, inode_checksum и sb_checksum - это опции, которые помогают fsck.f2fs обнаруживать и устранять некоторые типы повреждений файловой системы. Смотрите mkfs.f2fs(8) для получения информации обо всех доступных вариантах.

Сжатие

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

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

# mkfs.f2fs -l mylabel -O extra_attr,inode_checksum,sb_checksum,compression /dev/sdxY

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

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

Для каждого отдельного расширения опцию нужно прописывать полностью. Пример: compress_extension=txt,compress_extension=log

Шифрование

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


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

 # mkfs.f2fs -l mylabel -O extra_attr,inode_checksum,sb_checksum,encrypt /dev/sdxY

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

Монтирование файловой системы F2FS

Файловая система может быть смонтирована вручную или с помощью других механизмов:

# mount /dev/sdxY /mnt/foo

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

Поскольку F2FS предназначен для использования на флэш-устройствах, рекомендуется использовать сжатие. Его необходимо включить во время mkfs.f2fs. Чтобы немного улучшить работу, можно использовать несколько вариантов монтирования:

# mount -o compress_algorithm=zstd:6,compress_chksum,atgc,gc_merge,lazytime /dev/sdxY /mnt/точка монтирования
  • compress_algorithm=zstd:6 Указывает F2FS использовать zstd для сжатия на уровне 6, что обеспечит хорошую степень сжатия.
  • compress_chksum Указывает файловой системе проверять сжатые блоки с помощью контрольной суммы (чтобы избежать повреждения).
  • atgc,gc_merge Включите улучшенный сборщик мусора и сделайте некоторые сборки мусора переднего плана асинхронными.
Примечание Смотрите #Failed to start Remount Root and Kernel File Systems.
  • lazytime Указывает не обновлять время доступа или внесения изменений синхронно. Повышает производительность ввода-вывода и долговечность флэш-памяти.

Реализация discard

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

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

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

# fsck.f2fs /dev/sdXY

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

# fsck.f2fs -f /dev/sdxY

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

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

Сначала используйте инструменты разметки чтобы изменить размер раздела: предположим, что команда 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/sdxY

где /dev/sdxY том, который будет увеличивать целевой объем 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 не разрешит повторное монтирование[6][7].

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

  • добавьте параметр ядра 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.