Petalinux开发实战:如何快速修改rootfs.cpio.gz文件避免重复编译(附详细命令)

记录一下如何直接修改zynq petalinux编译出来的rootfs.cpio.gz文件内容 不用重新编译,修改petalinux的rootfs.cpio.gz文件并重新打包成image.ub和BOOT.BIN 阅读详情

Petalinux开发实战:绕过全量编译,直接修改rootfs.cpio.gz的极速迭代方案

在嵌入式Linux开发,尤其是基于Xilinx Zynq平台的项目中,我们常常面临一个令人头疼的困境:为了修改根文件系统(rootfs)中的一个配置文件、一个脚本,甚至只是更新一个微小的二进制文件,却不得不启动一次耗时漫长的petalinux-build全量编译。这个过程动辄十几分钟甚至几十分钟,对于追求快速迭代和调试效率的工程师而言,无疑是巨大的时间损耗。你是否也曾对着编译进度条,内心焦灼地等待,只为一个几KB的改动?

这种“牵一发而动全身”的编译模式,在项目初期频繁调试、功能验证阶段尤为低效。想象一下,你正在调试一个复杂的设备驱动,需要反复修改/etc/init.d下的启动脚本,或者调整/usr/bin中的某个工具参数。每一次微小的尝试,都需要付出巨大的时间成本。这不仅打断了开发节奏,也严重影响了问题定位和修复的效率。

本文将为你揭示一种高效、直接的解决方案:绕过Petalinux的全量编译流程,直接对最终生成的rootfs.cpio.gz文件进行解包、修改、再打包。这套方法的核心在于理解Petalinux的构建产物,并利用一系列标准的Linux工具链进行操作。掌握它,你就能将原本以“小时”或“分钟”计的修改-验证周期,缩短到“秒”级。这对于需要快速原型验证、现场调试或进行A/B测试的FPGA工程师和嵌入式软件开发者来说,价值非凡。

1. 理解Petalinux构建流程与关键文件

要实施精准的“外科手术式”修改,首先必须清晰了解Petalinux从源代码到最终可烧写镜像的完整构建链条。这并非为了重复官方文档,而是为了让你明白我们将在哪个环节进行“介入”,以及为什么这样做是安全且有效的。

一个典型的Petalinux项目构建完成后,在images/linux/目录下会生成一系列关键文件。对于从SPI Flash或SD卡启动的Zynq系统,最核心的启动文件是BOOT.BIN。然而,这个文件本身是一个容器,它内部封装了多个组件。更值得我们关注的是image.ub文件,它是一个FIT(Flattened Image Tree)镜像,可以理解为一个“套娃”文件,其内部结构如下表所示:

组件文件类型在FIT镜像中的角色说明
FSBL.elf不包含在image.ub中第一阶段引导加载程序,位于BOOT.BIN内。
FPGA Bitstream.bit 或 .bin不包含在image.ub中FPGA硬件配置流,位于BOOT.BIN内。
U-Boot.elf不包含在image.ub中第二阶段引导加载程序,位于BOOT.BIN内。
Linux KernelImage (或 zImage)kernel@1 节点经过压缩的Linux内核镜像。
Device Tree Blob.dtbfdt@... 节点硬件设备树描述文件,告知内核硬件配置。
Root Filesystemrootfs.cpio.gzramdisk@1 节点我们的主要目标。这是一个经过gzip压缩的cpio归档文件,包含了完整的根文件系统。

关键洞察:petalinux-build过程最耗时的部分往往是构建根文件系统(rootfs),因为它涉及Yocto/OpenEmbedded系统,需要解析大量配方(recipe)、解决依赖、编译成千上万个软件包。而内核(Kernel)和U-Boot的编译虽然也耗时,但通常远少于rootfs的构建。我们的策略就是隔离并单独处理这个最耗时的部分。

image.ub文件正是通过mkimage工具,将上述内核、设备树和根文件系统这三个组件打包而成的单一镜像。U-Boot在启动时会加载整个image.ub,然后从中解压出各个部分并启动内核。因此,我们的修改路径变得清晰:

  1. 从image.ub中提取出rootfs.cpio.gz。
  2. 解压rootfs.cpio.gz得到原始文件目录树。
  3. 在目录树中进行任意修改(增、删、改文件)。
  4. 将修改后的目录树重新打包为新的rootfs.cpio.gz。
  5. 用新的rootfs.cpio.gz替换image.ub中的对应部分,生成新的image.ub。
  6. (可选)用新的image.ub重新生成BOOT.BIN。

整个过程完全不需要重新执行petalinux-build,从而实现了“秒级”迭代。

2. 实战:解包、修改与再打包rootfs.cpio.gz

现在,让我们进入实战环节。请确保你的开发环境中已安装必要的工具:dumpimage (通常来自u-boot-tools包)、cpio、gzip和mkimage。

2.1 第一步:从image.ub中提取组件

首先,进入你的Petalinux项目构建输出目录:

cd <你的Petalinux项目路径>/images/linux/

使用dumpimage工具来拆解image.ub。这个工具是U-Boot项目的一部分,专门用于处理FIT镜像。

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

命令解析:

  • -i image.ub: 指定输入的FIT镜像文件。
  • -T flat_dt: 指定镜像类型为扁平设备树(FIT镜像的一种格式)。
  • -p <index>: 指定要提取的组件索引。索引0通常是内核,1是设备树,2是根文件系统。你可以通过dumpimage -l image.ub命令列出所有组件及其索引来确认。
  • 最后参数是输出文件名。

执行成功后,当前目录下会生成kernel.bin、devicetree.dtb和rootfs.cpio.gz三个文件。

2.2 第二步:解压rootfs.cpio.gz

rootfs.cpio.gz是一个先用cpio归档再用gzip压缩的文件。我们需要按顺序解压。

# 创建一个临时目录用于存放解压后的文件系统
mkdir -p ramdisk_unpack

# 使用管道组合命令进行解压:先解gzip,再将结果传递给cpio进行解包
gunzip -c rootfs.cpio.gz | (cd ramdisk_unpack && cpio -i -d -H newc --no-absolute-filenames)

命令解析:

  • gunzip -c: 将gzip压缩文件解压,并将结果输出到标准输出(-c),而不是写入文件。
  • cd ramdisk_unpack && cpio -i: 这是一个子shell,它先切换到目标目录ramdisk_unpack,然后执行cpio -i从标准输入读取归档文件并解包。
  • -d: 按需创建目录。
  • -H newc: 指定归档格式为newc(SVR4 portable CPIO),这是mkimage打包时使用的格式,确保兼容性。
  • --no-absolute-filenames: 防止解包时使用绝对路径,确保所有文件都解压到当前目录下。

现在,ramdisk_unpack目录下就是完整的根文件系统结构,你可以像操作普通Linux目录一样,自由地进行任何修改。

2.3 第三步:修改根文件系统内容

这是最灵活的一步。你可以进行各种操作,例如:

  • 添加文件:将编译好的驱动模块(.ko)复制到lib/modules/下。
  • 修改配置:编辑/etc/network/interfaces、/etc/fstab等配置文件。
  • 更新脚本:修改/etc/init.d/下的启动脚本。
  • 替换二进制程序:用新版本替换/usr/bin/或/sbin/下的工具。
  • 创建符号链接:ln -s /path/to/original /path/to/link

操作示例:假设我们需要在系统启动时自动加载一个自定义模块,并设置一个静态IP。

# 进入解压目录
cd ramdisk_unpack

# 1. 复制驱动模块
cp /path/to/your_driver.ko lib/modules/$(uname -r)/kernel/drivers/misc/

# 2. 更新模块依赖关系(在目标rootfs内模拟操作,需谨慎)
# 注意:此步骤通常需要在目标架构的环境中运行depmod。如果只是添加模块,可以手动创建依赖。
# 更稳妥的做法是在完整编译环境中生成modules.dep文件后复制过来。
# 这里我们假设模块不依赖其他内核模块。

# 3. 修改网络配置
cat >> etc/network/interfaces << EOF
auto eth0
iface eth0 inet static
    address 192.168.1.100
    netmask 255.255.255.0
    gateway 192.168.1.1
EOF

# 4. 创建一个简单的自定义启动脚本
cat > etc/init.d/S99custom << 'EOF'
#!/bin/sh
### BEGIN INIT INFO
# Provides:          custom
# Required-Start:
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:
# Short-Description: Custom startup script
# Description:       Load custom module and do something.
### END INIT INFO

case "$1" in
  start)
    echo "Starting custom service..."
    /sbin/insmod /lib/modules/$(uname -r)/kernel/drivers/misc/your_driver.ko
    ;;
  stop)
    echo "Stopping custom service..."
    /sbin/rmmod your_driver
    ;;
  *)
    echo "Usage: $0 {start|stop}"
    exit 1
    ;;
esac

exit 0
EOF
chmod +x etc/init.d/S99custom

# 修改完成后,返回上级目录
cd ..

注意:对ramdisk_unpack目录的修改是直接且持久的。请确保你了解每个修改的影响,尤其是在处理/etc、/lib等关键目录时。

2.4 第四步:重新打包为rootfs.cpio.gz

修改完成后,需要将目录树重新打包。命令是第二步的逆过程。

# 在ramdisk_unpack目录的父目录下执行
(cd ramdisk_unpack && find . | cpio -H newc -o) | gzip -9 > new_rootfs.cpio.gz

命令解析:

  • (cd ramdisk_unpack && find .): 在子shell中切换到ramdisk_unpack目录,然后使用find .列出所有文件和目录的相对路径。
  • cpio -H newc -o: 读取find命令输出的文件列表,使用newc格式创建cpio归档,并输出到标准输出。
  • gzip -9: 以最高压缩级别(-9)压缩标准输入的数据。
  • > new_rootfs.cpio.gz: 将压缩后的数据重定向到新文件new_rootfs.cpio.gz。

现在,你得到了一个包含所有修改的新根文件系统压缩包new_rootfs.cpio.gz。

3. 重构FIT镜像 (image.ub)

仅有新的根文件系统还不够,我们需要将它塞回image.ub这个容器中。这需要一个描述文件(.its文件,即Image Tree Source)来告诉mkimage工具如何组装镜像。

3.1 获取或创建ITS文件

Petalinux在构建过程中会生成ITS文件,通常位于components/plnx_workspace/或build/tmp/目录下,但路径较深且复杂。更简单的方法是从原始的image.ub中反编译出一个模板,或者基于已知结构手动创建一个。

方法一:从原始image.ub反编译ITS

mkimage -l image.ub > image_info.txt  # 查看镜像信息,确认结构
# 反编译ITS文件(注意:mkimage的`-r`参数在某些版本中用于反编译,但并非所有版本都支持。更可靠的方法是使用dtc工具,但过程稍复杂。)
# 一个实用的替代方案是,直接使用Petalinux工程中已有的模板。搜索你的项目目录:
find <你的Petalinux项目路径> -name "*.its" -type f | head -5

如果找不到,或者反编译不便,我们采用方法二:手动创建ITS文件。

创建一个名为package_image_ub.its的文件,内容如下。请务必将data = /incbin/(...)中的路径替换为你自己的实际文件路径(绝对路径或相对路径)。

/dts-v1/;

/ {
    description = "Modified U-Boot fitImage for PetaLinux";
    #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 = "Modified petalinux-user-image";
            data = /incbin/("./new_rootfs.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 = "Modified Linux kernel, FDT blob, ramdisk";
            kernel = "kernel@1";
            fdt = "fdt@system-top.dtb";
            ramdisk = "ramdisk@1";
            hash@1 {
                algo = "sha1";
            };
        };
    };
};

重要参数说明:

  • load 和 entry: 内核的加载地址和入口地址,需与你的硬件平台(如Zynq)的U-Boot配置匹配。示例中的0x8000是典型值,请根据实际情况确认。
  • compression: 指定各组件的压缩方式。内核和设备树可能是none或gzip,根文件系统通常是gzip。请根据第一步dumpimage -l查看的信息来设置。
  • arch: 架构,如arm(针对Zynq-7000)或arm64(针对Zynq UltraScale+ MPSoC)。

3.2 使用mkimage生成新的image.ub

确保kernel.bin、devicetree.dtb、new_rootfs.cpio.gz和package_image_ub.its都在当前目录下,然后执行:

mkimage -f package_image_ub.its new_image.ub

如果命令执行成功,将生成new_image.ub文件。你可以用dumpimage -l new_image.ub验证其内部结构是否正确。

4. 生成最终的BOOT.BIN并测试

现在,我们有了包含新根文件系统的new_image.ub。最后一步是将其与FSBL、Bitstream和U-Boot一起打包成最终的启动文件BOOT.BIN。

4.1 使用petalinux-package命令

这是最简便的方法,前提是你的Petalinux环境已配置好。

petalinux-package --boot --fsbl ./zynq_fsbl.elf --fpga ./system.bit --u-boot ./u-boot.elf --kernel ./new_image.ub -o ./new_BOOT.BIN --force

参数说明:

  • --fsbl, --fpga, --u-boot: 指定FSBL、FPGA比特流和U-Boot的路径。这些文件通常也在images/linux/目录下。
  • --kernel: 这里指定我们新生成的new_image.ub。
  • -o: 指定输出的BOOT.BIN文件名。
  • --force: 强制覆盖已存在的文件。

4.2 直接使用bootgen工具(进阶)

petalinux-package底层调用的也是Xilinx的bootgen工具。你也可以直接使用bootgen,这需要你有一个.bif(Boot Image Format)文件。例如,创建一个boot.bif文件:

//arch = zynq; // 对于Zynq-7000系列
//arch = zynqmp; // 对于Zynq UltraScale+ MPSoC系列
the_ROM_image:
{
    [bootloader]./zynq_fsbl.elf
    ./system.bit
    ./u-boot.elf
    ./new_image.ub
}

然后运行:

bootgen -image boot.bif -arch zynq -o new_BOOT.BIN -w on

使用-arch参数指定你的平台架构。

4.3 测试与验证

将生成的new_BOOT.BIN和new_image.ub(如果你使用SD卡启动且系统配置为分开加载,则需要后者)拷贝到启动介质(SD卡或通过JTAG编程到Flash)。启动目标板,通过串口观察启动日志。你应该能看到系统正常启动,并且你之前所做的修改(如新的网络配置、自定义脚本执行等)已经生效。

一个快速验证修改的窍门:如果你只是修改了rootfs中的文件,并且启动方式支持从image.ub和单独的rootfs.cpio.gz文件启动(这取决于U-Boot的bootscript配置),你甚至可以只替换rootfs.cpio.gz文件,而无需重新打包image.ub和BOOT.BIN。这需要你的启动脚本(如boot.scr)配置为分别加载Image、system.dtb和rootfs.cpio.gz。这种方式迭代速度最快,但依赖于特定的启动环境配置。

5. 流程自动化与进阶技巧

手动执行上述命令虽然有效,但容易出错且重复劳动。将其脚本化是必然选择。

5.1 基础自动化脚本

创建一个Shell脚本(例如fast_rootfs_mod.sh),将上述步骤串联起来:

#!/bin/bash
set -e # 遇到错误立即退出

PROJECT_IMG_DIR="<你的Petalinux项目路径>/images/linux"
WORK_DIR=$(pwd)
MOD_DIR="${WORK_DIR}/ramdisk_unpack"

echo "步骤1: 提取image.ub组件..."
cd "${PROJECT_IMG_DIR}"
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

echo "步骤2: 解压rootfs..."
rm -rf "${MOD_DIR}"
mkdir -p "${MOD_DIR}"
gunzip -c rootfs.cpio.gz | (cd "${MOD_DIR}" && cpio -i -d -H newc --no-absolute-filenames)

echo "步骤3: 等待用户修改。请修改 ${MOD_DIR} 目录下的内容。"
echo "完成后,在此终端按 Enter 键继续..."
read -r

echo "步骤4: 重新打包rootfs..."
(cd "${MOD_DIR}" && find . | cpio -H newc -o) | gzip -9 > new_rootfs.cpio.gz

echo "步骤5: 生成新的image.ub..."
# 这里需要你的package_image_ub.its文件,确保路径正确
mkimage -f "${WORK_DIR}/package_image_ub.its" new_image.ub

echo "步骤6: 生成新的BOOT.BIN..."
petalinux-package --boot --fsbl ./zynq_fsbl.elf --fpga ./system.bit --u-boot ./u-boot.elf --kernel ./new_image.ub -o ./new_BOOT.BIN --force

echo "完成!新的启动文件为: ${PROJECT_IMG_DIR}/new_BOOT.BIN"

5.2 与版本控制系统集成

对于更复杂的修改,尤其是团队协作时,可以考虑将ramdisk_unpack目录纳入版本控制(如Git)。这样,你可以清晰地追踪对根文件系统的每一次修改,方便回滚和对比。只需在脚本中添加git操作即可。

5.3 处理非initramfs根文件系统

本文主要针对INITRAMFS/INITRD类型的根文件系统(即rootfs.cpio.gz)。如果你的系统使用EXT4等持久化文件系统(通常位于SD卡的独立分区),修改方式则完全不同。对于EXT4分区,你可以直接挂载该分区进行读写:

# 假设SD卡的根文件系统分区为 /dev/sdX2
sudo mount /dev/sdX2 /mnt
# 直接在 /mnt 下进行修改
sudo cp my_new_file /mnt/usr/local/bin/
sudo umount /mnt

这种方式甚至比处理cpio.gz更直接,但要求目标板支持从该分区启动,并且你有一个可读写的文件系统镜像或物理介质。

5.4 性能与存储权衡

使用gzip -9提供了最高的压缩率,但压缩/解压速度稍慢。在调试初期,如果你追求极致的打包速度,可以考虑使用较低的压缩级别,例如gzip -1,甚至不压缩(但需相应修改ITS文件中的compression属性)。在最终发布版本中,再切换为高压缩以节省存储空间。

绕过全量编译,直接操作rootfs.cpio.gz,本质上是一种“补丁”策略。它并不能替代完整的Petalinux构建流程,因为当你需要更新内核、修改设备树或添加新的Yocto软件包时,仍然需要回归到petalinux-build。然而,在占据了开发周期大部分时间的“微调”和“调试”阶段,这套方法无疑是提升效率的利器。它让开发者能将精力聚焦于问题本身,而不是无谓的等待。下次当你需要修改一个简单的配置文件时,不妨试试这个方法,感受一下“秒级”部署带来的畅快感。

基于AMD-Xilinx KR260的APU与RPU异构通信实战:从LED控制到IPI应用 在嵌入式系统和异构计算领域,处理器间通信(IPC)是实现复杂系统协同工作的核心技术。其原理是通过共享内存、消息传递或中断等机制,在不同处理单元间高效交换数据与控制信息。这项技术的核心价值在于充分发挥异构架构中不同核心的专长,例如将高性能应用处理器与硬实时控制单元结合,实现算力与实时性的平衡。典型的应用场景包括机器人控制、工业自动化、边缘计算等对实时响应和复杂处理均有要求的领域。本文以AMD-Xilinx Kria KR260平台为例,深入探讨了其应用处理器单元(APU)与实时处理器单元(RPU)之间,基于处 阅读详情

相关推荐

手机拍照对焦快准狠的秘密:一文看懂PDAF、Dual Pixel和Super PD的区别

本文深入解析手机拍照中的三种主流相位检测自动对焦(PDAF)技术:Shield Pixel、Super PD和Dual Pixel。通过对比它们的原理、优缺点及实际表现,帮助读者理解不同技术的对焦速度、暗光表现和画质影响,从而做出更明智的购机选择。

weixin_26985923的博客 490

构建根文件系统

文件系统是对一个存储设备上的数据和元数据进行组织的机制,根文件系统是linux内核启动时所挂载的第一个文件系统。对于一个可启动的linux系统,根文件系统是其不可或缺的一部分。此处就根文件系统的构建作一个简单的介绍。

huang20083200056的专栏 1174

深度残差网络的无人机多目标识别

深度残差网络的无人机多目标识别 人工智能技术与咨询 来源:《图学学报》。作者翟进有等 摘要:传统目标识别算法中,经典的区域建议网络(RPN)在提取目标候选区域时计算量大,时间复杂度较高,因此提出一种级联区域建议网络(CRPN)的搜索模式对其进行改善。此外,深层次的卷积神经网络训练中易产生退化现象,而引入残差学习的深度残差网络(ResNet),能够有效抑制该现象。对多种不同深度以及不同参数的网络模型进行研究,将两层残差学习模块与三层残差学习模块结合使用,设计出一种占用内存更小、时间复杂度更低的新型多捷.

m0_62870606的博客 3116

使用 debootstrap 制作 ARM64 rootfs.cpio

Debian 9,配合 Raspberry Pi 4 Model B

Jia ming 的日常学习笔记 1910

Anaconda离线创建python环境

既然是离线创建python环境,就需要有一个已经创建好的python环境。所以我们有两台win10的机器,分别是A和B。两台机器都安装了anaconda。其中A可以连网,因此我们在A上创建好一个python2.7的环境py27,然后将py27移植(安装)到B上。B连不连网都无所谓。 一、机器上A上创建python2.7的环境py27 有两种方法: 方法1:使用Anaconda的图形界面。首先,点击Environments->Create,然后输入要创建的环境名称"py27",然后选择2.7,如图

FY_2018的博客 6787

医学影像分割入门:为什么U-Net至今仍是肝脏CT肿瘤分割的‘首选’?

本文探讨了U-Net在肝脏CT肿瘤分割中的持久优势,分析了其轻量化设计、对称架构和跳跃连接如何完美适配医学影像的小样本、高精度需求。通过对比实验和实战建议,揭示了U-Net在肝脏肿瘤分割任务中超越新模型的根本原因,并提供了PyTorch实现和部署技巧。

weixin_38166931的博客 518

解析linux根文件系统的挂载过程

 本文系本站原创,欢迎转载!转载请注明出处:http://ericxiao.cublog.cn/------------------------------------------st1/:*{behavior:url(#ieooui) }<!-- /* Font Definitions */ @font-face {font-fam

againyuan的专栏 1536

内网环境下 OpenSSL 与 OpenSSH 安全升级实战指南:从 9.9p2 离线部署到回滚方案

本文详细介绍了内网环境下OpenSSL与OpenSSH的安全升级实战指南,重点涵盖从9.9p2版本离线部署到回滚方案的全流程。通过备份策略、动态库处理、权限修复等关键步骤,确保升级过程安全可靠,特别适合金融、政务等敏感行业的内网服务器安全加固。

weixin_30566063的博客 511

基于busybox构建rootfs

它整合了许多Linux上常用的工具和命令(utilities), 如rm, ls, gzip, tftp等。对于这些工具和命令,busybox中的实现可能不是最全的,但却是最常用的,因此它的特点就是短小精悍,特别适合对尺寸很敏感的嵌入式系统。 官网:https://busybox.net/ 参考: http://www.tldp.org/HOWTO/Bootdisk-HOWTO/buildroot.html busybox有两个作用: 基于busybox构建rootfs 编..

ARM-Linux 3382

FastAPI基础项目:仿头条新闻的web项目,实现基本的新闻列表页和详情页查看功能

该项目是一个基于FastAPI和MySQL的新闻应用入门项目。主要包含新闻列表页和详情页两个功能页面。项目结构清晰,包含主应用文件、数据库脚本和HTML模板。使用SQLAlchemy进行数据库操作,通过脚本可自动生成50条示例新闻数据。环境配置简单,仅需安装FastAPI、MySQL驱动等基础依赖,通过.env文件管理数据库连接。该项目适合作为FastAPI+MySQL的入门学习案例,展示了基本的CRUD操作、分页查询和模板渲染功能。

数据知道的博客 4430

Harmony:C# 动态代码补丁的5大秘密武器

Harmony 是一个开源库,它允许你在运行时修改托管代码(即使用 .NET 或 Mono 编译的语言编写的应用程序)。它通过利用 AOP(面向切面编程)的思想,可以在不重新编译代码的情况下添加、替换或修改方法的行为。这对于游戏模组(Modding)、插件开发以及调试工具非常有用。安装 Harmony要使用 Harmony,你需要首先安装它。Harmony 作为一个 NuGet 包,可以直接通过 Visual Studio 的 NuGet 包管理器进行安装。安装步骤打开 Visual Studio。

java专栏 1193

直接修改zynq petalinux编译出来的rootfs.cpio.gz文件内容

直接修改zynq petalinux编译出来的rootfs.cpio.gz文件内容 直接修改zynq petalinux编译出来的rootfs.cpio.gz文件内容 直接修改zynq petalinux编译出来的rootfs.cpio.gz文件内容

weixin_55163060的博客 1552

[RK3568 Android11] 开发之蓝牙(AP6275S)

前言 蓝牙是一种支持设备短距离通信(一般10m内)的无线电技术,能在包括移动电话、PDA、无线耳机、笔记本电脑、相关外设等众多设备之间进行无线信息交换。利用“蓝牙”技术,能够有效地简化移动通信终端设备之间的通信,也能够成功地简化设备与因特网Internet之间的通信,从而数据传输变得更加迅速高效,为无线通信拓宽道路。 接下来是在RK3568上调试AP6275S模块蓝牙部分: 一、设备树dts配置 根据硬件原理图,找到对应的控制引脚,配置好dts: ...

~未来可期~ 4075

imx6q initramfs rootfs.cpio.gz.u-boot 的生成详解

fsl-image-mfgtool-initramfs-xxxx.rootfs.cpio.gz.u-boot 的生成流程如下, 该流程来自于yocto2.1 的BB 文件: (cd ${IMAGE_ROOTFS} && find . | cpio -o -H newc >${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}...

Qing的专栏 4654

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【嵌入式Linux开发学习】rootfs通过ramfs挂载技巧

在使用initramfs的过程中我感觉相比于传统的我们直接挂载块设备/dev/mmcblk0 /mmc/sda1 之类的挂载点来看相比于读写块设备 ,读写ram总归是会快很多的,系统性能会有所提高。可以避免一些需要频繁擦写数据的情况对于块设备的消耗,可以提升设备寿命,对于不怎么开关机长期保持上电状态的设备比如交换机,网桥之类尤其如此。

yy197696的博客 1991

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

cpio.gz格式小系统

用如下命令可对cpio.gz做解压操作: gunzip rootfs.cpio.gz ---> 得到rootfs.cpio文件 cpio -idmv < rootfs.cpio --->得到解压后的文件和文件夹 当添加自己想要的文件后,需要再次对文件和文件夹打包,用如下命令: find ./* | cpio -H newc -o > rootfs.cpio ---> 得到rootfs.cpio文件 gzip rootfs.c...

flyingnosky的专栏 2528

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

cpio文件系统的解压和制作方法

cpio解压方法:注意不要覆盖HOST的dev下     1.  # gunzip  XXX.cpio.gz     2. cpio -idmv 制作cpio格式文件系统的方法:     1. 执行gen_initramfs_list.sh脚本:     # gen_initramfs_list.sh ./Filesystem/ >filelist  

kyliner1234的专栏 1023

Linux--根文件系统的挂载过程分析

前言: 本篇文章以S3C6410公版的Linux BSP和U-Boot来进行分析,文中所有提及的名词和数据都是以该环境为例,所有的代码流程也是以该环境为例来进行分析。哈哈。如果有不正确或者不完善的地方,欢迎前来拍砖留言或者发邮件到guopeixin@126.com进行讨论,先行谢过。 简单的来说,根文件系统包括虚拟根文件系统和真实根文件系统。在Kernel启动的初始阶段,首先去创建虚拟的根文件系统,接下来再去调用do_mount来加载真正的文件系统,并将根文件系统切换到真正的文件系统,也即真实的文件系统

guopeixin的专栏 4万+

制作根文件系统

可以根据自己需要制定rootfs,可以选择ramdisk、initramfs、nfs等。根文件系统是Linux内核启动之后挂载的第一个文件系统.根文件系统支持从网络挂载和本地挂载两种方式.(1)如果是采用网络挂载就将路径设置为/dev/nfs,NFS是Linux下常用的网络文件系统,这种方式挂载一般是在系统开发阶段,方便修改调试代码,也就是将根文件系统放在PC机上,嵌入式开发板通过网络到PC机进行访问。

never_go_away的博客 1040

根文件系统(四)——U盘文件系统制作

U盘根文件系统制作方法 首先准备一个稍微大一点的U盘,其次对U盘进行分区,然后将某个区当做根文件系统区,格式化成想要加载的文件系统类型,在将自己制作的rootfs目录下的东西都拷贝到这个区,最后在U盘第一个分区添加linux内核和grub配置文件。 (1)分区格式化 将U盘插入装有Linux系统的设备,然后使用fdisk命令进行分区: fdisk /dev/sdx 输入 p:查询当前分...

zz2633105的博客 1696

问题记录:stat() error on file “output/images/rootfs.cpio.uboot“: No such file or directory

通过buildroot勾选cpio文件系统参考:荔枝派nano f1c100s 使用sunxi-fel 借 u-boot 启动 Linux系统, 无需 spi flash / TF 卡 / 全志 SOC / WhyCan Forum(哇酷开发者社区)

初心不辜的博客 401

Initrd 流程分析(2.6 cpio rootfs)

以 Linux-2.6.25 的 kernel 为例,分析一下 Linux 启动过程中 initrd 的流程。1. 先从 Makefile说起下面是内核代码中 init/Makefile 文件的一段内容:obj-y   := main.o version.o mounts.oifneq ($(CONFIG_BLK_DEV_INITRD),y)obj-y += noinitramfs.oelseob

babyfans的专栏 1710

cpio命令与文件系统制作

嵌入式开发过程中的文件系统制作,往往是使用已经定制好的目录及文件进行制作,下面以实际的例子进行说明: 假设当前目录为rootdir,目录结构如下: [plain] view plaincopy root@debian:~# tree -L 2 rootdir   rootdir   |-- dev   |-- drv   |   |-- d

小饼仙子的专栏 1831
上一篇: Linux内核崩溃急救指南:5分钟快速定位问题模块(附kdump实战)
下一篇: Vue2项目实战:利用webpack-bundle-analyzer优化打包体积与性能
code8
博客等级 码龄17年 65粉丝 1720原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值