LINUX.ORG.RU

как правильно зашить ubi имидж?

 , , , ,


0

1

Всем привет.

Есть таска сделать апгрейд на борде с NAND'ом в 256 метров. Идея следующая: я отрезал кусок от основного rootfs в 64Mb для rescue имиджа

root@varsomam33:~# cat /proc/mtd 
dev:    size   erasesize  name
mtd0: 00020000 00020000 "NAND.SPL"
mtd1: 00020000 00020000 "NAND.SPL.backup1"
mtd2: 00020000 00020000 "NAND.SPL.backup2"
mtd3: 00020000 00020000 "NAND.SPL.backup3"
mtd4: 00040000 00020000 "NAND.u-boot-spl-os"
mtd5: 00100000 00020000 "NAND.u-boot"
mtd6: 00020000 00020000 "NAND.u-boot-env"
mtd7: 00020000 00020000 "NAND.u-boot-env.backup1"
mtd8: 00800000 00020000 "NAND.kernel"
mtd9: 04000000 00020000 "NAND.rescue-rootfs"
mtd10: 0b600000 00020000 "NAND.main-rootfs"
Дальше гружусь с NAND.main-rootfs и запускаю скрипт:
#!/bin/sh                                                                                                                                                                                                             
/etc/init.d/weston stop  
/etc/init.d/lighttpd stop
/etc/init.d/mysqld stop    
/etc/init.d/udev-cache stop
/etc/init.d/udev stop
/etc/init.d/syslog.busybox stop
/etc/init.d/syslog stop
                                    
ubiattach /dev/ubi_ctrl -m 9 -O 2048
mount -t ubifs ubi1:rootfs /media
mount -o noatime,move /proc /media/proc
                                 
pivot_root /media /media/old-root
pushd /
mount -o noatime,move /old-root/sys /sys
mount -o noatime,move /old-root/dev /dev
mount -o noatime,move /old-root/run /run                  
mount -o noatime,move /old-root/var/volatile /var/volatile
                                                                     
exec chroot / sh -c 'exec /sbin/init U </dev/ttyS0 > /dev/ttyS0 2>&1'
Проблема заключается в том, что дальше мне нужно сделать:
umount /old-root
ubidetach /dev/ubi_ctrl -m 10
flash_erase /dev/mtd10
ubiformat /dev/mtd10 -f <NEW_IMAGE.ubi> -s 2048 -O 2048
reboot
но lsof после chroot'a показывает следующее:
root@varsomam33:~# lsof 
1       /sbin/init.sysvinit     /dev/initctl
698     /old-root/bin/busybox.nosuid    /dev/null
698     /old-root/bin/busybox.nosuid    /dev/null
698     /old-root/bin/busybox.nosuid    /dev/null
698     /old-root/bin/busybox.nosuid    pipe:[2970]
698     /old-root/bin/busybox.nosuid    pipe:[2970]
716     /old-root/bin/busybox.nosuid    /dev/null
716     /old-root/bin/busybox.nosuid    /dev/null
716     /old-root/bin/busybox.nosuid    /dev/null
716     /old-root/bin/busybox.nosuid    socket:[3202]
1047    /old-root/bin/login.shadow      /dev/ttyS0
1047    /old-root/bin/login.shadow      /dev/ttyS0
1047    /old-root/bin/login.shadow      /dev/ttyS0
1047    /old-root/bin/login.shadow      socket:[3590]
1057    /old-root/bin/bash      /dev/ttyS0
1057    /old-root/bin/bash      /dev/ttyS0
1057    /old-root/bin/bash      /dev/ttyS0
1057    /old-root/bin/bash      /dev/ttyS0
т.е. пока я не убью все процессы из old-root, отмонтировать я его не смогу. А если убить эти процессы, то как дальше сделать прошивку имиджа?


Ответ на: комментарий от SZT

Я в курсе, но это требует дополнительной перезагрузки

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

В initramfs надо такие вещи делать

Какая разница? pivot_root - для initrd, switch_root - для initramfs. Я использую pivot_root, только rootfs у меня находится на нанде.

В любом случае, есть что сказать по делу?

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

В initramfs надо такие вещи делать

Какая разница?

Разница в том, что при запуске из initramfs процессы не занимают флеш.

В любом случае, есть что сказать по делу?

Если у тебя есть целый раздел в 64 метра под recscue image, запиши туда систему, которой не нужен NAND.main-rootfs, и выполни обновление из нее. Если у тебя, конечно, нет жесткого требования обновления без перезагрузки (тем более, что остановка и перезапуск всего юзерспейса - это фактически перезагрузка).

Ну а если действительно надо без перезагрузки - сделай себе специальный runlevel - init у тебя old-root не занимает, так что должно сработать.

P.S. Грубить тем, кто пытается тебе помочь - не лучшая идея.

tailgunner ★★★★★ ()

думаю, нужно скрипт обновления в фоне запускать, а не руками из консоли, отлаживать в лог на какой-нибудь nfs

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

Если у тебя есть целый раздел в 64 метра под recscue image, запиши туда систему, которой не нужен NAND.main-rootfs, и выполни обновление из нее. Если у тебя, конечно, нет жесткого требования обновления без перезагрузки (тем более, что остановка и перезапуск всего юзерспейса - это фактически перезагрузка).

Так rescue-rootfs и не нужен main-rootfs, просто хотелось на лету прыгнуть на rescue из main и зашить main-rootfs. Жёстких требований нет... их вообще нет, просто сказали сделать процедуру апгрейда ☺ Мне самому хотелось избежать лишней перезагрузки и ещё одного init скрипта в rescue, который бы мониторил файл имиджа и если он есть, шил бы main.

P.S. Грубить тем, кто пытается тебе помочь - не лучшая идея

Прошу прощения, но грубиянством я не занимаюсь. Просто хочется дискутировать в рамках темы. Если показался резким/грубым/хамоватым, прошу прощения.

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