使用genimage更优雅的打包镜像

序言

在研究cv1800编译的时候,发现官方sdk在打包sd镜像的时候竟然用了挂载loop设备然后分区的操作,这样做非常的不优雅,尤其是在docker环境下,因为docker在不提权的情况下没办法直接操作loop设备,而提权后会有很多隐式安全问题,非常的不推荐!!!

如果不想听具体解决方案,可以直接看git diff的修改细节。

解决方案

使用genimage代替旧方案实现镜像打包,这样不仅不需要去访问loop设备,而且使用更方便配置镜像的cfg文件。

  1. 编译安装genimage

    git clone https://github.com/pengutronix/genimage
    cd genimage && \
        ./autogen.sh && \
        ./configure && \
        make -j$(nproc) && \
        make install
    
  2. 创建genimage.cfg

    image boot.vfat {
        vfat {
            label = "boot"
            files = {
                "fip.bin",
                "rawimages/boot.sd"
            }
        }
        size = 128M
    }
    
    image rootfs.ext4 {
        ext4 {
            label = "rootfs"
        }
        size = 256M
        mountpoint = "/"
    }
    
    image sdcard.img {
        hdimage {}
    
        partition boot {
            partition-type = 0x0C
            bootable = "true"
            image = "boot.vfat"
        }
    
        partition rootfs {
            partition-type = 0x83
            image = "rootfs.ext4"
        }
    }
    

    此文件保存到 build/boards/cv180x/cv1800b_sophpi_duo_sd/genimage.cfg

    1. 修改构建脚本

      # build/Makefile
      # 596行后面加上
      ${Q}cp $(BUILD_PATH)/boards/${CHIP_ARCH_L}/${PROJECT_FULLNAME}/genimage.cfg $(OUTPUT_DIR)/
      
      # build/tools/common/sd_tools/sd_gen_burn_image.sh
      # 直接替换下面内容
      
      #!/bin/bash
      # a sd image generator for sophpi
      # usage
      if [ "$#" -ne "1" ]
      then
      	echo "usage: sudo ./sd_gen_burn_image.sh OUTPUT_DIR"
      	echo ""
      	echo "       The script is used to create a sdcard image with two partitions, "
      	echo "       one is fat32 with 128MB, the other is ext4 with 256MB."
      	echo "       You can modify the capacities in this script as you wish!"
      	echo ""
      	echo "Note:  Please backup you sdcard files before using this image!"
      
      	exit
      fi
      
      output_dir=$1
      echo ${output_dir}
      pushd ${output_dir}
      
      image=${PROJECT_FULLNAME}-`date +%Y%m%d-%H%M`-sdcard.zip
      
      genimage --config genimage.cfg --rootpath fs/ --tmppath `mktemp -d`  --inputpath $PWD --outputpath $PWD
      
      zip ${image} sdcard.img
      
      echo "Gen image successful: ${image}"
      echo ""
      
      popd
      

​ PS: 这里还改了镜像压缩方式,因为原厂的tar.gz压缩在etcher里不能直接识别。

写在最后

已经修改好的仓库:GitHub - dreamcmi/cvi_mmf_sdk

配套的docker镜像:Docker

可以自己构建的dockerfile: GitHub - dreamcmi/cv1800-docker: The docker compilation environment of cv1800 series soc

非常推荐各位直接使用我发布好的docker镜像进行构建,自己搭环境经常会遇到一些奇奇怪怪的问题,该docker镜像已经解决了大部分依赖问题,并且修改了优雅的镜像打包方式,后续会积极收集用户问题并进行迭代bugfix。

Summary

This text will be hidden

1 Like

非常好,我们都要追求优雅,我建议官方直接集成你的 docker 镜像。

感谢你的付出,这真的对Duo帮助很大。 :+1:

我们会在后续的资料支持中考虑集成你的贡献。

请把你的收件地址及论坛身份证明信息(可以是登陆后的截图)发送至邮箱:hoka@milkv.io

我会送你一个小礼品。可能会是未发售的SBC产品