开发环境

  • ubuntu16.04
  • petalinux 2018.2(ubuntu16.04)
  • vivado 2018.2(windows11)
  • ZYNQ型号:ZYNQ 7020

应用背景

  • petalinux制作的文件系统为INITRAMFS类型的linux系统镜像在使用过程中存在一个问题,即上电后在文件系统中的任何更改,如创建文件,修改文件等,在重启之后全部还原。因为文件系统是运行在RAM中的,重新上电后,会从Flash重新解压到内存中。在内存中的操作无法应用到Flash中,因此导致前述现象。

  • 若要实现有效的文件系统改动,有三种解决方案:

    1. 实现JFFS2文件系统,具体实现过程请参考:使用petalinux制作JFFS2文件系统
    2. 修改petalinux编译的initramfs文件系统,将自己需要的文件编码到内核镜像中
    3. 修改petalinux编译的initramfs文件系统,在有emmc的情况下,开机自动挂载emmc,后续在emmc中修改自己的文件。

    其中后两种,都需要先更改petalinux编译出的文件系统。

实现步骤

编译制作linux启动镜像

按照petalinux工具制作ZYNQ linux启动镜像的步骤制作镜像,完成petalinux-build步骤,不要打包。

修改rootfs.cpio.gz

首先安装u-boot-tools工具,

sudo apt install u-boot-tools

进入petalinux项目目录下的images/linux目录,可以看到该目录下有image.ub文件,该文件中包含了linux-kernel、dtb和rootfs。

切换root用户,使用dumpimage进行拆包,

su
dumpimage -i image.ub -T flat_dt  -p 0 linux.bin
dumpimage -i image.ub -T flat_dt  -p 1 system-top.dtb
dumpimage -i image.ub -T flat_dt  -p 2 petalinux-user-image-plnx-zynq7.cpio.gz

注意:切换root用户的目的是保证后续针对rootfs.cpio.gz的操作时,该文件及子目录中的文件等owner和group都是root,防止启动镜像时出现无权挂载的问题。

解压刚刚拆包得到的cpio.gz文件,

mkdir rootfs_new
gunzip -c petalinux-user-image-plnx-zynq7.cpio.gz | sh -c 'cd rootfs_new/ && cpio -i

进入rootfs_new目录,可以看到完整的rootfs目录结构,此时在该目录中进行自己的修改,如添加文件或修改文件。修改完成后,对修改后的目录再次进行打包,生成新的cpio.gz文件,

sh -c 'cd rootfs_new/ && find . | cpio -H newc -o' | gzip -9 > petalinux-user-image-plnx-zynq7.cpio.gz

新建一个package_image_ub.its文件,写入如下内容,其中linux.bin、system-top.dtb和petalinux-user-image-plnx-zynq7.cpio.gz的路径请根据自己的实际路径进行替换。its文件描述了重新打包时的文件参数等信息。

/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/("/home/sigmapoet/work/board/ZYNQ7020/vivado_project/hytq_linux_eth_ok/set_image_fpga_0/linux.bin");
                        type = "kernel";
                        arch = "arm";
                        os = "linux";
                        compression = "gzip";
                        load = <0x8000>;
                        entry = <0x8000>;
                        hash@1 {
                                algo = "sha1";
                        };
                };
                fdt@system-top.dtb {
                        description = "Flattened Device Tree blob";
                        data = /incbin/("/home/sigmapoet/work/board/ZYNQ7020/vivado_project/hytq_linux_eth_ok/set_image_fpga_0/system-top.dtb");
                        type = "flat_dt";
                        arch = "arm";
                        compression = "none";

                        hash@1 {
                                algo = "sha1";
                        };
                };
                ramdisk@1 {
                        description = "petalinux-user-image";
                        data = /incbin/("/home/sigmapoet/work/board/ZYNQ7020/vivado_project/hytq_linux_eth_ok/set_image_fpga_0/petalinux-user-image-plnx-zynq7.cpio.gz");
                        type = "ramdisk";
                        arch = "arm";
                        os = "linux";
                        compression = "gzip";

                        hash@1 {
                                algo = "sha1";
                        };
                };
    };

        configurations {
                default = "conf@system-top.dtb";
                conf@system-top.dtb {
            description = "1 Linux kernel, FDT blob, ramdisk";
            kernel = "kernel@1";
            fdt = "fdt@system-top.dtb";
            ramdisk = "ramdisk@1";

                        hash@1 {
                                algo = "sha1";
                        };
                };
    };
};

运行打包命令,打包生成新的image.ub文件,

mkimage -f package_image_ub.its image.ub

这样,images/linux目录下的image.ub就是新的镜像文件了,再使用petalinux-package进行打包,就可以得到包含更新过initramfs的BOOT.bin文件了。

说点什么
请文明发言!
支持Markdown语法
好耶,沙发还空着ヾ(≧▽≦*)o
Loading...