F2FS (Русский)
F2FS (Flash-Friendly File System) — это файловая система которая в отличии от JFFS и UBIFS, предназначена для накопителей с флэш-памятью на основе технологии NAND, оснащенных flash-transition layer (FTL).
FTL-контроллер есть во всех накопителях с интерфейсом SCSI/SATA/PCIe/NVMe [1], и отвечает за распределение данных, обеспечивая более эффективное использование пространства и продление срока службы накопителя.
Известные проблемы
Потеря данных при внезапном отключении питании
Из-за архитектурных особенностей[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 сжимает только явно указанные каталоги/файлы с помощью:
-
Атрибута файла
+cна каталоге/файле;
- Опции монтирования
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) о поддерживаемых параметрах.
/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.