Разработчик (и) | Samsung Electronics, Motorola Mobility, Huawei и Google |
---|---|
Полное имя | Файловая система с поддержкой Flash |
Представлена | v3.8, 2012-12-20 с Linux |
Структуры | |
Содержимое каталога | многоуровневая хэш-таблица |
Размещение файлов | растровое изображение (свободное пространство), таблица |
Загрузочная | Да, начиная с GRUB 2.04 (2019-07-05) |
Пределы | |
Макс. размер тома | 16 TB |
Макс. размер файла | 3,94 TB |
Макс. количество файлов | Зависит от размера тома |
Макс. длина имени файла | 512 байт |
Характеристики | |
Записанные даты | изменение (mtime), изменение атрибута (ctime), доступ (atime) |
Разрешение даты | 1 нс |
Атрибуты | POSIX, расширенные атрибуты |
Разрешения файловой системы | POSIX, ACL |
Прозрачное сжатие | LZO, LZ4 (начиная с Linux 5.6), zstd (начиная с Linux 5.7) |
Прозрачное шифрование | Да |
Другое | |
Поддерживаемые операционные системы | Linux и Android |
Веб-сайт | f2fs.wiki.kernel.org |
F2FS (Файловая система, совместимая с Flash ) - это файловая система для флэш-памяти, изначально разработанная Samsung. Электроника для ядра Linux.
Мотивом для F2FS было создание файловой системы, которая с самого начала учитывала характеристики флэш-памяти NAND устройства хранения (такие как твердотельные диски, eMMC и SD карты), которые широко используются в компьютерных системах, от мобильных устройств до серверы.
F2FS была разработана на основе подхода файловой системы с лог-структурой, который адаптирован для новых форм хранения. Jaegeuk Kim, главный автор F2FS, заявил, что он устраняет некоторые известные проблемы старых файловых систем с журнальной структурой, такие как эффект снежного кома и высокие накладные расходы на очистку. Кроме того, поскольку устройство хранения на основе NAND показывает разные характеристики в зависимости от своей внутренней геометрии или схемы управления флэш-памятью (например, Flash Translation Layer или FTL), оно поддерживает различные параметры не только для настройки на- структура диска, а также для выбора алгоритмов распределения и очистки.
F2FS делит весь том на несколько сегментов, каждый из которых имеет фиксированный размер 2 МБ. Раздел состоит из последовательных сегментов, а зона состоит из набора разделов. По умолчанию для размеров раздела и зоны задан одинаковый размер, но пользователи могут легко изменить размер с помощью mkfs
.
. F2FS разбивает весь том на шесть областей, и все, кроме области суперблока, состоят из нескольких сегментов, как описано ниже.
Чтобы избежать несоответствия между файловой системой и флэш-хранилищем, F2FS выравнивает адрес начального блока CP с размером сегмента. Он также выравнивает адрес начального блока основной области с размером зоны, резервируя некоторые сегменты в области SSA.
F2FS использует схему контрольных точек для поддержания целостности файловой системы. Во время монтирования F2FS сначала пытается найти последние действительные данные контрольной точки, сканируя область CP. Чтобы сократить время сканирования, F2FS использует только две копии CP. Один из них всегда указывает на последние достоверные данные, что называется механизмом теневого копирования. Помимо CP, NAT и SIT также используют механизм теневого копирования. Для согласованности файловой системы каждый CP указывает, на какие копии NAT и SIT действительны.
Ключевой структурой данных является «узел». Подобно традиционным файловым структурам, F2FS имеет три типа узлов: inode, прямой узел, косвенный узел. F2FS назначает 4 КБ блоку inode, который содержит 923 индекса блока данных, два прямых указателя узла, два косвенных указателя узла и один указатель двойного косвенного узла, как описано ниже. Блок прямого узла содержит 1018 индексов блока данных, а блок косвенного узла содержит 1018 индексов блока узла. Таким образом, один блок inode (т.е. файл) покрывает:
4 КБ × (923 + 2 × 1018 + 2 × 1018 + 1018) = 3,94 ТБ
Обратите внимание, что все блоки узлов отображаются NAT, что означает, что местоположение каждого узла транслируется NAT. Чтобы смягчить проблему блуждающего дерева, F2FS может отключать распространение обновлений узлов, вызванных записью конечных данных.
Запись каталога (dentry) занимает 11 байтов, которые состоят из следующих атрибутов.
hash | Значение хэша имени файла |
---|---|
ino | Inode number |
len | Длина имени файла |
тип | Тип файла, такой как каталог, символическая ссылка и т. Д. |
Блок dentry состоит из 214 слотов dentry и имен файлов. Растровое изображение используется для представления того, действительна ли каждая данность. Блок dentry занимает 4 КБ и имеет следующий состав:
Блок Dentry (4 КБ) = битовая карта (27 байтов) + зарезервировано (3 байта) + dentries (11 * 214 байтов) + имя файла (8 * 214 байт)
F2FS реализует многоуровневые хеш-таблицы для структуры каталогов. На каждом уровне есть хеш-таблица с выделенным количеством хеш-сегментов, как показано ниже. Обратите внимание, что «A (2B)» означает, что сегмент включает 2 блока данных.
уровень # 0 A (2B) уровень # 1 A (2B) - A (2B) уровень # 2 A (2B) - A (2B) - A (2B) - A (2B)... уровень # N / 2 A (2B) - A (2B) - A (2B) - A ( 2B) - A (2B) -... - A (2B)... уровень #NA (4B) - A (4B) - A (4B) - A (4B) - A (4B) -... - A (4B)
Когда F2FS находит имя файла в каталоге, сначала вычисляется хеш-значение имени файла. Затем F2FS просматривает хеш-таблицу на уровне # 0, чтобы найти файл dentry, состоящий из имени файла и его номера inode. Если не найден, F2FS сканирует следующую хеш-таблицу на уровне №1. Таким образом, F2FS сканирует хэш-таблицы на каждом уровне постепенно от 1 до N. На каждом уровне F2FS необходимо сканировать только один сегмент, определяемый следующим уравнением, которое показывает сложность O (журнал (# файлов)).
номер сегмента для сканирования на уровне #n = (значение хэша)% (количество сегментов на уровне #n)
В случае создания файла F2FS находит пустые последовательные слоты, которые покрывают имя файла. F2FS ищет пустые слоты в хеш-таблицах целых уровней от 1 до N так же, как и операция поиска.
Во время выполнения F2FS управляет шестью активными журналами внутри «основной области»: узел Hot / Warm / Cold и данные Hot / Warm / Cold.
Горячий узел | Содержит блоки прямых узлов каталогов. |
---|---|
Горячий узел | Содержит блоки прямых узлов, кроме блоков горячих узлов. |
Холодный узел | Содержит блоки косвенного узла. |
Горячие данные | Содержит блоки dentry. |
Горячие данные | Содержит блоки данных, кроме горячих и холодных блоков данных. |
Холодные данные | Содержит мультимедийные данные или перенесенные блоки данных. |
LFS имеет две схемы управления свободным пространством: многопоточный журнал и копирование и сжатие. Схема копирования и сжатия, известная как очистка, хорошо подходит для устройств, демонстрирующих очень хорошую производительность последовательной записи, поскольку свободные сегменты постоянно обслуживаются для записи новых данных. Однако при высокой загрузке он страдает от накладных расходов на очистку. И наоборот, многопоточная схема журнала страдает от случайных записей, но процесс очистки не требуется. F2FS использует гибридную схему, в которой по умолчанию используется схема копирования и сжатия, но политика динамически изменяется на схему потокового журнала в соответствии с состоянием файловой системы.
Чтобы выровнять F2FS с базовым хранилищем на основе флэш-памяти, F2FS выделяет сегмент в единице раздела. F2FS ожидает, что размер раздела будет таким же, как размер единицы сборки мусора в FTL. Что касается детализации отображения в FTL, F2FS распределяет каждый раздел активных журналов по как можно большему количеству различных зон. FTL может записывать данные активного журнала в одну единицу распределения в соответствии с гранулярностью отображения.
F2FS выполняет очистку как по запросу, так и в фоновом режиме. Очистка по требованию запускается, когда недостаточно свободных сегментов для обслуживания вызовов VFS. Средство очистки фона выполняется потоком ядра и запускает задание очистки, когда система простаивает.
F2FS поддерживает две политики выбора жертвы: жадный и рентабельный. В жадном алгоритме F2FS выбирает сегмент жертвы, имеющий наименьшее количество допустимых блоков. В алгоритме рентабельности F2FS выбирает сегмент жертвы в соответствии с возрастом сегмента и количеством допустимых блоков, чтобы решить проблему переброса блоков журнала, присутствующую в жадном алгоритме. F2FS использует жадный алгоритм очистки по требованию, очиститель фона использует алгоритм рентабельности.
Чтобы определить, верны ли данные в сегменте жертвы, F2FS управляет битовой картой. Каждый бит представляет действительность блока, а битовая карта состоит из потока битов, охватывающего целые блоки в основной области.
Motorola Mobility использует F2FS в своих телефонах Moto G / E / X и Droid с 2012 года. Google впервые применил F2FS в своих Nexus 9 в 2014 году. Однако другие продукты Google не использовали F2FS до Pixel 3, когда F2FS была обновлена с поддержкой встроенного криптографического оборудования.
Huawei использовала F2FS с Huawei P9 в 2016 году. OnePlus использует F2FS с OnePlus 3T в 2016 году. ZTE использует F2FS с момента выхода ZTE Axon 10 Pro в 2019 году.
.