高级会员
- 积分
- 813
- 金钱
- 813
- 注册时间
- 2021-2-26
- 在线时间
- 117 小时
|
前面我们做了一些准备工作,详细请参见如下2个帖子:
发一个IMX6ULL整合的工程,Mini板已经验证:http://www.openedv.com/forum.php?mod=viewthread&tid=323733
IMX6ULL eMMC启动流程以及分区表分析: http://www.openedv.com/forum.php?mod=viewthread&tid=323802
是时候开始做一些有意义的事情了,比如当前帖子所说的添加 "A/B(无缝)系统",这会是一系列的帖子,不能保证每周都能更,但是能保证不会鸽,心急的同学别催促哦。
起因:我们在开发阶段,可以使用nfs,mfgtool等很多方法进行固件更新,但是一旦你的产品出售到终端用户手上,还能使用这样的方式吗?
显然这是不可能的,必须要有一个OTA的方式,而且需要最大程度上能保证OTA后不会是你的产品变砖。
很幸运的是,Android给了我们提供了一个很好的思路,那就是A/B(无缝)系统OTA,这也是Android舍弃掉Recovery模式后的方案。
那么,什么是A/B(无缝)系统,详细请参见:https://source.android.com/devices/tech/ota/ab
简单的说,就是针对一些重要的分区,系统中对每个分区都设定了2分,分别属于a和b solt,比如:
solt a: uboot_a, kernel_a, dtb_a, rootfs_a
slot b: uboot_b, kernel_b, dtb_b, rootfs_b
系统启动的时候,会使用某一个slot的image进行启动,比如是用slot a就会使用uboot_a, kernel_a, dtb_a, rootfs_a启动。
当前是slot a启动的时候,但进行OTA系统更新时,此时并不会去更新solt a对应的分区,而是去更新solt b对应的分区,更新成功后,下次启动就使用solt b分区的image启动。如此循环。
那么我们就开始吧,首先要做的就是,修改分区表,修改成符合A/B模式的分区表结构。
如果你仔细看过IMX6ULL eMMC启动流程以及分区表分析帖子,就应该知道,分区时使用的是<mfgtool/Profiles/Linux/OS Firmware/mksdcard.sh.tar>中的mksdcard.sh进行操作的,那修改分区表,就是要修改这个脚本,这个脚本的分析在分析帖子中也详细讲过了,这里就不再讲解了。
想要修改分区表,那我们就要知道我们想要的分区表要长成什么样,参考如上描述,显然我们需要2个分区存uboot,2个分区存zImage + dtb,2个分区存rootfs,为了方便用户数据,我们还需要一个用户数据分区,这个分区没必要分a/b
uboot有之前的帖子我们已经知道,是存储在emmc的boot1区域,而emmc是有boot1和boot2区域的,那顺理成章的,boot1存uboot_a, boot2存uboot_b.
后面的分区都是存在emmc的UDA区域,那就要自己手动划分了。
经过考量,划分出如下的分区表:
那我们就开始修改mksdcard.sh,想当然的,我们会修改成如下,但是殊不知,你已经进坑了。
- #!/bin/sh
- # partition size in MB
- BOOT_ROM_SIZE=10
- # wait for the SD/MMC device node ready
- while [ ! -e $1 ]
- do
- sleep 1
- echo “wait for $1 appear”
- done
- # call sfdisk to create partition table
- # destroy the partition table
- node=$1
- dd if=/dev/zero of=${node} bs=1024 count=1
- sfdisk --force ${node} << EOF
- ${BOOT_ROM_SIZE}M,128M,c
- 138M,128M,c
- 266M,1024M,83
- 1290M,1024M,83
- 2314M,,83
- write
- EOF
复制代码
将修改好的sh脚本打包成tar文件,替换原mfgtool里的文件,usb boot进行烧录,此时你会发现,似乎哪里不对劲,仔细查看烧录的console log,你会发现,他只给你分了4个区,最后一个userdata分区并没有划分出来。同时emmc还剩余5G多未使用空间。
关键的console log如下:
- [20210304_14:23:38] Disk /dev/mmcblk1: 7.3 GiB, 781818 mmcblk1: p1 p2 p3 p4
- [20210304_14:23:38] 2656 bytes, 15269888 sectors
- [20210304_14:23:38] Units: sectors of 1 * 512 = 512 bytes
- [20210304_14:23:38] Sector size (logical/physical): 512 bytes / 512 bytes
- [20210304_14:23:38] I/O size (minimum/optimal): 512 bytes / 512 bytes
- [20210304_14:23:38]
- [20210304_14:23:38] >>> Created a new DOS disklabel with disk identifier 0xb41b170e.
- [20210304_14:23:38] Created a new partition 1 of type 'W95 FAT32 (LBA)' and of size 128 MiB.
- [20210304_14:23:38] /dev/mmcblk1p2: Created a new partition 2 of type 'W95 FAT32 (LBA)' and of size 128 MiB.
- [20210304_14:23:38] /dev/mmcblk1p3: Created a new partition 3 of type 'Linux' and of size 1 GiB.
- [20210304_14:23:38] /dev/mmcblk1p4: Created a new partition 4 of type 'Linux' and of size 1 GiB.
- [20210304_14:23:38] All partitions used.
- [20210304_14:23:38]
- [20210304_14:23:38] New situation:
- [20210304_14:23:38]
- [20210304_14:23:38] Device Boot Start End Sectors Size Id Type
- [20210304_14:23:38] /dev/mmcblk1p1 20480 282623 262144 128M c W95 FAT32 (LBA)
- [20210304_14:23:38] /dev/mmcblk1p2 282624 544767 262144 128M c W95 FAT32 (LBA)
- [20210304_14:23:38] /dev/mmcblk1p3 544768 2641919 2097152 1G 83 Linux
- [20210304_14:23:38] /dev/mmcblk1p4 2641920 4739071 2097152 1G 83 Linux
- [20210304_14:23:38]
- [20210304_14:23:38] The partition table has been altered.
复制代码
追究其原因,是应为我们在使用sfdisk对emmc进行分区的时候,默认使用的是mbr的分区表,很不幸的是,mbr只能支持到4个主分区,所以你会看到console上会打印出All partitions used的log。解决方案有2个,1是使用gpt分区表,这个方案我们以后再说。2是划一个扩展分区来,在扩展分区中,就随便你怎么划分了,我们这次就是用扩展分区来处理。
那么,把谁放到扩展分区里面去呢?很明显的是rootfs_a, rootfs_b, userdata,所以分区表就更新成下面这样:
明确了分区,我们就来修改mksdcard.sh,修改如下:
- #!/bin/sh
- # partition size in MB
- BOOT_ROM_SIZE=10
- # wait for the SD/MMC device node ready
- while [ ! -e $1 ]
- do
- sleep 1
- echo “wait for $1 appear”
- done
- # call sfdisk to create partition table
- # destroy the partition table
- node=$1
- dd if=/dev/zero of=${node} bs=1024 count=1
- sfdisk --force ${node} << EOF
- ${BOOT_ROM_SIZE}M,128M,c
- 138M,128M,c
- 266M,,E # 从266M开始,一直到emmc可用空间结束,都划分为扩展分区
- 267M,1024M,83 # 在扩展分区里,划分第一个1G的rootfs_a分区,这里跳了1M,主要是防止出现越界
- 1292M,1024M,83 # 在rootfs_a后面,划分第二个1G的rootfs_b分区,这里同样跳了1M
- 2317M,,83 # 在rootfs_b后面,将剩余所有的空间都划分给userdata分区。同样跳了1M
- write
- EOF
复制代码 打包,烧录,查看烧录时候的分区log,一切正常。
- [20210305_15:00:30] Disk /dev/mmcblk1: 7.3 GiB, 7818182656 bytes, 15269888 sectors
- [20210305_15:00:30] mmcblk1: p1 p2 p3 < p5 p6 p7 >
- [20210305_15:00:30] 0mUnits: sectors of 1 * 512 = 512 bytes
- [20210305_15:00:31] Sector size (logical/physical): 512 bytes / 512 bytes
- [20210305_15:00:31] I/O size (minimum/optimal): 512 bytes / 512 bytes
- [20210305_15:00:31]
- [20210305_15:00:31] >>> Created a new DOS disklabel with disk identifier 0x0db1e842.
- [20210305_15:00:31] Created a new partition 1 of type 'W95 FAT32 (LBA)' and of size 128 MiB.
- [20210305_15:00:31] /dev/mmcblk1p2: Created a new partition 2 of type 'W95 FAT32 (LBA)' and of size 128 MiB.
- [20210305_15:00:31] /dev/mmcblk1p3: Created a new partition 3 of type 'Extended' and of size 7 GiB.
- [20210305_15:00:31] /dev/mmcblk1p4: Created a new partition 5 of type 'Linux' and of size 1 GiB.
- [20210305_15:00:31] /dev/mmcblk1p6: Created a new partition 6 of type 'Linux' and of size 1 GiB.
- [20210305_15:00:31] /dev/mmcblk1p7: Created a new partition 7 of type 'Linux' and of size 5 GiB.
- [20210305_15:00:31] /dev/mmcblk1p8:
- [20210305_15:00:31] New situation:
- [20210305_15:00:31]
- [20210305_15:00:31] Device Boot Start End Sectors Size Id Type
- [20210305_15:00:31] /dev/mmcblk1p1 20480 282623 262144 128M c W95 FAT32 (LBA)
- [20210305_15:00:31] /dev/mmcblk1p2 282624 544767 262144 128M c W95 FAT32 (LBA)
- [20210305_15:00:31] /dev/mmcblk1p3 544768 15269887 14725120 7G 5 Extended
- [20210305_15:00:31] /dev/mmcblk1p5 546816 2643967 2097152 1G 83 Linux
- [20210305_15:00:31] /dev/mmcblk1p6 2646016 4743167 2097152 1G 83 Linux
- [20210305_15:00:31] /dev/mmcblk1p7 4745216 15269887 10524672 5G 83 Linux
- [20210305_15:00:31]
- [20210305_15:00:31] The partition table has been altered.
复制代码
至此,分区表修改结束,下一步就是烧录image文件到对应的分区,以及切换a/b启动。敬请期待。
|
|