OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4515|回复: 0

IMX6ULL eMMC板添加 "A/B(无缝)系统"之一:分区表修改

[复制链接]

5

主题

120

帖子

0

精华

高级会员

Rank: 4

积分
813
金钱
813
注册时间
2021-2-26
在线时间
117 小时
发表于 2021-3-6 17:07:04 | 显示全部楼层 |阅读模式
前面我们做了一些准备工作,详细请参见如下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区域,那就要自己手动划分了。
经过考量,划分出如下的分区表:

partition_modified_orig.jpg

那我们就开始修改mksdcard.sh,想当然的,我们会修改成如下,但是殊不知,你已经进坑了。

  1. #!/bin/sh

  2. # partition size in MB
  3. BOOT_ROM_SIZE=10

  4. # wait for the SD/MMC device node ready
  5. while [ ! -e $1 ]
  6. do
  7. sleep 1
  8. echo “wait for $1 appear”
  9. done

  10. # call sfdisk to create partition table
  11. # destroy the partition table
  12. node=$1
  13. dd if=/dev/zero of=${node} bs=1024 count=1

  14. sfdisk --force ${node} << EOF
  15. ${BOOT_ROM_SIZE}M,128M,c
  16. 138M,128M,c
  17. 266M,1024M,83
  18. 1290M,1024M,83
  19. 2314M,,83
  20. write
  21. EOF
复制代码


将修改好的sh脚本打包成tar文件,替换原mfgtool里的文件,usb boot进行烧录,此时你会发现,似乎哪里不对劲,仔细查看烧录的console log,你会发现,他只给你分了4个区,最后一个userdata分区并没有划分出来。同时emmc还剩余5G多未使用空间。
关键的console log如下:

  1. [20210304_14:23:38] Disk /dev/mmcblk1: 7.3 GiB, 781818 mmcblk1: p1 p2 p3 p4
  2. [20210304_14:23:38] 2656 bytes, 15269888 sectors
  3. [20210304_14:23:38] Units: sectors of 1 * 512 = 512 bytes
  4. [20210304_14:23:38] Sector size (logical/physical): 512 bytes / 512 bytes
  5. [20210304_14:23:38] I/O size (minimum/optimal): 512 bytes / 512 bytes
  6. [20210304_14:23:38]
  7. [20210304_14:23:38] >>> Created a new DOS disklabel with disk identifier 0xb41b170e.
  8. [20210304_14:23:38] Created a new partition 1 of type 'W95 FAT32 (LBA)' and of size 128 MiB.
  9. [20210304_14:23:38] /dev/mmcblk1p2: Created a new partition 2 of type 'W95 FAT32 (LBA)' and of size 128 MiB.
  10. [20210304_14:23:38] /dev/mmcblk1p3: Created a new partition 3 of type 'Linux' and of size 1 GiB.
  11. [20210304_14:23:38] /dev/mmcblk1p4: Created a new partition 4 of type 'Linux' and of size 1 GiB.
  12. [20210304_14:23:38] All partitions used.
  13. [20210304_14:23:38]
  14. [20210304_14:23:38] New situation:
  15. [20210304_14:23:38]
  16. [20210304_14:23:38] Device         Boot   Start     End Sectors  Size Id Type
  17. [20210304_14:23:38] /dev/mmcblk1p1        20480  282623  262144  128M  c W95 FAT32 (LBA)
  18. [20210304_14:23:38] /dev/mmcblk1p2       282624  544767  262144  128M  c W95 FAT32 (LBA)
  19. [20210304_14:23:38] /dev/mmcblk1p3       544768 2641919 2097152    1G 83 Linux
  20. [20210304_14:23:38] /dev/mmcblk1p4      2641920 4739071 2097152    1G 83 Linux
  21. [20210304_14:23:38]
  22. [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,所以分区表就更新成下面这样:
partition_modified.jpg
明确了分区,我们就来修改mksdcard.sh,修改如下:

  1. #!/bin/sh

  2. # partition size in MB
  3. BOOT_ROM_SIZE=10

  4. # wait for the SD/MMC device node ready
  5. while [ ! -e $1 ]
  6. do
  7. sleep 1
  8. echo “wait for $1 appear”
  9. done

  10. # call sfdisk to create partition table
  11. # destroy the partition table
  12. node=$1
  13. dd if=/dev/zero of=${node} bs=1024 count=1

  14. sfdisk --force ${node} << EOF
  15. ${BOOT_ROM_SIZE}M,128M,c
  16. 138M,128M,c
  17. 266M,,E                        # 从266M开始,一直到emmc可用空间结束,都划分为扩展分区
  18. 267M,1024M,83             # 在扩展分区里,划分第一个1G的rootfs_a分区,这里跳了1M,主要是防止出现越界
  19. 1292M,1024M,83           # 在rootfs_a后面,划分第二个1G的rootfs_b分区,这里同样跳了1M
  20. 2317M,,83                    # 在rootfs_b后面,将剩余所有的空间都划分给userdata分区。同样跳了1M
  21. write
  22. EOF
复制代码
打包,烧录,查看烧录时候的分区log,一切正常。

  1. [20210305_15:00:30] Disk /dev/mmcblk1: 7.3 GiB, 7818182656 bytes, 15269888 sectors
  2. [20210305_15:00:30] mmcblk1: p1 p2 p3 < p5 p6 p7 >
  3. [20210305_15:00:30] 0mUnits: sectors of 1 * 512 = 512 bytes
  4. [20210305_15:00:31] Sector size (logical/physical): 512 bytes / 512 bytes
  5. [20210305_15:00:31] I/O size (minimum/optimal): 512 bytes / 512 bytes
  6. [20210305_15:00:31]
  7. [20210305_15:00:31] >>> Created a new DOS disklabel with disk identifier 0x0db1e842.
  8. [20210305_15:00:31] Created a new partition 1 of type 'W95 FAT32 (LBA)' and of size 128 MiB.
  9. [20210305_15:00:31] /dev/mmcblk1p2: Created a new partition 2 of type 'W95 FAT32 (LBA)' and of size 128 MiB.
  10. [20210305_15:00:31] /dev/mmcblk1p3: Created a new partition 3 of type 'Extended' and of size 7 GiB.
  11. [20210305_15:00:31] /dev/mmcblk1p4: Created a new partition 5 of type 'Linux' and of size 1 GiB.
  12. [20210305_15:00:31] /dev/mmcblk1p6: Created a new partition 6 of type 'Linux' and of size 1 GiB.
  13. [20210305_15:00:31] /dev/mmcblk1p7: Created a new partition 7 of type 'Linux' and of size 5 GiB.
  14. [20210305_15:00:31] /dev/mmcblk1p8:
  15. [20210305_15:00:31] New situation:
  16. [20210305_15:00:31]
  17. [20210305_15:00:31] Device         Boot   Start      End  Sectors  Size Id Type
  18. [20210305_15:00:31] /dev/mmcblk1p1        20480   282623   262144  128M  c W95 FAT32 (LBA)
  19. [20210305_15:00:31] /dev/mmcblk1p2       282624   544767   262144  128M  c W95 FAT32 (LBA)
  20. [20210305_15:00:31] /dev/mmcblk1p3       544768 15269887 14725120    7G  5 Extended
  21. [20210305_15:00:31] /dev/mmcblk1p5       546816  2643967  2097152    1G 83 Linux
  22. [20210305_15:00:31] /dev/mmcblk1p6      2646016  4743167  2097152    1G 83 Linux
  23. [20210305_15:00:31] /dev/mmcblk1p7      4745216 15269887 10524672    5G 83 Linux
  24. [20210305_15:00:31]
  25. [20210305_15:00:31] The partition table has been altered.
复制代码

至此,分区表修改结束,下一步就是烧录image文件到对应的分区,以及切换a/b启动。敬请期待。










正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 21:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表