LINUX.ORG.RU

U-Boot + OpenWRT: Обновление из-под Linux

 , , ,


0

1

Салют!

Может быть, не в тот раздел пишу, так что ругайтесь, если что.

Занимаюсь портированием OpenWRT на свою плату. После долгих изысканий остановился на следующей структуре системы:

------------------------------------------------------------------
       |bootloader|boot_env|  fdt  |  kernel  |       root       |
 MTD   |    3M    |  256k  |  128k |    5M    |        -         |
------------------------------------------------------------------
                                              |rootfs|rootfs_data|
 UBI                                          |  40M |     -     |
------------------------------------------------------------------
Загрузочная команда следующая (у меня mx28 + NAND):
nand read 0x41000000 fdt ${filesize_fdt} ; 		
nand read 0x42000000 kernel ${filesize_kernel}; 
bootm 0x42000000 - 0x41000000
Все работает, все ОК. Однако, для обновления прошивки я сейчас захожу в U-Boot и запускаю следующий скрипт:
tftp 0x42000000 my_board.dtb ;       /* Дерево устройств */
nand erase.part fdt ;
nand write 0x42000000 fdt ${filesize} ;
tftp 0x42000000 openwrt-mxs-uImage ; /* Ядро */
nand erase.part kernel ;
nand write 0x42000000 kernel ${filesize} ;
tftp 0x42000000 rootfs.ubifs ;       /* Корневая ФС */
nand erase.part root ;
ubi part root ;
ubi create rootfs 0x2A00000 ;
ubi create rootfs_data ;
ubi write 0x42000000 rootfs ${filesize} ; 
Вопрос в следующем: как обновлять прошивку (целиком или по частям) из-под работающего Линукса?



Последнее исправление: vgovseychuk (всего исправлений: 5)
Ответ на: комментарий от Dark_SavanT

Я вот тут https://habrahabr.ru/post/264843/ почитал про sysupgrade, initramfs.

Правильно я понял, что fdt надо паковать в rootfs? Соответственно, нужно переразметить NAND ( в который раз =) ) в такой вид:

----------------------------------------------------------
       |bootloader|boot_env|  kernel  |       root       |
 MTD   |    3M    |  256k  |    5M    |        -         |
----------------------------------------------------------
                                      |rootfs|rootfs_data|
 UBI                                  |  40M |     -     |
----------------------------------------------------------
и пересобрать образ в формат ...initramfs-uImage.bin ?

Достаточно ли для этого просто включить поддержку initramfs в ядре и чем собирать образ?

В свою систему я вносил изменения (монтировал в ext4, менял файлы, а затем делал mkfs.ubifs), а как быть тут?

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

читай исходники, без этого никуда.

fdt держишь там где удобно. У меня вообще в ядро вшито, что не очень правильно, но это уже legacy. другое дело, что если fdt у тебя на ubifs-разделе, тебе надо предварительно ведру рассказать где и как этот ubifs раздел взять.

Короче, для начала разберись как правильно использовать UBI.

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

В общем, наморочился я с этим вопросом и ни к чему не пришел. Порылся в sysupgrade, почитал про ubi. Не хватает скилов, чтоб все это сделать под мою систему. Где-то пишут, что initramfs-uImage.bin сам при сборке создается, но у меня нет. Где-то делают через ubiupdatevol, но у меня вылетает ошибка:

root@TestTest:/# ubiupdatevol dev/ubi0_0 /tmp/rootfs.img
[ 2885.328555] UBI error: ubi_open_volume: cannot open device 0, volume 0, error -16
ubiupdatevol: can't open 'dev/ubi0_0': Device or resource busy
С переключением в ramfs тоже не справился. Даже не знаю, с какого конца взяться.

Может, подкинете еще идей?

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

kernel и fdt таким образом обновляются(они не под UBI). Это, я так понимаю, не гуд, потому что nand, бэдблоки, вот это все. Но вопрос главный в том, как переписывать разделы UBI.

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

Да, копался там. Моя железка (mx28) почему-то не поддерживает этот пакет(procd-nand). Меня заинтересовала функция run_ramfs. Ее можно как-то вызвать отдельно? Т.е. просто переключиться на работу из оперативки.

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

Опять то же самое

@TestTest:/# ubiupdatevol dev/ubi0_0 /tmp/root/rootfs.img
[  853.082273] UBI error: ubi_open_volume: cannot open device 0, volume 0, error -16
ubiupdatevol: can't open 'dev/ubi0_0': Device or resource busy

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

В общем, с UBIUPDATEVOL ничего не получилось. Буду делать через запись в резервный раздел (mtd write rootfs.ubifs updatevolume) и изменение переменных U-Boot (fw_setenv). Не очень изящное решение, но хоть как-то.

Если будут еще предложения, пишите.

Спасибо!

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

Сделал полное обновление немного кривым способом, потеряв где-то 20% места на NAND: выделил разделы под запись обновляемых файлов: updfdt(размер 0х40000), updkernel(0х500000), updroot(последний включен в UBI, 0х2а00000). Из этого вытекает вопрос контроля того, что записали.

Я пишу из-под линукса скачанные файлы обновления в запасные разделы командами встроенных утилит:

mtd erase updroot
mtd write rootfs.img  updroot
mtd erase updkern
mtd write openwrt-mxs-uImage updkern
fw_setenv filesize_kernel $(printf %x $(stat -c %s openwrt-mxs-uImage))
mtd erase updfdt
mtd write TestTest.dtb updfdt
fw_setenv filesize_fdt $(printf %x $(stat -c %s TestTest.dtb))
А из бутлоадера
"nand read ${loadaddr} updfdt 0x40000;"
"nand erase.part fdt;"
"nand write ${loadaddr} fdt 0x40000;"
"nand read ${loadaddr} updkern 0x500000;" 
"nand erase.part kernel;"
"nand write ${loadaddr} kernel 0x500000;"
"ubi part root; "
"ubi read ${loadaddr} updroot 0x2A00000; "	
"nand erase.part root; "
"ubi part root; "
"ubi create updroot 0x2A00000; "
"ubi create rootfs 0x2A00000; "
"ubi create rootfs_data; "
"ubi write ${loadaddr} rootfs 0x2A00000"
Меня интересуют механизмы работы команд mtd, nand, ubi (проверяют ли они бэдблоки, надо ли следить, что они записали). Посмотрел в коде mtd, вроде, есть проверка бэдблоков при записи, но как это будет сочетаться с тем, что updroot - UBI-раздел? Например, нет команды mtd read в OpenWrt, и не проверить, правильно ли все записалось. Или как узнать, все ли бутлоадер правильно прочтет, если в разделе есть так любимые NAND-ом бэдблоки.

P.S. В Openwrt есть еще команда nandwrite. Может, ее применять вместо mtd write?

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

Нормально ли то, что я копирую весь раздел операцией read/write а не размер файла(понятно, что это медленнее, но что будет происходить при наличии бэдблоков)?

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