最近在将appfs的ubi文件系统更新挂载在nandflash的mtd4分区,琢磨的出来的指令如下
#关闭所有由用户启动的进程,killall后面的是用户启动的脚本
killall udhcpc sntp logd gpio_control siphone lighttpd
#等待进程彻底释放资源
sleep 10
#卸载ubi1:appfs设备和/mnt/apps的关联
umount -t ubifs ubi1:appfs /mnt/apps
#删除dev/ubi1_0的ubi文件卷
ubirmvol /dev/ubi1 -n 1
#解除mtd4和ubi文件系统的附着
ubidetach -p /dev/mtd4
#擦除/dev/mtd4的分区里面的所有内容
flasheraseall /dev/mtd4
#将升级镜像写入到/dev/mtd4
flashcp -v /tmp/ubi_appfs.img /dev/mtd4
#将mtd4和ubi文件系统附着
ubiattach -p /dev/mtd4
#建立ubi1:appf文件卷
ubimkvol /dev/ubi1 -N appfs -m
#挂载ubi1:appfs文件卷
mount -t ubifs ubi1:appfs /mnt/apps
#重启
reboot
烧写镜像之前一定要detach设备 ,不然的话attach的时候ubi驱动检测到文件内容和原来不同,会出现如下错误
因为上面那部分指令有个问题,在嵌入式软件上执行的时候卸载指令的时候会出现下面这种情况
umount: can't unmount /mnt/apps: Device or resource busy
所以我加了sleep 10 等待10s再执行,但是只能减少卸载失败的概率。睡眠时间越长卸载失败的概率越低。但是还是不能杜绝这种现象发生。
挂载失败也导致了 ubidetach -p /dev/mtd4 失败
ubidetach的失败也导致了ubiattach 的失败,参考第二张图。
要想完全杜绝这种现象需要重启,重启之后没有该设备的挂载的信息,这样就可以避免卸载失败的现象
#首先重启,系统会detach虽有的设备
reboot
#下面这部分代码需要发到启动脚本里面
#擦除/dev/mtd4的分区里面的所有内容
flasheraseall /dev/mtd4
将升级镜像写入到/dev/mtd4
flashcp -v ubi_appfs.img /dev/mtd4
#将mtd4和ubi文件系统附着
ubiattach -p /dev/mtd4
#建立ubi1:appf文件卷
ubimkvol /dev/ubi1 -N appfs -m
#挂载ubi1:appfs文件卷
mount -t ubifs ubi1:appfs /mnt/apps
上面的指令只能作为参考,读者在应用启动脚本的烧写指令时候需要某些逻辑调整。