【RDKX5交叉编译】基于 QEMU 的 RDK X5 ARM64 rootfs 镜像定制与 chroot 开发环境搭建

前言


1 chroot跨架构开发环境配置

1-1 下载系统镜像
  • 为了配置和板子上一模一样的环境,可以通过下属命令查询RDKX5的镜像版本
bash 复制代码
cat /etc/version 
  • 我们可以登陆官网下载对应的镜像版本Index of /downloads/os_images/rdk_x5/

  • 这边推荐可以使用Motrix进行快速下载,下载后会是一个.xz文件(这里实例重命名为x5_341.img.xz


1-2 解压镜像
  • 我们创建如下目录结构,并解压镜像文件:
bash 复制代码
workspace/
└── rdkx5/
    └── x5_341.img
  • 具体指令如下:
bash 复制代码
mkdir -pv ~/workspace/rdkx5
cd ~/workspace/rdkx5
mv ~/下载/x5_341.img.xz .
xz -d x5_341.img.xz 

1-3 设置回环设备
bash 复制代码
sudo losetup -Pf --show x5_341.img 
  • 我们可以通过lsblk来确定回环设备p1p2分别对应的是boot分区还是rootfs分区
bash 复制代码
lsblk -f /dev/loop12
  • 如上所示:
    • /dev/loop12p2对应的是rootfs分区
    • /dev/loop12p1对应的是boot分区

1-4 挂载镜像分区
bash 复制代码
sudo mount /dev/loop12p2 /mnt/
sudo mount /dev/loop12p1 /mnt/boot/config/
  • 这样我们就可以同时在一个目录下同时访问这两个分区
bash 复制代码
/mnt
├── rootfs内容
└── boot/config → boot分区内容

1-5 rootfsfsroot
  • rootfs:挂载出来的真实镜像文件系统
  • fsroot:通过 rsync 复制出来的离线工作目录(非挂载)
项目 mount 模式 rsync 模式
修改对象 真实镜像 复制副本
是否实时生效
是否依赖 loop 必须 只在复制时需要
是否需要 umount 必须 不需要 fsroot
风险 高(误操作改坏镜像) 安全
性能 慢(拷贝)
推荐场景 小改动 系统定制 / 开发
  • 标准做法是 rsync 模式,也就是使用fsroot(本教程采用fsroot作为例子)
bash 复制代码
workspace/
└── rdkx5/
    ├── fsroot
    └── x5_341.img
  • 创建空目录用于存放(命名只是为了区分,没有实际含义)
bash 复制代码
mkdir -pv fsroot
  • 下属两条操作请根据需要选择一条执行!!!(本教程采用fsroot作为例子)

1-5-1 rootfs
  • mount(不产生 fsroot 副本),将rootfs(分区)直接映射rootfs本身
bash 复制代码
sudo mount /dev/loop12p2 rootfs
1-5-2 fsroot(本教程采用fsroot作为例子)
  • 生成 fsroot 副本,将rootfs (/mnt)复制到fsroot(独立目录)
bash 复制代码
sudo rsync -azvP /mnt/ fsroot
sudo umount -R /mnt

1-6 挂载虚拟文件系统
bash 复制代码
sudo mount --bind /dev ./fsroot/dev
sudo mount --bind /proc ./fsroot/proc
sudo mount --bind /sys ./fsroot/sys
sudo mount --bind /dev/pts ./fsroot/dev/pts
# 如果需要修改启动的文件,可以把 boot 分区也挂载  
# sudo mount /dev/loop0p1 rootfs/boot/config
  • chroot 前必须确保 /dev/proc/sys 都已挂载(推荐)

1-7 配置网络
  • 在默认 systemd 管理的系统中,/etc/resolv.conf 通常是指向 /run/systemd/resolve/stub-resolv.conf 的符号链接。
  • 然而在 chroot 环境中,由于未启动 systemdsystemd-resolved 进程及其运行时目录 /run/systemd/resolve/ 不会被创建,导致该符号链接失效,从而无法进行 DNS 解析,表现为无法访问外部网络。
  • 因此我们需要把你电脑当前可用的 DNS 配置复制进镜像
bash 复制代码
sudo cp fsroot/etc/resolv.conf{,.bak} # 备份原来的 resolv.conf
sudo mv fsroot/etc/resolv.conf{,.bak} # 把原来的 resolv.conf 改名删除掉(覆盖 DNS 配置)
sudo cp /etc/resolv.conf fsroot/etc/resolv.conf # 用宿主机 DNS 替换

1-8 安装qemu-user-static
  • 由于本文的目的是为了配置RDKX5的交叉编译,故只需要安装
bash 复制代码
sudo apt install qemu-user-static
  • qemu-user-static用于在一种 CPU 架构的 Linux 上运行另一种 CPU 架构的用户态程序。
  • 其他的组件(本文用不上):
    • qemu-efi-aarch64:启动 EFI 系统
    • qemu-system-arm:模拟整台 ARM 电脑
  • 这里我们需要把 ARM64 模拟执行器 qemu-aarch64-static 放进fsroot,让 x86 主机能够在 chroot 里运行 ARM64 程序。(通过 binfmt_misc 自动调用 qemu-user-static 执行 ARM ELF)
bash 复制代码
sudo cp /bin/qemu-aarch64-static fsroot/usr/bin/

1-9 进入系统
  • 把 fsroot 变成"新的 /(根目录)",让你进入一个离线的 ARM Linux 系统环境中操作它。
bash 复制代码
sudo chroot fsroot/

1-10 检查与设置
  • 我们可以查询CPU架构和完整的系统信息来验证我们的系统:
bash 复制代码
arch
uname -a
  • 检查二进制文件是不是 ARM Linux 用户态程序
bash 复制代码
ldd /bin/bash
file /bin/ls

1-11 收尾工作(重要!!!)
  • 退出非常简单:
bash 复制代码
exit
  • 同时我们必须卸载虚拟文件系统
bash 复制代码
sudo umount -l fsroot/dev/pts
sudo umount -l fsroot/dev
sudo umount -l fsroot/proc
sudo umount -l fsroot/sys
# 如果你还 mount 了 boot 分区
# sudo umount fsroot/boot/config
  • 同时记得回环设备卸载(用之前可以用losetup -a确认你的设备id)
bash 复制代码
sudo losetup -d /dev/loop12
1-11-1 备注
  • 如果使用 mount 方式(fsroot 为挂载点),需要 umount fsrootrsync 模式不需要
bash 复制代码
umount fsroot
1-11-2 lazy卸载
  • lazy 卸载,仅用于无法正常卸载时的兜底方案
bash 复制代码
umount -l 

2 交叉编译

  • 在完成 fsroot + qemu + chroot配置后,我们获得了一个与 RDK X5 用户态 ABI 完全一致的 ARM64 rootfs 环境。在该环境中进行编译,可以最大程度避免因架构差异导致的依赖问题。
  • 需要注意的是,该环境仅模拟用户空间,并不包含真实设备的内核与硬件加速能力,因此主要用于:
    • 编译 ARM64 用户态程序
    • 构建依赖系统库的工程
    • 验证运行环境兼容性

2-1 scp
bash 复制代码
scp file root@rk:/path
  • 将本地文件通过 SSH 安全复制到远程设备
部分 含义
scp secure copy(基于 SSH)
file 本地要上传的文件
root@rk 远程用户名 + 主机
:/path 远程目标路径
  • 例子:把 app.bin 传到开发板
bash 复制代码
scp app.bin root@192.168.1.10:/home/root/

2-2 rsync(推荐)
bash 复制代码
rsync -avzP ./build/ root@rk:/home/root/app/
  • 高效同步本地目录到远程设备(支持增量更新)
参数 含义
-a archive 模式(递归 + 保留权限/时间/符号链接)
-v verbose,显示详细过程
-z 传输时压缩数据
-P 显示进度 + 支持断点续传
  • 关键注意点(非常重要):
    • 结尾的 / 很关键:./build/同步目录内容
    • rsync 只传"变化的部分"
  • 因此特别推荐使用rsync进行编译后产物的更新(增量更新的优势)
  • 例子:只同步新增/修改文件
bash 复制代码
rsync -avzP ./build/ root@192.168.1.10:/home/root/app/
2-3 对比
项目 scp rsync
速度 快(增量)
功能 单文件复制 目录同步
断点续传
工程推荐 超级推荐

2-4 测试
  • 进入chroot的环境中进行编译,可以看到速度明显提升

  • 这里推荐一个 btop用于现代化终端系统监控工具

bash 复制代码
sudo apt install mesa-utils btop
  • 使用
bash 复制代码
btop

总结

  • 本文基于 QEMU 的 RDK X5 ARM64 rootfs 镜像定制方法,搭建 chroot 跨架构开发环境,并通过 rsync 将编译产物同步至开发板进行部署验证。
  • 本文参考为嵌入式 Linux 开发板定制产品镜像,同时感谢此文作者对本文的配置支持。
  • 如有错误,欢迎指出!
  • 感谢观看!!!
相关推荐
iRayCheung2 小时前
virtualbox安装的ubuntu系统跑numpy报错
linux·ubuntu·numpy
Dlrb12112 小时前
Linux系统编程-信号量(线程同步机制)
linux·条件变量·互斥锁·信号量·线程同步
无限进步_2 小时前
Linux进程等待——wait、waitpid与僵尸进程
linux·运维·服务器·开发语言
2401_834636992 小时前
Linux集群技术-高可用与负载均衡实战解析
linux·运维·负载均衡
吠品2 小时前
处理 Python 类继承中那些变来变去的初始化参数
linux·前端·python
帅大大的架构之路2 小时前
linux上面的一些小知识点
linux·运维·服务器
光电笑映2 小时前
进程间通信:深入 System V IPC:共享内存、消息队列与信号量
linux·运维·服务器·c++
RisunJan2 小时前
Linux命令-patch (为开放源代码软件安装补丁程序)
linux·服务器·算法
皆圥忈3 小时前
_Linux文件系统与磁盘结构深度解析
linux