stringtranslate.com

Ф2ФС

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 разбивает весь том на шесть областей, и все они, за исключением области суперблока, состоят из нескольких сегментов, как описано ниже.

Суперблок (СБ)
SB находится в начале раздела. Есть две копии, чтобы избежать повреждения файловой системы. Он содержит основную информацию о разделах и некоторые параметры F2FS по умолчанию.
Контрольно-пропускной пункт (КП)
CP содержит информацию о файловой системе, битовые карты для допустимых наборов NAT/SIT, списки потерянных инодов и сводные записи текущих активных сегментов.
Таблица информации о сегменте (SIT)
SIT содержит количество действительных блоков и битовую карту действительностей всех блоков основной области.
Таблица адресов узлов (NAT)
NAT — это адресная таблица для узловых блоков основной области.
Сводная область сегмента (SSA)
SSA содержит записи, содержащие информацию о владельце данных и узловых блоков основной области.
Основная площадь
Основная область содержит данные файлов и каталогов, а также их индексы.

Чтобы избежать несоответствия между файловой системой и флэш-памятью, 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 блока данных.

Срок
А обозначает ведро
B обозначает блок
N указывает MAX_DIR_HASH_DEPTH
уровень №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]

Дистрибутивы Linux

F2FS был объединен с ядром Linux в конце 2012 года. [24] Многие дистрибутивы поддерживают его. [25] [26] [27]

Смотрите также

Ссылки

  1. ^ Майкл Ларабель (22.12.2012). "Файловая система F2FS объединена с ядром Linux 3.8". Phoronix . Получено 25.05.2016 .
  2. ^ Jaegeuk Kim (2013-03-18). "f2fs: выровнять максимальную длину имени f2fs с файловой системой на базе Linux". GitHub . Получено 2023-05-16 .
  3. ^ ab Майкл Ларабель (2019-12-23). ​​"Сжатие данных F2FS с использованием LZO/LZ4 + выборочная обработка расширений файлов появится в 2020 году". Phoronix . Получено 2020-04-07 .
  4. ^ ab Майкл Ларабель (2020-04-07). "F2FS представляет поддержку сжатия Zstd в ядре Linux 5.7". Phoronix . Получено 2020-04-07 .
  5. ^ ab Jaegeuk Kim (2012-10-05). "f2fs: введение файловой системы, дружественной к флэш-памяти" . Получено 2016-05-25 .
  6. ^ f2fs: исправлена ​​ошибка принудительного сохранения барьера записи для строгого режима fsync.
  7. ^ Jaegeuk Kim (22.09.2014). "f2fs: введение FITRIM в f2fs_ioctl".
  8. ^ Чао Юй (2015-10-26). «f2fs: поддержка дефрагментации файлов».
  9. ^ Jaegeuk Kim (26.08.2013). "f2fs: добавить флаги для встроенных xattrs".
  10. ^ Хуацзюнь Ли (10.11.2013). «f2fs: включить поддержку встроенных данных f2fs».
  11. ^ Чао Юй (24.09.2014). "f2fs: поддержка встроенного каталога".
  12. ^ Jaegeuk Kim (2014-09-20). "f2fs-tools: выпуск 1.4.0".
  13. ^ Jaegeuk Kim (25.09.2014). «f2fs: поддержка функции atomic_write для базы данных».
  14. ^ Jaegeuk Kim (24.06.2015). "Обновления f2fs для v4.2".
  15. ^ Jaegeuk Kim (25.04.2016). «resize.f2fs: поддержка расширения размера раздела».
  16. ^ Чао Юй (17.12.2015). «f2fs: поддержка сброса данных в фоновом режиме».
  17. ^ Чао Юй (25.01.2015). «f2fs: включить кэш экстентов rb-tree».
  18. ^ Хо, Джошуа; Смит, Райан. «Обзор Google Nexus 9». www.anandtech.com . Получено 10 мая 2019 г.
  19. ^ Фрумусану, Андрей (02 ноября 2018 г.). «Обзор Google Pixel 3». www.anandtech.com . Проверено 11 мая 2019 г.
  20. ^ Ларабель, Майкл (28.12.2018). «F2FS получает больше исправлений в Linux 4.21 с файловой системой, теперь поддерживаемой Pixel от Google». www.phoronix.com . Получено 10.05.2019 .
  21. ^ Хамрик, Мэтт (2017-05-12). "Huawei P10 и P10 Plus". www.anandtech.com . Получено 2019-05-11 .
  22. ^ Честер, Брэндон. «Обзор OnePlus 3T». www.anandtech.com . Получено 10 мая 2019 г.
  23. ^ "ZTE Axon 10 Pro официально представлен: первый, использующий F2FS". Gizchina.com . 2019-05-06 . Получено 2019-05-10 .
  24. ^ "Извлечь новую файловую систему F2FS из коммита Jaegeuk Kim". git.kernel.org .
  25. ^ "Arch Linux Wiki". wiki.archlinux.org . Получено 27 июня 2021 г. .
  26. ^ "Debian Wiki". wiki.debian.org . Получено 27 июня 2021 г. .
  27. ^ "Gentoo Wiki". wiki.gentoo.org . Получено 27 июня 2021 г. .

Внешние ссылки