xrdk3 sdk pack_image.sh 完整分析:镜像打包的“总指挥“

张开发
2026/4/10 3:37:38 15 分钟阅读

分享文章

xrdk3 sdk pack_image.sh 完整分析:镜像打包的“总指挥“
一、核心定位pack_image.sh是整个 RDK 镜像构建系统的总指挥它不编译任何代码而是编排整个流程将各种预编译好的组件打包成一个完整的可烧录系统镜像。二、功能树形分析pack_image.sh 工作流程 │ ├── 1. 前置准备阶段 │ ├── 检查root权限必须sudo执行 │ ├── 解析命令行参数-c 配置文件, -l 本地构建 │ ├── 加载配置文件ubuntu-22.04_desktop_rdk-x3_release.conf │ └── 创建deploy输出目录 │ ├── 2. 下载阶段非本地构建时 │ ├── download_samplefs.sh │ │ ├── 下载预制的Ubuntu Base文件系统 │ │ ├── 例如samplefs_desktop-v3.0.0.tar.gz │ │ └── 来源D-Robotics官方服务器 │ │ │ └── download_deb_pkgs.sh │ ├── 下载所有hobot-*.deb软件包 │ ├── 包括内核、驱动、多媒体库、示例代码 │ └── 来源D-Robotics官方APT仓库 │ ├── 3. Rootfs制作阶段核心 │ ├── 3.1 解压基础文件系统 │ │ ├── tar -xzf samplefs*.tar.gz │ │ └── 创建必要的目录结构/app, /boot/config等 │ │ │ ├── 3.2 定制化修改 │ │ ├── source hobot_customize_rootfs.sh │ │ ├── 配置网络、用户、服务等 │ │ └── 设置版本号到/etc/version │ │ │ ├── 3.3 安装deb包 │ │ ├── 拷贝所有.deb到/app/hobot_debs/ │ │ ├── 去重保留最新版本 │ │ ├── 进入chroot环境 │ │ ├── 用dpkg安装所有deb包 │ │ └── apt clean清理缓存 │ │ │ └── 3.4 清理工作 │ ├── 删除/app/hobot_debs目录 │ └── 删除dri驱动减小体积 │ ├── 4. 镜像制作阶段 │ ├── 4.1 计算分区大小 │ │ ├── CONFIG分区256MBFAT32存放配置文件 │ │ ├── ROOT分区动态计算基础大小20%余量200MB │ │ └── 4K对齐计算 │ │ │ ├── 4.2 创建空白镜像 │ │ ├── truncate -s 创建指定大小文件 │ │ └── 使用parted创建分区表MBR │ │ ├── 分区1FAT32CONFIG │ │ └── 分区2ext4rootfs │ │ │ ├── 4.3 格式化分区 │ │ ├── mkdosfs -F 32 格式化CONFIG分区 │ │ └── mkfs.ext4 格式化rootfs分区 │ │ │ ├── 4.4 挂载并写入数据 │ │ ├── losetup创建loop设备 │ │ ├── 挂载rootfs分区 │ │ ├── 挂载config分区到/boot/config │ │ ├── rsync同步rootfs内容 │ │ ├── rsync同步config目录内容 │ │ └── sync同步到磁盘 │ │ │ └── 4.5 清理 │ ├── unmount所有分区 │ ├── losetup -d 删除loop设备 │ └── 输出最终镜像到deploy/ │ └── 5. 输出结果 └── deploy/rdk_x3_ubuntu_22.04_desktop_vX.X.X.img三、关键代码段分析3.1 必须root执行this_user$(whoami) if [ ${this_user} ! root ]; then echo [ERROR]: This script requires root privileges. exit 1 fi原因需要mount、losetup、chroot等特权操作。3.2 动态计算rootfs大小ROOT_SIZE$(du --apparent-size -s ${ROOTFS_BUILD_DIR} --block-size1 | cut -f 1) ROOT_MARGIN$(echo ($ROOT_SIZE * 0.2 200 * 1024 * 1024) / 1 | bc) ROOT_PART_SIZE$(((ROOT_SIZE ROOT_MARGIN ALIGN - 1) / ALIGN * ALIGN))设计思想预留20% 200MB空间避免用户空间不足。3.3 分区布局CONFIG_PART_START$((ALIGN)) # 4MB起始 CONFIG_PART_SIZE$((256 * 1024 * 1024)) # 256MB ROOT_PART_START$((CONFIG_PART_START CONFIG_PART_SIZE))分区设计分区格式大小用途configFAT32256MB配置文件、设备树、启动参数Windows可访问rootfsext4动态Ubuntu系统、应用程序、用户数据四、脚本依赖关系图pack_image.sh (总指挥) │ ├── 配置文件依赖 │ └── build_params/ubuntu-22.04_desktop_rdk-x3_release.conf │ ├── RDK_IMAGE_NAMErdk_x3_ubuntu_22.04_desktop.img │ ├── RDK_ROOTFS_DIRsamplefs/desktop │ ├── RDK_DEB_PKG_DIRdeb_packages │ └── RDK_IMAGE_VERSIONv3.0.0 │ ├── 子脚本调用 │ ├── download_samplefs.sh → 下载基础文件系统 │ ├── download_deb_pkgs.sh → 下载deb包 │ └── hobot_customize_rootfs.sh → 定制化配置 │ ├── 输入数据 │ ├── samplefs/*.tar.gz → 预制的Ubuntu Base │ ├── deb_packages/*.deb → hobot软件包 │ ├── config/* → 启动配置文件 │ └── deploy/deb_pkgs/*.deb → 用户自定义deb包 │ └── 输出产物 └── deploy/*.img → 可烧录的系统镜像五、与之前脚本的关系RDK构建系统全景图 │ ├── pack_image.sh (镜像打包) │ ├── 调用 download_samplefs.sh │ ├── 调用 download_deb_pkgs.sh │ └── 调用 hobot_customize_rootfs.sh │ ├── mk_kernel.sh (内核编译) │ └── 输出内核镜像、设备树、模块 │ └── 最终被 deb_packages 包含 │ ├── mk_debs.sh (deb包构建) │ ├── 依赖 mk_kernel.sh 的输出 │ └── 输出各种 hobot-*.deb │ └── 被 download_deb_pkgs.sh 下载 │ └── bootloader/build/xbuild.sh (bootloader打包) └── 输出miniboot.img └── 需要单独烧录不在主镜像中六、执行流程图执行 sudo ./pack_image.sh │ ├── [1/6] 检查root权限 ✅ ├── [2/6] 加载配置文件 ├── [3/6] 下载资源 │ ├── 下载 samplefs_desktop-v3.0.0.tar.gz (约500MB) │ └── 下载 30 个deb包 (约200MB) ├── [4/6] 制作rootfs │ ├── 解压samplefs (约2GB) │ ├── 定制化配置 (设置用户、网络、服务) │ ├── 安装deb包 (chroot环境中执行dpkg) │ └── 清理缓存 ├── [5/6] 制作镜像 │ ├── 计算大小: config256MB, rootfs≈3.2GB │ ├── 创建空白.img文件 │ ├── 分区、格式化 │ ├── 挂载并rsync数据 │ └── 卸载、清理 └── [6/6] 完成 └── 输出: deploy/rdk_x3_ubuntu_22.04_desktop_v3.0.0.img七、关键设计思想7.1 分层构建不编译任何源码只打包预编译组件编译工作由mk_kernel.sh、mk_debs.sh、xbuild.sh独立完成pack_image.sh只负责集成7.2 可重复性使用固定版本的配置文件从官方服务器下载固定版本的samplefs和deb包确保每次构建的镜像一致7.3 可定制性支持-c指定配置文件支持-l本地构建跳过下载使用已有包支持通过hobot_customize_rootfs.sh定制7.4 双分区设计CONFIG分区(FAT32)配置文件可在Windows下修改rootfs分区(ext4)Linux系统支持权限和符号链接八、技术开发sdk整理点pack_image.sh是整个RDK镜像构建系统的总控脚本它做的事情可以概括为编排而非编译。核心工作流程下载阶段从官方服务器获取预制的Ubuntu Base文件系统和所有hobot deb包组装阶段解压基础系统用chroot环境安装deb包定制化配置打包阶段创建双分区镜像FAT32配置分区 ext4系统分区用rsync写入数据设计亮点分层解耦编译mk_kernel.sh和打包pack_image.sh分离可重复构建固定版本配置确保每次构建结果一致双分区设计配置分区用FAT32用户可在Windows下修改配置文件空间预留rootfs预留20%200MB余量避免用户空间不足与bootloader的关系pack_image.sh生成的镜像不包含bootloaderbootloader需要单独用xbuild.sh生成并烧录到nand/emmc的起始位置。这种分离设计让bootloader和系统可以独立升级。

更多文章