前言
-
近来在
RDKX5上尝试编译librealsense的时候出现了内存不足导致的编译失败,固有了本文尝试使用交叉编译去配置编译的想法
-
本文参考为嵌入式 Linux 开发板定制产品镜像,同时感谢此文作者对本文的配置支持。
-
本文基于
QEMU的RDK X5 ARM64 rootfs镜像定制方法,搭建chroot跨架构开发环境,并通过rsync将编译产物同步至开发板进行部署验证。
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来确定回环设备p1和p2分别对应的是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 rootfs与fsroot
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环境中,由于未启动systemd,systemd-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 fsroot,rsync模式不需要
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 开发板定制产品镜像,同时感谢此文作者对本文的配置支持。
- 如有错误,欢迎指出!
- 感谢观看!!!
