LINUX.ORG.RU

ubifs - как приготовить правильный образ

 


0

1

Всех приветствую.
Решил тут сделать rootfs для платы с nand.
Первый раз потыкался вроде как собралось, завелось и заработало.
Потом после того как в процессе разработки «по-полировал» nand, пошли всякие предупреждения что блоков мало и т.д. Похоже, когда собирал образ не совсем правильно указал параметры и маловато блоков за резервировалось для ошибок nand.
Начал рыть доки, что да как. И вот тут выяснилось, что каждый волен по своему трактовать все эти LEBs, PEBs, min-io-size и т.д.

Если ли у кого непротиворечивая теория того как нужно правильно задавать параметры для UBIFS?

★★★★★

Вот еще, что мне когда-то помогло:

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

Я, правда, последнее время собираю имидж рутфс с билдрутом. Поэтому перестал вызывать mkfs.ubifs, ubinize «руками» - прописал в конфиге билдрута настройки флешки, в Buildroot/fs/ubifs/ubinize.cfg и задал имя ubifs тома. Если собираете систему с билдрутом, так собирать рутфс имидж в сам деле проще...

velikS
()
Ответ на: комментарий от velikS

Все это уже зачитал до дыр (я не тру-лоровец, сначала сам ищу, а потом уже сюда).
Можно на словах пояснить из каких соображений выбирают параметры?
Например вот у меня есть на nand свободное пространство под rootfs - 251MiB
Размер страницы - 2KiB
Размер блока - 128KiB (он же размер PEB)
Никаких подстраниц.

Какой размер LEB должен быть?
Видел варианты 128, 126, 124 KiB (какой рассово-верный?)
Сколько выбрать vol_size?
Я так понял выбрать нужно меньше чем максимальный размер MTD-раздела. На сколько меньше?
Что ставить в "-c, --max-leb-cnt=COUNT"?
Слышал что нужно размер раздела поделить на размер LEB. В одном месте было пространное рассуждение, что на самом деле нужно делить на PEB.
Можно ли где-то указать зарезервировать для bad-блоков не 1%, а например 5%?

yax123 ★★★★★
() автор топика
Ответ на: комментарий от yax123

Извини, я тут грипп подцепил, так что торможу не па-децки...


Какой размер LEB должен быть?

Точно не 128. Без подстраниц будет 124к, поскольку он заберет 2 страницы для себя:
UBI utilizes sub-pages to lessen flash space overhead. The overhead is less if NAND flash supports sub-pages (see here). Indeed, let's consider a NAND flash with 128KiB eraseblocks and 2048-byte pages. If it does not have sub-pages, UBI puts the the VID header at physical offset 2048, so LEB size becomes 124KiB (128KiB minus one NAND page which stores the EC header and minus another NAND page which stores the VID header.


Сколько выбрать vol_size? Я так понял выбрать нужно меньше чем максимальный размер MTD-раздела. На сколько меньше?

Как я понимаю на 4 + зарезервированные bad blocks. http://www.linux-mtd.infradead.org/doc/ubi.html#L_overhead
В моем случае это было 640 - 4 - 40 = 596. 40 - максимально гарантированное число дефектных блоков на NAND.

Можно ли где-то указать зарезервировать для bad-блоков не 1%, а например 5%?

По-нормальному только в настройках ядра. Но есть патч на mtd-utils, в котором это можно указывать при ubiattach, я им, правда, не пользовался http://git.infradead.org/mtd-utils.git/commit/878e06ea555ba5dbfb974b3904d1a86...

velikS
()
Ответ на: комментарий от velikS

Спасибо, более менее понятно.
А что скажете насчет параметра -c в утилите mkfs.ubifs, как его считать?

yax123 ★★★★★
() автор топика
Ответ на: комментарий от yax123

Привет!

Разобрались или решили с УБИ не связываться? )) Кстати, какой сакральный смысл в «Можно ли где-то указать зарезервировать для bad-блоков не 1%, а например 5%?» Я как-то сам наступил на эти грабли, поэтому, если не забили на УБИ, могу поделиться опытом, что тут надо внимательней почитать даташит вашего чипа. Производители обычно гарантируют, что число дефектных блоков не превысит Х за все время эксплуатации чипа (обычно 100.000 циклов записи/стирания). К примеру, у меня чип с 4096 блоков, гарантировано появление не более 40 дефектных. Т.е. в терминах ядра до 3.6 это 1%. С 3.6 надо указывать не %, а число дефектных на 1024. Как говорили у нас на военке: «те же яйца, вид сбоку». Я со своим 3.8 указываю 10 на 1024. Прикол тут в том, что УБИ слой резервирует на МТД под дефектные блоки место исходя не из размера МТД партиции, а из размера чипа! Т.е. на каждой МТД, на которой я захочу запустить УБИ, он отхавает 40 блоков под bad blocks handling pool. Это кажется дофига, но где гарантия, что дефектные блоки не появятся внутри одной МТД? Короче, я как-то по незнанию выделил 10% под bad blocks и определил маленькую МТД. Столкнулся с тем, что на ней ваще не было места!!! ))) УБИ схавал ВСЕ под пул для дефектных блоков. Не наступайте на мои грабли ;-)

velikS
()
Ответ на: комментарий от ymn

Кстати, как там с вашей платой? Интересно, за сколько она теперь загружается? )) Моя так и осталась на 9 секундах. В требованиях 10секунд, так что я не заморачиваюсь. Хотя в УБИ в 3.7 ввели fast mapping. Обещают очень быстрое время монтирования за счет потери 2 блоков на этот fast mapping. Но я решил не пробовать )))

velikS
()
Ответ на: комментарий от velikS

после выкидывания всего ненужного из юбута и ядра, после переписывания драйвера nand для ядра и юбута на DMA и прерывания грузится около 15 секунд. но у меня головная станция для цифрового телевидения, там быстрый старт не критичен.

ymn ★★★★★
()
Ответ на: комментарий от velikS

Не связываться не получится. В общем все благополучно решилось. Проблема оказалось как обычно не в том месте. Я думал что добавил в ядро поддержку ubifs, а ее там почему-то не оказалось (хотя я точно помню что добавлял).

После добавления все взлетело. Насчет увеличения резервирования под беды: весь мой рут сейчас 120МБ (и расти он может только за счет логов который конечно будут ротироваться, поэтому вряд ли больше 130 будет), раздел под него 250МБ. Поэтому были у меня мысли побольше зарезервировать чтобы подольше пожило.

А настройки в конце концов я выбрал такие:

vol_size=200MiB  
mkfs.ubifs -g 1 -v -r fs -m 2KiB -e 124KiB -c 1980 -o tmp_rootfs.img
ubinize -v -o rootfs_ubi.img -m 2KiB -p 128KiB -s 2KiB ubinize.cfg 

при загрузке ядра выходит следуещее:

UBI: attaching mtd2 to ubi0
UBI: physical eraseblock size:   131072 bytes (128 KiB)
UBI: logical eraseblock size:    126976 bytes
UBI: smallest flash I/O unit:    2048
UBI: sub-page size:              512
UBI: VID header offset:          2048 (aligned 2048)
UBI: data offset:                4096
UBI: attached mtd2 to ubi0
UBI: MTD device name:            "rootfs"
UBI: MTD device size:            250 MiB
UBI: number of good PEBs:        2000
UBI: number of bad PEBs:         0
UBI: max. allowed volumes:       128
UBI: wear-leveling threshold:  4096
UBI: number of internal volumes: 1
UBI: number of user volumes:     1
UBI: available PEBs:             0
UBI: total number of reserved PEBs: 2000
UBI: number of PEBs reserved for bad PEB handling: 20
UBI: max/mean erase counter: 14/9
UBI: image sequence number: 958519730

....

UBIFS: mounted UBI device 0, volume 0, name "rootfs"
UBIFS: file system size:   189067264 bytes (184636 KiB, 180 MiB, 1489 LEBs)
UBIFS: journal size:       9023488 bytes (8812 KiB, 8 MiB, 72 LEBs)
UBIFS: media format:       w4/r0 (latest is w4/r0)
UBIFS: default compressor: lzo
UBIFS: reserved for root:  0 bytes (0 KiB)

ну и mtdinfo:

                                                                                           
# mtdinfo -m 2
Name:                           rootfs
Type:                           nand
Eraseblock size:                131072 bytes, 128.0 KiB
Amount of eraseblocks:          2000 (262144000 bytes, 250.0 MiB)
Minimum input/output unit size: 2048 bytes
Sub-page size:                  512 bytes
OOB size:                       64 bytes
Character device major/minor:   90:4
Bad blocks are allowed:         true
Device is writable:             true

Короче, я как-то по незнанию выделил 10% под bad blocks и определил маленькую МТД

А как вы выделили 10%, ядро патчили?

yax123 ★★★★★
() автор топика
Ответ на: комментарий от yax123

Не связываться не получится. В общем все благополучно решилось. Проблема оказалось как обычно не в том месте. Я думал что добавил в ядро поддержку ubifs, а ее там почему-то не оказалось (хотя я точно помню что добавлял).

Возможно включили УБИ, а не УБИФС. Это - две большие разницы. У меня 2 МТД с УБИ. Одна - для рутфс (монтирована как RO), а на другой я запустил 4 тома (volumes) и использую для R/W. 3 тома работают с УБИФС а один с ФАТ ))) Зачем фат? В УБИ есть вкусная фишка CONFIG_MTD_UBI_GLUEBI. с ней для каждого УБИ-Тома получаете МТД доступ. Так вот мне надо разрашать доступ к прибору как к mass storage. Для mass storage нужна файловая система, которую будет понимать Windows. Конечно ФАТ. А как запустить ФАТ на флэш чипе? Вот как раз через такой способ. Получаем: ФАТ систему и wear leveling работает через УБИ слой )))

UBI: logical eraseblock size: 126976 bytes
Sub-page size: 512 bytes

Э-э-э, а это что такое??? Вы уверены, что на вашем чипе нету подстраниц? Похоже, ваш LEB будет 126к, как и у меня.


А как вы выделили 10%, ядро патчили?

CONFIG_MTD_UBI_BEB_RESERVE В старых ядрах и CONFIG_MTD_UBI_BEB_LIMIT в новых

velikS
()
Ответ на: комментарий от velikS

Возможно включили УБИ, а не УБИФС

Я в курсе, что их две и надо обе включать. Просто похоже где-то затупил.

Sub-page size: 512 bytes

Вот и я сам удивился.
В даташите конечно про подстраницы ничего не сказано (используется nand02gr3b2d).

Про фат овер юби забавно, надо будет запомнить.

yax123 ★★★★★
() автор топика
Ответ на: комментарий от yax123

Да, странно. Похоже, что NAND02GR3B2D - SLC чип, а в SLC почти всегда есть подстраницы. К тому же на странице 34 (figure 19 «page organization») показано, что страница состоит из подстраниц. Я б попробовал LEB 126k. Кстати, мой даташит на MT29F4G16ABBDA еще более угробищный. Там тоже ни слова про подстраницы. Я исходил из инструкции на http://www.linux-mtd.infradead.org/faq/ubifs.html#L_mkfubifs Они там рекомендуют запустить mtdinfo чтоб узнать параметры. Я так и делал. Кстати, ваш чип им знаком (http://www.linux-mtd.infradead.org/nand-data/nanddata.html), так что я б попробовал с подстраницами...

velikS
()
Ответ на: комментарий от velikS

То есть mtdinfo выдает «истинную» информацию?
Хорошо, попробую.
С другой стороны сейчас и так все работает. Оставлю заметку - потом попробую.

Кстати, ваш чип им знаком

Да, я видел. Хотя какая от этого польза непонятно.

yax123 ★★★★★
() автор топика
Ответ на: комментарий от yax123

Ok. Удачи.
Со 124к точно будет работать, поскольку VID header засунет не во вторую подстраницу, а во вторую страницу, т.е. в худшем случае (в вашем текущем варианте) потеряете 2к на страницу места на чипе.

velikS
()
Ответ на: комментарий от yax123

Та я и не спорю. Лучше - враг хорошего )) Лучше почти всегда можно, но не часто нужно. У меня у самого отложенных пунктов туева хуча )))

Кстати, ваш чип им знаком

Да, я видел. Хотя какая от этого польза непонятно.

Не факт, конечно, но очень возможно, что они и с этим чипом тестировали свою УБИ/MTD. Т.е. как-бы надо иметь в виду...

velikS
()
29 июля 2013 г.
Ответ на: комментарий от yax123

Помогите

Есть железка тонкий клиент на marvel чипе с orion nand

trustco
()
Ответ на: комментарий от yax123

Помогите 2

Извините вместо перевода строки отправилось не допечатанное сообщение. Задача стоит для тонкого клиента собрать работающую ОС, платформа arm, предыдущая ОС, которая была на устройства была ubifs. Хочется научиться самому например из debian собрать ubi.img, который заработал бы на нашем устройстве. Может у вас есть, какие-нибудь инструкции по которым можно было бы собрать рабочий образ. Спасибо.

trustco
()
Ответ на: Помогите 2 от trustco

Добрый вечер.
Все инструкции которыми я пользовался были от марвела (кто как не производитель знает как работать с его продукцией). С другой стороны вся документация под NDA. Так что предлагаю посетить какой-нидь ресурс посвященный линуксу на АРМ. Рекомендую для начала найти дистр для которого есть успешный опыт запуска на вашем процессоре. Как правило, там есть подробная инструкция как все это запустить.

И напоследок: ubifs - это файловая система, а не ОС.

yax123 ★★★★★
() автор топика
Ответ на: комментарий от yax123

Спасибо. Я не правильно выразился, ОС там была Debian. Дело в том, что устройство из китая и внятной документации найти не удалось. Поиски по ресурсам линукс на АРМ тоже ничего не дали. Процессор стоит CPU : Marvell Feroceon (Rev 1)

trustco
()
Ответ на: комментарий от trustco

Процессор стоит CPU : Marvell Feroceon (Rev 1)

Лучше отклеить радиатор и прочитать маркировку.
Скорей всего там что-то вроде 88f6282 и иже с ними. На этом делают всякие ip-plug.
Найдите популярную железку на этом чипе и для этой железки найдите дистр.
И вообще, поры бы уже начать самому соображать.

yax123 ★★★★★
() автор топика
10 января 2014 г.
Ответ на: комментарий от yax123

Здравствуйте Есть прошивка для андроид-магнитоллы, похоже в формате UBIFS Помогите добавить рут в прошивку Магнитолла: Car Make: Peugeot 408, with CANBUS Operating System: Pure android 2.3.4 CPU: Freescale iMX51, 800MHz, Ram 512MB Прошивка: http://yadi.sk/d/VI9V_cLA8nDoy

rrrakim
()
Ответ на: комментарий от rrrakim

Я по андроиду безграмотный, ни разу с ним не работал (потыкать телефон в магазе не в счет). Так же ни разу не имел дел с Freescale. Так что извините.

yax123 ★★★★★
() автор топика
Ответ на: комментарий от rrrakim

Хотя бы, чем попробовать открыть прошивку

Черт его знает. скорей всего при помощи каких-то утилит.
Начните отсюда: http://www.linux-mtd.infradead.org/doc/ubifs.html
Я чего-то давно уже не брал в руки шашек (наверно полгода), так что даже мыслей никаких нет. Ищите доки как самому собрать образ (пригодится на втором этапе), параллельно найдете как образ разобрать.

А вообще логичным выглядит способ подпаяться к последовательному порту и рутоваться на самой магнитоле. Насколько это возможно я не в курсе, но попробовать стоит.

yax123 ★★★★★
() автор топика
Ответ на: комментарий от yax123

Спасибо попробую Да и меня посещали мысли, разобрать её и поискать порт uart

rrrakim
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.