? ? 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";};};fdt@system-top.dtb {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 = "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";};};};
};
第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命令方便多了。