记录一下如何直接修改zynq petalinux编译出来的rootfs.cpio.gz文件内容

        xilinx zynq petalinux 默认编译打包出的SPI flash烧写启动文件是BOOT.BIN,然而每次需要修改rootfs内的文件时都要重新build rootfs 然后再 package一次才能生成新的BOOT.bin文件,地球人都知道petalinux编译一次是很耗时间的,那么有没有什么简单的办法能修改rootfs呢?

为了达到这么个目的,我花点时间研究了一下petalinux编译打包过程,执行build命令后最终会生成linux内核,rootfs,dtb,u-boot,fsbl,fpga.bit这些最终文件,然后package时将这些文件一起打包成BOOT.bin才可以烧写spi flash,其中kernel,rootfs,dtb会被预先打包成image.ub文件才会参与到package过程,如果要修改rootfs,可以把image.ub文件解包,出rootfs,修改其中的内容,再重新打包成新的rootfs,就可以了,下面过程是经过多次尝试后总结出的步骤,以供参考

首先需要准备 image.ub文件,这个文件在编译完成后自动生成,petalinux2019.2中这个文件在xxxx/images/linux目录下,使用dumpimage命令拆包,如下面的样子,可以解出kernel,设备树文件和rootfs

dumpimage -i image.ub -T flat_dt  -p 0 kernel.bin
dumpimage -i image.ub -T flat_dt  -p 1 devicetree.dtb
dumpimage -i image.ub -T flat_dt  -p 2 rootfs.cpio.gz

第二步,对rootfs解压出原始文件

mkdir ramdisk_unzip
gunzip -c rootfs.cpio.gz | sh -c 'cd ramdisk_unzip/ && cpio -i'

经过上面两步骤后就可以在ramdisk_unzip文件夹下看到原始的rootfs目录结构,这个时候就可以对rootfs随意修改了

第三部,修改完成后重新对rootfs再打包成rootfs.cpio.gz,使用如下命令进行打包

sh -c 'cd ramdisk_unzip/ && find . | cpio -H newc -o' | gzip -9 > repack_ramdisk.cpio.gz

第4步,重新生成一个新的image.ub文件,使用mkimage命令,如下

mkimage -f package_image_ub.its repack_image.ub

其中的package_image_ub.its是告诉mkimage打包需要的参数,这个文件在petalinux编译路径下有模板,我这里复制出petalinux的模板,修改了一下,主要是几个文件路径,改成自己的文件

/dts-v1/;

/ {
        description = "U-Boot fitImage for PetaLinux/4.19-xilinx-v2019.2+git999/plnx-zynq7";
        #address-cells = <1>;

        images {
                kernel@1 {
                        description = "Linux kernel";
                        data = /incbin/("刚才第一步解压出来的kernel.bin文件路径");
                        type = "kernel";
                        arch = "arm";
                        os = "linux";
                        compression = "none";
                        load = <0x8000>;
                        entry = <0x8000>;
                        hash@1 {
                                algo = "sha1";
                        };
                };
                [email protected] {
                        description = "Flattened Device Tree blob";
                        data = /incbin/("刚才第一步解压出来的devicetree.dtb文件路径");
                        type = "flat_dt";
                        arch = "arm";
                        compression = "none";
                        
                        hash@1 {
                                algo = "sha1";
                        };
                };
                ramdisk@1 {
                        description = "petalinux-user-image";
                        data = /incbin/("重新打包生成的repack_ramdisk.cpio.gz文件路径");
                        type = "ramdisk";
                        arch = "arm";
                        os = "linux";
                        compression = "gzip";
                        
                        
                        hash@1 {
                                algo = "sha1";
                        };
                };
	};

        configurations {
                default = "[email protected]";
                [email protected] {
			description = "1 Linux kernel, FDT blob, ramdisk";
			kernel = "kernel@1";
			fdt = "[email protected]";
			ramdisk = "ramdisk@1";
			
                        hash@1 {
                                algo = "sha1";
                        };
                };
	};
};

第5步,使用原本petalinux自带的package命令重新打包生成BOOT.BIN

petalinux-package --boot --fsbl ./fsbl.elf --fpga --u-boot ./u-boot.elf --kernel ./repack_image.ub -o ./BOOT.BIN --force

其中的fsbl,u-boot都是原先build后自动生成的,在xxxx/images/linux路径下就有,经过上面的步骤后就重新生成了烧写文件,理论上烧写到spiflsh就可以正常启动了

简单几步就完成了rootfs的重新修改和配置,想添加删除什么文件比原先的build命令方便多了

你可能感兴趣的:(zynq,嵌入式,fpga开发,zynq,linux,petalinux,rootfs.cpio.gz)