开发环境
- ubuntu16.04
- petalinux 2018.2(ubuntu16.04)
- vivado 2018.2(windows11)
- ZYNQ型号:ZYNQ 7020
应用背景
-
petalinux制作的文件系统为INITRAMFS类型的linux系统镜像在使用过程中存在一个问题,即上电后在文件系统中的任何更改,如创建文件,修改文件等,在重启之后全部还原。因为文件系统是运行在RAM中的,重新上电后,会从Flash重新解压到内存中。在内存中的操作无法应用到Flash中,因此导致前述现象。
-
若要实现有效的文件系统改动,有三种解决方案:
- 实现JFFS2文件系统,具体实现过程请参考:使用petalinux制作JFFS2文件系统
- 修改petalinux编译的initramfs文件系统,将自己需要的文件编码到内核镜像中
- 修改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文件了。
本文地址: 修改petalinux编译的INITRAMFS文件系统