реклама на сайте
подробности

 
 
> Sysupgrade / switch root to ram
vgovseychuk
сообщение Mar 11 2016, 13:45
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 16-03-14
Пользователь №: 80 955



Привет, Электроникс!

Пытаюсь обновиться из-под линукса.
В sysupgrade нет поддержки UBI, так что пытаюсь сделать обновление вручную.
При попытке переписать в лоб - ошибка (хотя mtd write работает):
Код
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

Посмотрел, как это делает sysupgrade:
Сначала копирует необходимые бинарники, а затем переключается на работу из оперативки.
У меня переключение рута в tmp/root не удалось (не понял принципа, ибо нуб)

В общем интересуют 2 вопроса:
1. Как переключаться на работу из оперативки, освобождая тем самым /dev/ubi0_0?
2. Если есть более удобный способ обновления системы с UBI?

P.S. разделы у меня такие:
Код
-----------------------------------------------------------------
      |bootloader|boot_env|  fdt  |  kernel  |       root       |
MTD   |    3M    |  256k  |  128k |    5M    |        -         |
-----------------------------------------------------------------
                                             |rootfs|rootfs_data|
UBI                                          |  40M |     -     |
-----------------------------------------------------------------

Части системы (fdt, kernel, rootfs) пишу в пямять по отдельности.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
alx2
сообщение Mar 17 2016, 04:56
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091



Цитата(vgovseychuk @ Mar 11 2016, 19:45) *
В sysupgrade нет поддержки UBI, так что пытаюсь сделать обновление вручную.

Поскольку никто Вам не отвечает, решил вставить реплику.
Сразу скажу, что ответов на ваши конкретные вопросы у меня нет. Но есть другая мысль.
Насколько я понял (после гугленья sysupgrade), Вы планируете делать апгрейд следующим образом: нужные файлы (например конфиги) сохраняются на другой FS, корневая FS полностью стирается и переписывается новым образом, после чего сохраненные файлы возвращаются на место. Суть моей реплики - нафига Вам переписывать всю файловую систему целиком? Почему бы не воспользоваться системой пакетов и каким-либо пакетным менеджером? Описанной проблемы тогда у Вас не будет в принципе, в процессе обновления будут переписываться только реально обновляемые файлы... Может Вы и ответа не получаете именно потому, что выбранным Вами путем мало кто идет?

Еще несколько преимуществ использования пакетов:
- Не надо заново выкачивать и перезаписывать образ всей файловой системы ради крошечного обновления (к примеру, чтобы обновить SSL-сертификат), достаточно одного малюсенького пакетика.
- Перерыв в работе системы отсутствует совсем или минимален - после обновления требуется перезапуск только реально обновившихся компонентов.
- Гибкость - на разных системах может быть разный набор пакетов.

Сообщение отредактировал alx2 - Mar 17 2016, 05:09


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post
vgovseychuk
сообщение Mar 17 2016, 08:06
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 16-03-14
Пользователь №: 80 955



Вообще да, можно и так.
Но это же каждый раз надо вписывать в скрипт, какие пакеты и файлы ты обновлял.
Цитата(alx2 @ Mar 17 2016, 07:56) *
Может Вы и ответа не получаете именно потому, что выбранным Вами путем мало кто идет?

Я посчитал такой вариант наиболее верным с оглядкой на то, как это сделано, например, в роутерах.
В любом случае, большое спасибо за совет.
Go to the top of the page
 
+Quote Post
vgovseychuk
сообщение Mar 17 2016, 10:09
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 16-03-14
Пользователь №: 80 955



Сделал полное обновление немного кривым способом, потеряв где-то 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 read в OpenWrt, и не проверить, правильно ли все записалось. Или как узнать, все ли бутлоадер правильно прочтет, если в разделе есть так любимые NAND-ом бэдблоки.
Нормально ли то, что я копирую весь раздел операцией read/write а не размер файла(понятно, что это медленнее, но что будет происходить при наличии бэдблоков)?

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

P.P.S Посмотрел в коде mtd и nandwrite, вроде, есть проверка бэдблоков при записи.

Сообщение отредактировал vgovseychuk - Mar 17 2016, 11:58
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 11:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01358 секунд с 7
ELECTRONIX ©2004-2016