序言
在研究cv1800编译的时候,发现官方sdk在打包sd镜像的时候竟然用了挂载loop设备然后分区的操作,这样做非常的不优雅,尤其是在docker环境下,因为docker在不提权的情况下没办法直接操作loop设备,而提权后会有很多隐式安全问题,非常的不推荐!!!
如果不想听具体解决方案,可以直接看git diff的修改细节。
解决方案
使用genimage代替旧方案实现镜像打包,这样不仅不需要去访问loop设备,而且使用更方便配置镜像的cfg文件。
-
编译安装genimage
git clone https://github.com/pengutronix/genimage cd genimage && \ ./autogen.sh && \ ./configure && \ make -j$(nproc) && \ make install
-
创建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
-
修改构建脚本
# 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