UBIFS

Предыдущая  Содержание  Следующая  V*D*V

http://www.linux-mtd.infradead.org/faq/ubifs.html#L_mkfubifs

git://git.infradead.org/mtd-utils.git

http://97.74.126.48/plugwiki/index.php/Enabling_UBIFS

 

В ядре должна быть включена поддержка UBIFS:

 

Device Drivers  --->

   <*> Memory Technology Device (MTD) support  --->

       UBI - Unsorted block images  --->

             <*> Enable UBI

 

File systems  --->

   [*] Miscellaneous filesystems (NEW)  --->

       <*>   UBIFS file system support

 

Строка запуска Linux:

 

CONFIG_CMDLINE=”console=ttyS0,115200 ubi.mtd=rootfs root=ubi:rootfs rootfstype=ubifs rootflags=bulk_read,chk_data_crc rw”

 

Внимание!

После первого запуска система фиксирует свои параметры во флеш. Если происходит пересборка файловой системы с другими параметрами –c и vol_size, необходимо перед прошивкой полностью очистить флешь. (лучше это делать всегда)

 

Сборка утилит

Установить git:

 

sudo apt-get install git-core

 

Скачать исходники, находясь в рабочей директории:

 

git clone git://git.infradead.org/mtd-utils

 

Инсталировать пакеты для компиляции:

 

sudo apt-get install liblzo2-dev uuid-dev zlib1g-dev

 

(для Fedora: проинсталировать zlib-devel, lzo-devel и e2fsprogs-devel)

 

Собрать утилиты.

 

cd mtd-utils

make

Сборка образа

Компиляция образа из готовой файловой системы для k9k8g08u0a производится следующим скриптом:

 

#!/bin/sh

 

mkfs.ubifs -e 0x1F800 -c 65536 -m 2048 -x lzo -r root-fs -o rootfs.ubifs 

ubinize -p 128KiB -m 2048 -s 512 -o rootfs_ubi.bin ubifs.cfg

rm -f rootfs.ubifs

 

 

Содержимое файла ubifs.cfg:

 

[ubifs]

mode=ubi

image=rootfs.ubifs

vol_id=0

vol_size=32MiB

vol_type=dynamic

vol_name=rootfs

vol_flags=autoresize

 

Файл для прошивки: rootfs_ubi.bin.

 

-r root-fs: говорит mkfs.ubifs создать UBIFS-образ, который был бы идентичен содержимому локальной директории rootfs;

-m 2048: говорит mkfs.ubifs, что минимальный размер единицы ввода/вывода flash этого  UBIFS-образа создаётся 2048 байт (NAND page в этом случае);

-e 0x1F800: размер логического eraseblock этого UBI раздела для которого создаётся образ;

-c 65536: определяет максимальный размер файловой системы в логических eraseblocks; это означает, что будет возможно использовать результирующую файловую систему на разделах до этого размера (меньше или равно); так что в этом частном случае, результирующая FS может быть до примерно 8GiB (129024 умножить на 65536);

-p 128KiB: говорит ubinize, что размер физического eraseblock микросхемы flash этого UBI-образа создается для 128KiB (128 * 1024 bytes);

-s 512: говорит ubinize, что эта flash поддерживает sub-pages и размер sub-page равен 512 байт; ubinize возьмёт это в расчёт и установит этот VID заголовок, чтобы установить NAND;

vol_size: минимальный размер создаваемой файловой системы. Должен быть минимум на 3% меньше реального для того, чтобы осталось место хранения информации о плохих секторах;

vol_name: имя раздела, должно соответствовать имени раздела, заданного в таблице в ядре Linux;

vol_flags=autoresize: при первом запуске файловая система будет расширена до максимального имеющегося объёма;

Определение параметров

К сожалению, рекомендуемая утилита mtdinfo не даёт требуемой информации, а в документации на Nandflash её может не оказаться, поэтому сначала производится сборка с какими-либо примерно подходящими параметрами.

Например, на данной плате от mtdinfo была получена следующая информация:

 

mtd0

Name:                           Partition 1

Type:                           nand

Eraseblock size:                131072 bytes, 128.0 KiB

Amount of eraseblocks:          2 (262144 bytes, 256.0 KiB)

Minimum input/output unit size: 2048 bytes

Sub-page size:                  unknown

Bad blocks are allowed:         true

Device is writable:             true

 

mtd1

Name:                           Partition 2

Type:                           nand

Eraseblock size:                131072 bytes, 128.0 KiB

Amount of eraseblocks:          8190 (1073479680 bytes, 1023.8 MiB)

Minimum input/output unit size: 2048 bytes

Sub-page size:                  unknown

Bad blocks are allowed:         true

Device is writable:             true

 

PEB = Physical Erase Block size = Физический размер блока стирания.

LEB = Logical  Erase Block size = Логический размер блока стирания.

 

Erase block size (PEB) берётся из документации на Nandflash, обычно 2048.

Значение параметра -е (LEB):

В случае NOR flash, которая имеет минимальный размер единицы ввода/вывода 1 byte, LEB = PEB - 128;

В случае NAND flash, которая не имеет sub-pages (например, MLC NAND), O = 2 NAND pages, т.е. 4KiB в случае 2KiB NAND page и 1KiB в случае 512 bytes NAND page;  NAND flash with 2048 byte NAND page and no sub-page: LEB = PEB - 4096. В случае  NAND flash, которая имеет sub-pages, UBI оптимизирует это на уровне flash и помещает заголовки EC и VID в той же самой NAND page, но разных sub-pages; в этом случае O равно только одной NAND page;

NAND flash with 512 byte NAND page and 265 byte sub-page: LEB = PEB - 512;

NAND flash with 2048 byte NAND page and 512 byte sub-page: LEB = PEB - 2048;

Для других flashes overhead должен быть минимум 2 минимальных I/O units, если размер min. I/O unit больше или равен 64 bytes, и 2-жды по 64 bytes, выровненных к размеру min. I/O unit, если размер min. I/O unit меньше, чем 64 bytes.

 

Далее производится прошивка.

После запуска проверяется информация:

 

UBI: physical eraseblock size: 131072 bytes (128 KiB)

UBI: logical eraseblock size: 129024 bytes

UBI: smallest flash I/O unit: 2048

UBI: sub-page size: 512

 

При необходимости производится пересборка с новыми параметрами.

Использование образа с другой Nandflash или как заставить UBI игнорировать sub-pages

Если ваша NAND flash поддерживает sub-pages, UBI будет использовать их.  Но иногда вы можете хотеть сказать UBI, чтобы она игнорировала sub-pages, например, если вы имеете UBI-образ, который был сделан для аналогичной NAND flash, но без sub-pages, или если вы только хотите запретить sub-pages для целей тестирования. Можно сделать это сделав, чтобы UBI насильно читала/писала VID header от/к началу второй страницы, взамен второй sub-page (которая используется по умолчанию). И UBI использует sub-pages только для VID headers, что достаточно.

Если вы подключаете устройства MTD используя ubiattach tool – просто используйте опцию --vid-hdr-offset и определите смещение второй страницы. Например, если вы имеете 2048-byte NAND pages, используйте --vid-hdr-offset 2048. Все примеры ниже подразумевают 2048-byte NAND pages.

Если вы не используете ubiattach и взамен определяете устройства MTD для подключения, используя kernel boot parameters, то вы можете задать смещение VID header после имени или номера устройства MTD. Например:

 

$ ubi.mtd=rootfs,2048

$ ubi.mtd=3,2048

 

это подключит устройство MTD с именем "rootfs" (или устройство MTD номер 3) и заставит UBI читать/писать заголовки VID от/к смещению 2048, то есть во вторую страницу NAND.

Аналогично, если используется module load parameters, попробуйте

 

$ modprobe ubi mtd=rootfs,2048

$ modprobe ubi mtd=3,2048

 

И конечно, если используется партиция MTD, которая уже отформатирована так, чтобы использовать sub-pages, уже использована, что означает, что все заголовки VID уже установлены по смещению 512 (вторая sub-page 2048-байта NAND-страницы), невозможно заставить UBI остановить использование sub-pages (это будет приводить к падению). Разрешается делать это только если подключается пустой раздел MTD или если flash уже форматирована так, что все заголовки VID имеют смещение 2048. Это означает, что если используется ubinize, необходимо воздержаться от использования параметра -s.

См. также

http://www.linux-mtd.infradead.org/doc/ubi.html#L_overhead

Предыдущая  Содержание  Следующая