F2FS (Русский)

Ссылки по теме
Файловые системы
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 сжимает только явно указанные каталоги/файлы с помощью:
Атрибута файла
+c
на каталоге/файле;
Опции монтирования
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/sd
xY
/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
.