双分区dual image之实现自动切换分区的功能!

版权声明:转载请声明~ https://blog.csdn.net/weixin_38890593/article/details/88548343

我现在用的板子是高通的,flash是nornand的,有两个分区,分别为rootfs和rootfs_1
板子切换分区的功能是由环境变量priority_root=rootfs来控制的
通过fw_printenv来查看环境变量,如下:

root@:/# fw_printenv 
flash_type=0
hw_mac_addr=00:A0:11:22:33:44
.......省略
netmask=255.255.255.0
stderr=serial
stdin=serial
stdout=serial
priority_root=rootfs

当priority_root=rootfs_1时,再重启,板子就会从rootfs_1这个分区启动进入。

那么现在有个问题:这两个分区中有一个损坏了,如何自动切换到另外一个好的分区呢?
例如现在我的分区是rootfs,但是这个rootfs分区损坏了,进不去文件系统了,怎么切换到rootfs_1分区?

(注意,进不去文件系统证明系统已经无法正常工作!,如果你的板子只有一个分区且分区又损坏了,那么可以换另外一块板子了。
因为一般分区损坏便是flash出问题,硬件出问题的机会更大,如果软件有问题,那么这版软件是不允许发布的!所以能发布的软件必须是OK的!)

那么针对上面提出的问题,提供两种解决方法!
一种是通过检查分区的CRC值来检验,二是初始化出两个分区信息

先看下效果图:

在这里插入图片描述
怕图片不清晰,附上信息

flash_type: 0
Hit any key to stop autoboot:  0 
=========support upload error code off============
Support Dual Image
Start to check crc...
current is rootfs.now get rootfs_crc     #可以看到现在的分区是rootfs

NAND read: device 1 offset 0x0, size 0x14c0000
 21757952 bytes read: OK
env_crc:[123456]		#这个env_crc的值是之前就获取出来保存好的,但这里我为了测试这个机制,便直接修改此值,让这个机制生效!
CRC for 84000000 ... 854bffff ==> ded0e7c7	#这个值ded0e7c7,是对当前的整个分区做crc校验的返回值,此值每次重启系统都会重新检验一次分区
#接下来的工作就是检查两个值是否一致,不一致那么证明系统挂掉了,于是切换分区
Check crc fail!try to switch to another image...
switch rootfs_1
check crc done
#至此,已经切换分区了,下面开始跑另外一个分区rootfs_1
priority_root=[rootfs_1]
prepare_start_rootfs_1
Check partition 2 image kernel&rootfs
Check partition 2 image kernel
check kernel cmd: nand device 1 && set mtdids nand1=nand1 && set mtdparts mtdparts=nand1:0x3f00000@0x4000000(fs),${msmparts} && ubi part fs && ubi read 0x84000000 kernel &&
Creating 1 MTD partitions on "nand1":

上面图片简单解释:文件系统损坏时,那么里面的东西就发生变化了,所以对文件系统再次做crc的检验时,得到的crc值和正常时是绝对不会一样的!
第一种方法便是根据crc校验值来判断系统是否损坏!
下面附上系统正常时的情况:
在这里插入图片描述

可以看到,正常时两个值都是ded0e7c7!
CRC值检验成功,那么便不会做任何事情,正常跑原来的rootfs_1分区!

说下需要用到的工具:

1、nanddump命令,#此命令用来讲所要校验的分区导出到文件
2、crcsum命令		#此命令用来校验分区信息

说下大概思路:
1、在系统升级的时候,将升级的分区信息用nanddump命令导出到文件里面,然后使用crcsum命令对导出的镜像文件做一个crc的校验,校验值保存进环境变量里面。
2、然后在重启系统的时候,在底层就做crc的校验,成功则运行,失败则切换到另外一个分区启动!

时间原因,无法一次性更完=_=,持续更新!

猜你喜欢

转载自blog.csdn.net/weixin_38890593/article/details/88548343