UBI 文件appfs文件系统升级的实现过程

 最近在将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

上面的指令只能作为参考,读者在应用启动脚本的烧写指令时候需要某些逻辑调整。

   

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值