LINUX.ORG.RU

обновление rootfs


0

1

Имеется встраиваемое устройство на арм платформе с линуксом на борту. Память нанд флэш. Ядро и рутфс в нанд. Используется mtd + ubifs. mtd partitions вбиты в исходники ядра. Стоит задача обновить все содержимое флэша, делать это требуется из линукса. Источником новой прошивки флэш является usb-флэшка или sd карта которую пользователь воткнет в устройство. Перезаписать ядро проблемы не составляет. А как переписать рутфс на работающей системе - вопрос. Кроме того нельзя исключать что в новой версии изменится разбиение партиций. Таким образом в идеале хотелось бы уметь перезаписывать весь объем nand. После обновления устройство идет на перезагрузку, во время обновления приложения убиваются но ядро должно работать для доступа к usb. Сохранение каких либо старых данных не требуется - это ПОЛНАЯ перепрошивка устройства. Как подступиться к данной задаче ?

Берёшь и делаешь. С чем проблемы-то?

anonymous
()

разделение на разделы обычно - строка в конфигурации ядра.

записывать в разделы - man flashcp

если рутфс в ro то перезапись никаких проблем не вызывает. Если в rw - то ссзб.

Dark_SavanT ★★★★★
()

Если на устройстве достаточно свободной оперативной памяти, то можно создать временную минимальную rootfs в tmpfs.
После этого вызвать pivot_root, отмонтировать nand либо перемонтировать в read-only и обновить систему.
Я именно так и делал.

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

Либо если на nand достаточно свободной памяти, то можно разбить ее на несколько лэйаутов. Например u-boot, u-boot-env, uImage, rootfs1, rootfs2.
При обновлении перезаписывать тот rootfs, который не является текущим.
После этого делать его текущим через изменения переменных u-boot'a.

Dead ★★★★
()

Я встречал устройство, которое прошивалось из initrd. Когда надо прошить — грузится в initrd, а когда не надо прошивать — грузится без initrd. Ещё в OpenWrt как-то реализована перепрошивка из работающей системы без initrd, но я не разбирался.

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

Ещё в OpenWrt как-то реализована перепрошивка из работающей системы без initrd, но я не разбирался.

Посмотрел: там сначала конфиги тарятся и засовываются в tmpfs, потом делается pivot_root в tmpfs, корень отмонтируется, прошивается, монтируется, растариваются конфиги, профит.

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

Значит так: * initrd - это не наш путь. * nand не безразмерная. вторая копия rootfs не поместится. * в ram образ всей нанд не влезет. так что необходимо держать подмонтированным usb или sd носитель в процессе прошивки * в моем случае конфиги НЕ сохраняются. Одна из целей полной прошивки - сбросить ВСЕ и получить девайс с заводским конфигом. * rootfs в устройстве работает в режиме RW. Я знаю что RW - зло но на данный момент мы имеем то что имеем.

Как обновление мне представляется после прочтения комментариев:

1. убиваем все пользовательские программы и вообще убиваем все по максимуму

2. копируем в tmpfs минимально необходимый набор из rootfs

3. pivot_root в tmpf

Далее частично непонятно. Если в новой прошивке разбиение нанд на партиции совпадает с предыдущим - прошиваем с помощью ubiformat

А что делать если в новой прошивке разбиение нанд на партиции изменилось ???

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

в ram образ всей нанд не влезет

Её всю туда и не надо, только по минимуму: busybox, скрипты и прочие утилиты типа mtd вместе с либами, от которых они зависят.

убиваем все пользовательские программы и вообще убиваем все по максимуму

Это можно безопасно сделать через killall5, который не убьёт «случайно» процесс, вызвавший его.

Далее частично непонятно

Делаем ‘exec /bin/sh $0’ на всякий случай (в комментариях к OpenWrt упоминаются некие кэши; я думаю, это может быть кэш команд, оставшихся в старом корне); отмонтируем старую корневую ФС оттуда, куда она переместилась (новый / — уже tmpfs, а старый / — подкаталог в tmpfs); после этого можно безопасно прошивать любым способом, независимо от того, изменились ли разделы, потому что всё уже отмонтировано, а смонтированы только tmpfs. После этого — reboot.

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

Немного дополню gentoo_root по поводу:

«Далее частично непонятно. Если в новой прошивке разбиение нанд на партиции совпадает с предыдущим - прошиваем с помощью ubiformat»

В моем случае схема разбиения разделов долго прорабатывалась, чтобы не было нужды ее менять в последующем. :)
Переход со старой схемы разбиения разделов на новый осуществлялся подготовкой специальной промежуточной прошивки, которая сначала меняла схему разбиения разделов, а затем уже обновляла прошивку на новую схему. Весь этот процесс требовал несколько перезагрузок устройства, но в итоге это работало, хотя поизвращаться пришлось :)

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

Значит так: * nand не безразмерная. вторая копия rootfs не поместится.

Вы сами себе создаёте гемор. Теперь представьте, что происходит, когда во время апдэйта выдернут вилку из розетки, или отвалится ваша программа. Хотите сказать: «такого не случится». Ну-ну :)

Возьмите NAND побольше. Их щас на рынке пруд пруди и цены доступные. Я делал так, как описывает товарищ выше: у меня в МТД предусмотрены 2 одинаковые партиции под кернел и 2 одинаковые под rootfs. Переписал неактивные партиции, подменил U-boot переменные черет fw_setenv утилитку того же U-boot. и все дела. никакого велосипеда :)

Как обновление мне представляется после прочтения комментариев:

Ох пля :)

velikS
()

Источником новой прошивки флэш является usb-флэшка или sd карта которую пользователь воткнет в устройство.

А че за процессор? У меня AT91SAM9G45. Этот зверь умеет бутиться с SD карточки :) Соответственно я забил на прошивку через SAM-BA и сделал, так сказать, Live-SD :) На этой карточке бутлоадер, кернел + промитивная rootfs как initramfs, нормальная rootfs как squash файл, zip архив с бин файлами для апдэйта. Все стартует с СД и предлагает апдэйт.

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

Теперь представьте, что происходит, когда во время апдэйта выдернут вилку из розетки, или отвалится ваша программа. Хотите сказать: «такого не случится». Ну-ну :)

На это случай у меня в кустах спрятан рояль. Чип умеет грузиться по usb. Если при прошивке программа отвалится юзер сможет прошить устройство по usb. Пользоваться этим как штатной процедурой обновления неудобно потому что для запуска usb загрузчика необходимо открыть корпус и на процессорной плате переключить дип-свич в положение «recovery».

Штатная процедура обновления прошивки для пользователя должна выглядеть так: скачивает из инета свежую прошивку, копирует ее на флэшку, флэшку втыкает в устройство. Прошивка у меня это архив содержащий файлы:

layout.cfg - разбиение nand на партиции

loader.bin - загрузчик

zImage.bin - и так понятно

rootfs.ubi - --//--

application.ubi - приложения и данные

Agent_Smith
() автор топика

Как подступиться к данной задаче ?

Если во время загрузки железки она находит определённую USB флешку, то грузится с неё. Так можно обновить и ядро и rootfs.

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

Извините, я не представляю как это сделать без initrd. initrd у меня нет и не будет ибо нафиг не нужно - при сборке ядра в дефолтных параметрах забит раздел mtd где лежит рутфс.

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

Ещё в OpenWrt как-то реализована перепрошивка из работающей системы без initrd, но я не разбирался. Посмотрел: там сначала конфиги тарятся и засовываются в tmpfs, потом делается pivot_root в tmpfs, корень отмонтируется, прошивается, монтируется, растариваются конфиги, профит.

gentoo_root, полкиньте плз ссылку чтобы посмотреть как в openwrt реализовано обновление рутфс. Я с openwrt дела не имел.

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

gentoo_root, полкиньте плз ссылку чтобы посмотреть как в openwrt реализовано обновление рутфс. Я с openwrt дела не имел.

Официальный сайт http://openwrt.org/. Там есть wiki, в ней что-то может быть описано. Вот некоторые скрипты, связанные с прошивкой, вынутые из моей установки (слеплены вместе):

http://pastebin.com/hNrhfYu5

Для обновления прошивки запускается /sbin/sysupgrade, который использует остальные файлы. Кажется, там достаточно, чтобы понять, как это реализовано, но если вам ещё нужны какие-то другие файлы, могу их также залить. Описания этого всего в Интернете я не встречал; скрипты достаточно понятные.

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

initrd тут ни при чём. Любое обновление на лету - игра в рулетку. Без возможности загрузки с USB флешки в BIOS это рано или воздно плохо закончится. Если есть возможность грузить железку с USB флешки (без всяких перемычек) а не с платы, то ты всегда можешь безопасно её обновить.

alex_custov ★★★★★
()

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

эти платы в нанд шьются именно так: http://www.friendlyarm.net/products/mini6410

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