UBIFS (Unsorted Block Image File System)

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 12:49, 13 марта 2018.
UBIFS (Unsorted Block Image File System)
Полное название Unsorted Block Image File System
Содержимое каталога B+ trees
Limits
Разрешенные символы
в именах файлов
Any byte except NUL and forward slash "/"[citation needed]
Features
Вилка Yes
Признаки Yes
Разрешения файловой системы POSIX
Другие
Операционная система Linux

UBIFS (англ. Unsorted Block Image File System) — новая flash файловая система разработанная инженерами Nokia совместно с Университетом Сегеда[1]. UBIFS можно рассматривать как новое поколение файловой системы JFFS2.

UBIFS работает поверх UBI. UBI представляет собой отдельный программный слой, который может быть найден в drivers/mtd/ubi. UBI - это, в основном, управление томами и выравнивание степени износа слоя. Оно обеспечивает так называемые объемы UBI, что является более высоким уровнем абстракции, чем MTD устройства. Модель программирования устройств UBI очень похож на устройства MTD - они до сих пор состоят из крупных eraseblocks, у них есть операции чтения / записи / стирания, но UBI устройства лишены ограничений, таких как износ и появление плохих блоков[source 1].

Файловая система JFFS2 работает поверх устройств MTD, но UBIFS работает поверх томов UBI и не может работать поверх устройств MTD. Другими словами, есть 3 участвующих подсистемы:

  • Подсистема MTD, которая обеспечивает единый интерфейс для доступа к flash-чипам. MTD обеспечивает понятие устройств MTD (например, / DEV / mtd0), который в основном представляет flash-накопитель;
  • Подсистема UBI, которая представляет собой систему выравнивания степени износа и управление томами для flash-устройств; UBI работает поверх устройств MTD и обеспечивает понятие объемов UBI; Объемы UBI более высокого уровня, чем устройства MTD, и они лишены многих неприятных проблем MTD устройств(например, износ и плохие блоки);
  • UBIFS файловая система, которая работает поверх томов UBI.


Особенности

  • Масштабируемость - UBIFS хорошо масштабируется по размеру flash ,а именно: время загрузки, потребление памяти и ввода / вывода скорость не зависит от размера flash (в настоящее время это не 100% верно для потребления памяти, но зависимость очень слаба, и это может быть исправлено). UBIFS должна работать нормально в течение сотен GIB flashes. Однако, UBIFS зависит от UBI, который имеет ограничения масштабируемости. Тем не менее, масштаб стека UBIFS UBI намного лучше, чем JFFS2, и если UBI становится узким местом, то всегда можно реализовать UBI2 без изменения UBIFS.
  • Быстрый монтаж - в отличие от JFFS2, UBIFS не должен сканировать весь носитель при монтаже, это занимает миллисекунды у UBIFS для монтирования средств массовой информации, и это не зависит от размера flash, однако зависит от времени инициализации UBI flash размера и должен быть принят во внимание.
  • Поддержка обратной записи - это значительно повышает пропускную способность файловой системы во многих рабочих нагрузках по сравнению с JFFS2.
  • Толерантность к unclean-перезагрузке - UBIFS является журнальной файловой системой, и она терпит внезапные сбои и непрямые(unclean) перезагрузи. UBIFS просто заменяет журнал и восстанавливается после непрямой перезагрузки. Время установки немного медленнее в этом случае из-за необходимости повторного воспроизведения журнала, но UBIFS не нужно сканировать весь носитель, так что в любом случае занимает доли секунды, чтобы установить UBIFS.
  • Быстрый ввод / вывод - даже с отключенной обратной записью (например, если UBIFS установлен с опцией "-o синхронизации" монтирования) UBIFS показывает хорошую производительность, близкую к производительности JIFFS2. То есть, чрезвычайно трудно конкурировать с JFFS2 в синхронном ввода/вывода, поскольку JFFS2 не поддерживает структуры индексации данных на flash, поэтому не имеет затрат на обслуживание, в то время как UBIFS в нем нуждается. Но UBIFS по-прежнему быстра.
  • Сжатие "в полете" - данные хранятся в сжатом виде на flash-носителях, что позволяет поставить значительно больше данных во flash-память, чем если данные не были сжаты. Это очень похоже на JFFS2. UBIFS также позволяет включать и выключать компрессию по принципу per-inode, что является гибким решением. Например, можно отключить сжатие по умолчанию и включить его только для определенных файлов, которые должны хорошо сжиматься, или по умолчанию можно включить сжатие, но отключить его для предположительно несжимаемых данных, таких как мультимедийные файлы. На данный момент UBIFS поддерживает только zlib и компрессоры LZO;
  • Восстанавливаемость - UBIFS могут быть полностью восстановлены, если информация об индексации будет повреждена. Каждая часть информации в UBIFS имеет заголовок, который описывает эту часть информации, и можно полностью восстановить индекс файловой системы путем сканирования flash-носителя, это очень похоже на JFFS2.
  • Целостность - UBIFS (а также UBI) контролирует все, что пишет на flash-носителях, чтобы гарантировать целостность данных. UBIFS не оставляет незамеченными данные или искажения метаданных (JFFS2 делает то же самое). По умолчанию UBIFS проверяет только CRC метаданных при чтении с носителя, но не CRC данных. Однако вы можете принудительно проверить CRC для данных, используя один из вариантов монтирования UBIFS.

Параметры монтирования

  • (*) == по умолчанию
  • bulk_read читать больше за один шаг для использования преимуществ flash-носителей, которые читают быстрее последовательно
  • no_bulk_read (*) не делать bulk-read
  • no_chk_data_crc (*) пропустить проверку CRC на узлах данных для улучшения производительности чтения
  • chk_data_crc не пропускать проверку CRC на узлах данных
  • compr=none переопределить компрессор по умолчанию и установить его на "нет"
  • compr=lzo переопределить компрессор по умолчанию и установить его на "lzo"
  • compr=zlib переопределить компрессор по умолчанию и установить его на "zlib"

UBI

Свойства различных файловых систем

UBI (Unsorted Block Images) это слой управления блоком стирания для устройств flash-памяти. UBI выполняет две задачи, отслеживание блокировки flash-памяти NAND и обеспечивание выравнивания износа. Выравнивание износа распространяется на все стирания и записи на всем устройстве flash-памяти. UBI представляет логические блоки для более высоких уровней и сопоставляет их с физическими flash-блоками. UBI был написан специально для UBIFS, так что он не должен иметь дело с выравниванием износа и плохими блоками. Однако, UBI может также быть полезным с squashfs и NAND flash; Squashfs не знает о плохих блоках NAND flash.[source 1]

Документация UBI объясняет, что это не полный flash transport layer (FTL). Хотя FTL также обрабатывает плохие блоки и выравнивание износа, интерфейс, предоставляемый FTL, является блочным устройством с небольшими (обычно 512-байтовыми) секторами, которые могут быть записаны полностью независимо. Напротив, интерфейс UBI напрямую предоставляет блоки и программируемые страницы (которые имеют разные размеры и намного больше, чем типичные сектора блоков), а файловые системы, использующие UBI, должны быть осведомлены о размерах и ограничениях того, как должны быть удалены блоки до того, как они будут записаны.[source 1]

Fastmap

UBI был дополнен в Linux 3.7 поддержкой fastmap[2][3]. Fastmap поддерживает на диске версию информации, ранее созданной в памяти, путем сканирования всего flash-устройства. Код возвращается к предыдущему механизму полного сканирования при сбоях, и старые системы UBI просто игнорируют информацию fastmap.[source 1]

Настройка

Для начала нужно включить UBI и UBIFS:

В меню конфигурации линукса идем в "Device Drivers" -> "Memory Technology Devices (MTD)" -> "UBI - Unsorted block images", и ставим "Enable UBI". UBI может быть либо скомпилирован в ядро, либо построен как модуль ядра.

Далее в меню конфигурации линукса идем в "File systems" -> "Miscellaneous filesystems", и ставим "UBIFS file system support". UBIFS также может быть скомпилирован в ядро или построен как модуль ядра.[source 2]

Обновим линукс:

sudo apt-get update 

Нам необходимо для работы получить пакет mtd-utils:

sudo apt-get install mtd-utils 

Операции UBIFS

Как смонтировать UBIFS

Для того чтобы смонтировать UBIFS на UBI том пишем:

sudo mount -t ubifs /dev/ubi0_0 /mnt/ubifs 

Пример:

sudo mount -t ubifs ubi1_0 /mnt/ubifs 

монтирует том 0 на UBI устройство 1 в /mnt/ubifs, и

sudo mount -t ubifs ubi0:rootfs /mnt/ubifs 

монтирует "rootfs" том UBI устройства 0 в /mnt/ubifs ("rootfs" имя тома). Этот способ указания тома UBI является более предпочтительным, поскольку он не зависит от номера тома.

Создание UBIFS образа

Создание изображений UBIFS может быть немного сложнее, чем создание изображений JFFS2. Прежде всего, вы должны понимать, что UBIFS работает поверх UBI, который работает на вершине или MTD, который в основном представляет вашу сырую память. Это означает, что если вам нужно создать изображение, которое должно быть основано на сырой памяти, вы должны сначала создать изображение UBIFS, а затем изображение UBI. Другими словами, процесс имеет 2 шага.[source 2]

Итак, эти 2 шага представлены командами:

  • mkfs.ubifs которая создает образ UBIFS;
  • ubinize которая создает образ UBI из образа UBIFS.

Например:

sudo mkfs.ubifs -q -r root-fs -m 2048 -e 129024 -c 2047 -o ubifs.img 
sudo ubinize -o ubi.img -m 2048 -p 128KiB -s 512 ubinize.cfg 

где ubinize.cfg включает в себя:

[ubifs]

mode=ubi

image=ubifs.img

vol_id=0

vol_size=200MiB

vol_type=dynamic

vol_name=rootfs

vol_flags=autoresize


Некоторые пояснения команд и параметров:

  • -r root-fs: говорит mkfs.ubifs создать образ UBIFS который включает в себя содержимое директории root-fs;
  • -m 2048: говорит mkfs.ubifs что минимальный размер input/output блока в flash-памяти этого образа UBIFS долэно быть 2048 байт (NAND страница в данном случае);
  • -e 129024: размер логического блока тома UBI, для которого создается изображение;
  • -c 2047: определяет максимальный размер файловой системы в логических блоках; Это означает, что можно будет использовать результирующую файловую систему на томах до этого размера (меньше или равнозначно); Поэтому в данном конкретном случае результирующая ФС может быть поставлена на объемы до примерно 251 МБ (129024, умноженное на 2047);
  • -p 128KiB: говорит ubinize, что физический размер блока flash-чипа, создаваемого UBI-изображением, составляет 128 Кбайт (128 * 1024 байта);
  • -s 512: uоворит ubinize, что flash поддерживает sub-pages, а размер sub-page - 512 байт; Ubinize учтет это и поместит заголовок VID на ту же страницу NAND, что и заголовок EC.

Монтирование пустых томов

Для монтирования пустых томов UBI на устройстве MTD нам нужно очистить его. Мы могли бы использовать flash_eraseall, но мы не хотим терять счетчики стирания:

sudo ubiformat /dev/mtd0 

Загружаем модуль UBI:

sudo modprobe ubi 

Присоединим mtd0 к UBI - UBI обнаружит, что устройство MTD пустое и автоматически форматирует его. Эта команда также создаст устройство UBI 0, а udev должен создать узел /dev/ubi0:

sudo ubiattach /dev/ubi_ctrl -m 0 

Создаем том UBI - созданный том будет пустым:

sudo ubimkvol /dev/ubi0 -N test_volume -s 10MiB 

Монтируем UBIFS - он автоматически отформатирует пустой том:

sudo mount -t ubifs ubi0:0 /mnt/ubifs 

Также можно уничтожить существующий том UBIFS, представленный /dev/ubi0_0, используя следующую команду:

sudo ubiupdatevol /dev/ubi0_0 -t 

Пример видео монтирования пустого тома ubi на mtd устройство на ОС Debian Jessie. Важное примечание: иногда невозможно замаунтить устройство к папке, так как его размер слишком мал. Как показано в примере, придется выделить раздел с большим объемом памяти.

Почему нам нужно использовать ubiformat

Первая очевидная причина заключается в том, что ubiformat сохраняет счетчики стирания, поэтому вы не теряете информацию об уровне износа при создании новых изображений.[source 2]

Другая причина более тонкая и специфическая для памяти NAND, которая имеет алгоритм вычисления ECC, который создает код ECC, не эквивалентный всем байтам 0xFF, если страница NAND содержит только байты 0xFF. Рассмотрим пример.

  • Мы удаляем всю flash-память, поэтому теперь все равно 0xFF.
  • Мы пишем изображение UBI / UBIFS для прошивки с использованием nandwrite.
  • Некоторые стираемые блоки в изображении UBIFS могут содержать несколько пустых страниц NAND в конце, и UBIFS будет записывать их при запуске.
  • Утилита nandwrite записывает целое изображение, и он явно записывает байты 0xFF на эти страницы NAND.
  • Контрольные суммы ECC рассчитываются для этих NAND-страниц с 0xFF и сохраняются в области OOB. Коды ECC не равны 0xFF. Это часто имеет место для вычислительных машин для HW ECC, и это трудно исправить. Обычно для таких страниц коды ECC должны иметь значение 0xFF.
  • Когда позже UBIFS запускается, он записывает данные на эти страницы NAND, что означает, что новый код ECC рассчитывается и записывается поверх существующего (безуспешно, конечно). Это может вызвать ошибку сразу, но обычно в этот момент не возникает ошибка.
  • В какой-то момент UBIFS пытается прочитать с этих страниц и получает ошибку ECC (-EBADMSG = -74).

Простыми словами, ubiformat гарантирует, что каждая страница NAND будет записана один раз и только один раз после стирания. Если вы используете nandwrite, некоторые страницы пишутся дважды - один раз nandwrite, а один раз - UBIFS.

Как использовать mkfs.ubifs

Утилита mkfs.ubifs требует библиотеки zlib, lzo и uuid. Первые два используются для сжатия данных, а второй используется для создания универсально уникального идентификатора для файловой системы. В Fedora устанавливаются zlib-devel, lzo-devel и libuuid-devel. В старых дистрибутивах Fedora (Fedora 11 и ранее) библиотека uuid была установлена в пакете e2fsprogs-devel. В Debian устанавливайте пакеты zlib1g-dev, liblzo2-dev и uuid-dev.[source 2]

UBIFS становится медленнее, когда он заполнен?

Да, UBIFS пишет (но не читает) медленнее, когда заполнен или близок к заполнению. Есть две основные причины этого:

  • Сбор мусора замедляется, потому что небольшие кусочки грязного пространства распределяются по всему медиа, и UBIFS Garbage Collector должен переместить много блоков, чтобы создать один блок для стирания; Это фундаментальная причина, и она также существует в JFFS2;
  • Файловая система становится более синхронной; UBIFS буферизует грязные данные, но из-за сжатия и некоторых других факторов, таких как складирование небольших фрагментов в конце стираемых блоков, UBIFS точно не знает, сколько места буферизованные грязные данные возьмут на флеш-носитель, поэтому он использует пессимистические вычисления и Предполагает, что данные несжимаемы. Во многих случаях это неверно, но UBIFS должен принимать худший сценарий. Поэтому, когда все свободное пространство в файловой системе зарезервировано для буферизованных грязных данных, но пользователи хотят писать больше, UBIFS заставляет write-back фактически записать буферизованные грязные данные и посмотреть, сколько места будет доступно после этого. Тогда UBIFS может разрешить запись новых данных. Таким образом, очевидно, что чем меньше свободного пространства flash-памяти доступно, тем менее грязные данные могут быть буферизованы, и тем более синхронной становится файловая система.

Как получить данные из образов UBI/UBIFS

К сожалению, на данный момент нет пользовательских инструментов, которые могут разворачивать изображения UBI и UBIFS. UBIFS нельзя также монтировать с обратной связью, потому что он не работает с блочными устройствами.

Тем не менее существуют модули ядра, которые позволяют вам создать виртуальный MTD, на который может быть смонтирован UBIFS. У вас есть два варианта:

  • Nandsim, который может имитировать различные устройства NAND. Вы можете найти неполный список этих устройств здесь.[4].Чтобы эмулировать данное устройство, передайте его байты идентификатора через параметры модуля first_id_byte, second_id_byte, third_id_byte и 4th_id_byte.
  • Mtdram, который имитирует общий MTD. Используйте параметр module total_size, чтобы указать размер устройства в KiB и erase_size, чтобы указать размер блока стирания в KiB. Этот модуль полезен для установки изображений UBIFS, сделанных для памяти NOR, которые обычно имеют минимальный блок ввода-вывода в 1 байт, в отличие от устройств NAND, у которых минимальная единица составляет не менее 512 байт. Подробнее см. Здесь[5].

Примечания

  1. Artem Bityutskiy (2008-03-27). "UBIFS - new flash file system". Retrieved 2016-12-18. 
  2. Thomas Petazzoni (2012-10-03). "UBI fastmap making its way to mainline". Archived from the original on 2012-11-15. Retrieved 2016-12-18. 
  3. Richard Weinberger (2012-09-24). "UBI: Fastmap request for inclusion (v18)". Retrieved 2016-12-18. 
  4. "NAND Flash Support Table". 
  5. "Minimum flash input/output unit". 

Источники

  1. 1,0 1,1 1,2 1,3 UBIFS // Википедия. [2017—2017]. Дата обновления: 31.03.2017. URL: [1] (Дата обращения: 09.04.2017)
  2. 2,0 2,1 2,2 2,3 UBIFS FAQ and HOWTO // MTD. [2017—2017]. Дата обновления: 31.03.2017. URL: http://www.linux-mtd.infradead.org/faq/ubifs.html (Дата обращения: 11.04.2017)

Ссылки

Примечания