F2FS ( Flash-Friendly File System ) — это файловая система для флэш-памяти, изначально разработанная Samsung Electronics для ядра Linux . [5]
Мотивом создания F2FS было создание файловой системы , которая с самого начала учитывала бы характеристики устройств хранения данных на основе флэш-памяти NAND (таких как твердотельные диски , eMMC и SD- карты), которые широко используются в компьютерных системах — от мобильных устройств до серверов.
F2FS была разработана на основе подхода к файловой системе с журнальной структурой , который адаптирован к новым формам хранения. Jaegeuk Kim, главный автор F2FS, заявил, что она устраняет некоторые известные проблемы [5] старых файловых систем с журнальной структурой, такие как эффект снежного кома блуждающих деревьев и высокие накладные расходы на очистку. Кроме того, поскольку устройство хранения на основе NAND демонстрирует различные характеристики в зависимости от своей внутренней геометрии или схемы управления флэш-памятью (например, Flash Translation Layer или FTL), она поддерживает различные параметры не только для настройки компоновки на диске, но и для выбора алгоритмов распределения и очистки.
Обратите внимание, что по умолчанию F2FS использует схему fsync "posix", которая несет в себе более высокие риски оставить файловую систему в грязном состоянии во время нечистого выключения (так как она не гарантирует атомарность операций записи) за счет лучшей производительности. Существует более строгий метод, который учитывает аппаратные ограничения для большей безопасности за счет производительности; подробности см. в описании параметра "fsync_mode" в руководстве. [6]
F2FS делит весь том на несколько сегментов, каждый из которых имеет фиксированный размер 2 МБ. Раздел состоит из последовательных сегментов, а зона состоит из набора разделов. По умолчанию размеры раздела и зоны устанавливаются на один и тот же размер, но пользователи могут легко изменить размер с помощью mkfs
.
F2FS разбивает весь том на шесть областей, и все они, за исключением области суперблока, состоят из нескольких сегментов, как описано ниже.
Чтобы избежать несоответствия между файловой системой и флэш-памятью, F2FS выравнивает адрес начального блока CP с размером сегмента. Он также выравнивает адрес начального блока Main Area с размером зоны, резервируя некоторые сегменты в области SSA.
F2FS использует схему контрольных точек для поддержания целостности файловой системы. Во время монтирования F2FS сначала пытается найти последние допустимые данные контрольной точки, сканируя область CP. Чтобы сократить время сканирования, F2FS использует только две копии CP. Одна из них всегда указывает последние допустимые данные, что называется механизмом теневого копирования. Помимо CP, NAT и SIT также используют механизм теневого копирования. Для обеспечения согласованности файловой системы каждый CP указывает, какие копии NAT и SIT являются допустимыми.
Ключевой структурой данных является «узел». Подобно традиционным файловым структурам, F2FS имеет три типа узлов: inode, direct node, indirect node. F2FS назначает 4 КБ блоку inode, который содержит 923 индекса блоков данных, два прямых указателя узлов, два косвенных указателя узлов и один двойной косвенный указатель узлов, как описано ниже. Блок прямого узла содержит 1018 индексов блоков данных, а блок косвенного узла содержит 1018 индексов блоков узлов. Таким образом, один блок inode (т. е. файл) охватывает:
4 КиБ × (923 + 2 × 1018 + 2 × 1018 2 + 1018 3 ) = 4 228 213 756 КиБ = 4 129 114,996 МиБ = 4 032,338863 ГиБ = 3,937830921 ТиБ
Обратите внимание, что все блоки узлов отображаются NAT, что означает, что местоположение каждого узла транслируется NAT. Чтобы смягчить проблему блуждающего дерева, F2FS может отсечь распространение обновлений узлов, вызванных записью данных листьев.
Запись каталога (dentry) занимает 11 байт и состоит из следующих атрибутов.
Блок dentry состоит из 214 слотов dentry и имен файлов. Для представления того, является ли каждый dentry допустимым или нет, используется битовая карта. Блок dentry занимает 4 КБ и имеет следующий состав:
Блок Dentry (4 К) = битовая карта (27 байт)+ зарезервировано (3 байта)+ дентрии (11 * 214 байт)+ имя файла (8 * 214 байт)
F2FS реализует многоуровневые хэш-таблицы для структуры каталогов. Каждый уровень имеет хэш-таблицу с выделенным числом хэш-контейнеров, как показано ниже. Обратите внимание, что «A(2B)» означает, что контейнер включает 2 блока данных.
уровень №0 А(2Б)уровень №1 А(2Б) - А(2Б)уровень №2 А(2Б) - А(2Б) - А(2Б) - А(2Б) ...уровень #N/2 А(2Б) - А(2Б) - А(2Б) - А(2Б) - А(2Б) - ... - А(2Б) ...уровень #NA(4B) - A(4B) - A(4B) - A(4B) - A(4B) - ... - A(4B)
Когда F2FS находит имя файла в каталоге, сначала вычисляется хэш-значение имени файла. Затем F2FS сканирует хэш-таблицу на уровне #0, чтобы найти dentry, состоящий из имени файла и его номера inode. Если файл не найден, F2FS сканирует следующую хэш-таблицу на уровне #1. Таким образом, F2FS сканирует хэш-таблицы на каждом уровне пошагово от 1 до N. На каждом уровне F2FS необходимо сканировать только один контейнер, определяемый следующим уравнением, которое показывает сложность O(log(# файлов)).
номер контейнера для сканирования на уровне #n = (значение хэш-функции) % (количество контейнеров на уровне #n)
В случае создания файла F2FS находит пустые последовательные слоты, которые покрывают имя файла. F2FS ищет пустые слоты в хэш-таблицах целых уровней от 1 до N таким же образом, как и операция поиска.
Во время выполнения F2FS управляет шестью активными журналами внутри «Основной области»: узел «Горячий/Теплый/Холодный» и данные «Горячий/Теплый/Холодный».
LFS имеет две схемы управления свободным пространством: потоковый журнал и копирование и сжатие. Схема копирования и сжатие, известная как очистка, хорошо подходит для устройств, демонстрирующих очень хорошую производительность последовательной записи, поскольку свободные сегменты обслуживаются все время для записи новых данных. Однако она страдает от накладных расходов на очистку при высокой загрузке. И наоборот, потоковая схема журнала страдает от случайных записей, но процесс очистки не требуется. F2FS использует гибридную схему, в которой схема копирования и сжатие принимается по умолчанию, но политика динамически изменяется на потоковую схему журнала в соответствии с состоянием файловой системы.
Чтобы выровнять F2FS с базовым флэш-хранилищем, F2FS выделяет сегмент в единице раздела. F2FS ожидает, что размер раздела будет таким же, как размер единицы сбора мусора в FTL. Что касается гранулярности отображения в FTL, F2FS выделяет каждую секцию активных журналов как можно большему количеству различных зон. FTL может записывать данные активного журнала в одну единицу распределения в соответствии с гранулярностью отображения.
F2FS выполняет очистку как по требованию, так и в фоновом режиме. Очистка по требованию запускается, когда свободных сегментов недостаточно для обслуживания вызовов VFS. Фоновый очиститель выполняется потоком ядра и запускает задание очистки, когда система простаивает.
F2FS поддерживает две политики выбора жертв: жадный алгоритм и алгоритм стоимости-выгоды. В жадном алгоритме F2FS выбирает сегмент жертвы с наименьшим количеством допустимых блоков. В алгоритме стоимости-выгоды F2FS выбирает сегмент жертвы в соответствии с возрастом сегмента и количеством допустимых блоков, чтобы решить проблему переполнения блока журнала, присутствующую в жадном алгоритме. F2FS использует жадный алгоритм для очистки по требованию, фоновый очиститель использует алгоритм стоимости-выгоды.
Чтобы определить, являются ли данные в сегменте жертвы действительными или нет, F2FS управляет битовой картой. Каждый бит представляет действительность блока, а битовая карта состоит из потока битов, охватывающего целые блоки в основной области.
Google впервые использовала F2FS в своем Nexus 9 в 2014 году. [18] Однако другие продукты Google не использовали F2FS до Pixel 3 , когда F2FS была обновлена с поддержкой встроенного криптографического оборудования. [19]
Huawei использует F2FS с Huawei P9 в 2016 году. [20] [21] OnePlus использует F2FS в OnePlus 3T. [22]
Motorola Mobility использует F2FS в своих телефонах Moto G/E/X и Droid с 2012 года.
ZTE использует F2FS с ZTE Axon 10 Pro в 2019 году. [23]
F2FS был объединен с ядром Linux в конце 2012 года. [24] Многие дистрибутивы поддерживают его. [25] [26] [27]