瑞莎Cubie A7A 移植 Ubuntu 22.04 操作指南
目标:在 Cubie A7A(全志 A733)上跑 Ubuntu 22.04(Jammy)arm64,使其能够直接
apt install ros-humble-*,与香橙派 5 Pro 开发环境对齐。总体思路:用瑞莎官方构建系统编译 U-Boot 和 Kernel(底层),用 debootstrap 构建 Ubuntu 22.04 rootfs(上层),两者组装后烧录到 TF 卡。这样内核和设备树完全可控,用户态与香橙派 5 Pro 一致。
前置条件:一台 Windows 电脑(安装 VMware Workstation 或 VirtualBox),在虚拟机中运行 Ubuntu 22.04。虚拟机需分配 4 核以上 CPU、16GB 内存、至少 80GB 虚拟磁盘空间。一张至少 16GB 的 TF 卡 + 读卡器。
先理解整体思路:你在做什么?
如果你是第一次接触开发板的系统移植,下面的解释能帮你建立整体认知,不至于被后面密密麻麻的命令吓到。
为什么这件事这么复杂?
普通电脑重装系统很简单——下载 Ubuntu 的 ISO 镜像,用 U 盘启动,点几下鼠标就装好了。因为 Ubuntu 官方已经为 x86 架构的电脑做好了完整的安装包。
但 Cubie A7A 用的是 ARM 架构的芯片(全志 A733),Ubuntu 官方没有为这块板子做安装包。所以你需要自己组装一个系统。
一个系统由哪几块积木组成?
| 积木 | 通俗解释 | 电脑类比 | 本指南产出 |
|---|---|---|---|
| U-Boot | 开机引导程序,板子通电后最先跑的东西 | 电脑的 BIOS / UEFI | 第一步编译产出 u-boot-sunxi-with-spl.bin |
| Linux 内核(kernel) | 操作系统的核心,负责管理硬件(CPU、内存、USB、网卡等) | 汽车的发动机 | 第一步编译产出 Image + 设备树 .dtb + 内核模块 |
| Rootfs(根文件系统) | 你实际使用的系统——命令行、软件包、配置文件都在里面 | 汽车的车身和内饰 | 第二步构建产出 ubuntu-rootfs/ 目录 |
三步流程一句话概括
- 第一步:在虚拟机的 Ubuntu 22.04 里,用瑞莎提供的工具编译出 U-Boot 和内核
- 第二步:在同一台虚拟机里,从 Ubuntu 软件仓库下载一套纯净的 Ubuntu 22.04 系统文件
- 第三步:把这三块积木组装到一张 TF 卡上,插到 Cubie A7A 里通电启动
你不需要完全理解每一步的每个命令——就像你不需要理解发动机的每个零件也能开车。关键是理解整体在做什么:你在给一块没有官方 Ubuntu 支持的开发板,手动组装一个可用的 Ubuntu 系统。后面每一步的命令都附有注释,让你知道每行在干什么。
第零步:在 Windows 上搭建虚拟机环境
整个移植流程需要 Linux 环境——交叉编译内核、制作 rootfs 都依赖 Linux 工具链。如果你用的是 Windows,先花半小时搭好虚拟机,后面三步在里面完成。
0.1 选择虚拟机软件
| 软件 | 费用 | 推荐理由 |
|---|---|---|
| VMware Workstation Pro(推荐) | 个人免费 | 性能好、USB 透传稳定(TF 卡读写需要)、快照功能方便回滚 |
| VirtualBox | 免费 | 开源,但 USB 3.0 支持不如 VMware,TF 卡读写偶尔掉速 |
以下以 VMware Workstation Pro 为例。如果你选 VirtualBox,安装 Ubuntu 的流程类似,只是界面不同。
0.2 下载 Ubuntu 22.04 ISO
从 Ubuntu 官网下载桌面版 ISO(约 4.7 GB):
https://releases.ubuntu.com/jammy/ubuntu-22.04.5-desktop-amd64.iso
选桌面版而非 Server 版——因为后面要在虚拟机里跑 VS Code + Dev Containers,桌面环境更方便。
0.3 创建虚拟机
打开 VMware,点击「创建新的虚拟机」,按以下参数配置:
| 配置项 | 建议值 | 说明 |
|---|---|---|
| 操作系统 | Linux → Ubuntu 64-bit | |
| 虚拟磁盘大小 | 至少 80 GB | 30 GB 编译产物 + 20 GB Ubuntu 系统 + 30 GB 余量 |
| 磁盘模式 | 拆分为多个文件 | 按需增长,不一次性占满物理硬盘 |
| CPU 核心数 | 至少 4 核 | 内核编译是 CPU 密集型,核越多越快 |
| 内存 | 至少 8 GB,建议 16 GB | 内核编译并行时内存消耗大,8 GB 勉强够,16 GB 从容 |
关于 80 GB 虚拟磁盘:30 GB 是之前预估的编译产物和 rootfs 空间需求。但虚拟机里还要装 Ubuntu 22.04 桌面系统本身(约 15-20 GB)、VS Code、Docker 镜像等,再加上操作余量,80 GB 比较稳妥。如果你物理硬盘充裕,直接给 120 GB 更省心。
0.4 安装 Ubuntu 22.04
将下载好的 ISO 挂载到虚拟机的虚拟光驱,启动虚拟机。安装过程选「最小安装」(不装 LibreOffice 等办公软件,省空间),其余默认即可。
安装完成后,在虚拟机里打开终端,先更新系统:
sudo apt update && sudo apt upgrade -y
0.5 配置共享文件夹(方便和 Windows 交换文件)
编译产物最终要复制到 TF 卡。你可以:
- 方案 A(推荐):在虚拟机设置中启用「共享文件夹」,把 Windows 上的某个目录映射到虚拟机里。这样编译产物可以直接拖到共享文件夹,再在 Windows 上用 Rufus 烧录 TF 卡。
- 方案 B:在虚拟机里直接操作 TF 卡(通过 USB 透传)。VMware 的 USB 透传很稳定,插上读卡器后虚拟机会自动识别。分区、格式化、写入全部在虚拟机里完成。
两种方案都可以,方案 B 少一步文件搬运,方案 A 的烧录工具(Rufus)在 Windows 上更顺手。建议先用方案 B 试试——如果虚拟机里 TF 卡读写正常,就一直用它;如果不稳定,切方案 A。
0.6 拍快照
虚拟机装好后,在 VMware 里拍一个快照。后面如果编译环境搞坏了、rootfs 配置错了,一键回滚到干净状态,不用重装系统。
开始前必读:磁盘空间和编译时间预估
移植过程中有两个环节特别吃资源——磁盘空间和 CPU 时间。提前了解,避免做到一半发现硬盘满了或者以为卡死了。
磁盘空间消耗分布
| 环节 | 占用空间 | 说明 |
|---|---|---|
| Docker 镜像拉取 | ~5-10 GB | 首次启动 Dev Container 时拉取,含交叉编译工具链和依赖 |
| 内核源码 + 编译中间产物 | ~3-5 GB | .o 文件、中间产物,编译完可以清理 |
| U-Boot 源码 + 编译中间产物 | ~500 MB | 相对较小 |
| rootfs 构建(ubuntu-base + 安装软件) | ~2-4 GB | 取决于装了哪些包,基础系统约 1.5 GB |
| TF 卡镜像打包(可选) | 与 rootfs 大小相当 | 如果打包成 .img 文件再烧录 |
| 总计(建议预留) | 至少 30 GB 空闲空间 | 含编译产物、rootfs、TF 卡操作缓冲区 |
磁盘空间大头在 Docker 镜像和内核编译中间产物。 如果你硬盘紧张,编译完成后可以删除内核源码目录中的 .o 文件(make clean),能回收 3-5 GB。
编译时间消耗分布
以下估算基于一台中等配置的虚拟机(8 核 16GB 内存,SSD):
| 环节 | 预计耗时 | 说明 |
|---|---|---|
| Docker 镜像首次拉取 | 10-30 分钟 | 取决于网速,只拉一次 |
| 编译 U-Boot | 2-5 分钟 | 代码量小,很快 |
| 编译内核(全量) | 20-60 分钟 | 占大头,取决于 CPU 核数和内核配置 |
| debootstrap 下载 rootfs | 5-15 分钟 | 取决于网速,约 300-500 MB 下载量 |
| rootfs 内安装软件包 | 10-30 分钟 | 如果装桌面环境(ubuntu-desktop)会更久 |
| TF 卡写入 | 5-15 分钟 | 取决于 TF 卡写入速度和 rootfs 大小 |
| 总计(首次完整走通) | 1-3 小时 | 不含踩坑调试时间 |
编译时间的大头是内核编译。 后续如果只改内核配置重新编译,增量编译只需 5-15 分钟。如果只改 rootfs(比如加装软件包),内核和 U-Boot 不需要重新编译,几分钟就能搞定。
为什么内核编译最吃资源?
内核源码有几千万行代码,编译时要处理上万个 .c 文件,每个文件生成一个 .o 中间产物。这些 .o 文件加起来有 3-5 GB,编译过程中 CPU 几乎全程满载。你在泰山派那篇教程里看到作者说"首次编译约 3 小时"——那就是内核编译加上 SDK 其他组件的时间。
和泰山派教程的对比
你之前看的那篇泰山派教程,时间花在什么地方?
| 泰山派教程的耗时环节 | 对应本指南 |
|---|---|
| 下载泰山派 SDK(百度网盘,数 GB) | 瑞莎构建仓库 git clone(~1 GB) |
| 替换内核源码(Joshua Riek 的 linux-rockchip) | 瑞莎构建系统自带内核源码,无需替换 |
| 交叉编译内核 + 模块 | 完全一样 |
| chroot 装 ubuntu-desktop(极耗时) | 本指南只装基础系统,如果不需要桌面可跳过 |
| 打包 rootfs.img + 烧录 | 本指南直接写入 TF 卡,更简单 |
本指南比泰山派教程更精简的地方:不需要从百度网盘下载 SDK、不需要手动替换内核源码、不需要打包 .img 文件(直接写 TF 卡)、默认不装桌面环境。整体耗时比泰山派教程少 30-50%。
第一步:搭建瑞莎构建系统,编译 U-Boot 和 Kernel
这一步的目标是产出两块积木——U-Boot 和内核。瑞莎为 Cubie A7A 提供了完整的 Dev Container 构建环境,封装了交叉编译工具链,你不需要手动安装 ARM 编译器。参考文档:环境搭建。
1.1 安装 Docker
Docker 是一个容器工具,瑞莎的构建环境就运行在 Docker 容器里。下面的命令安装 Docker 并把你的用户加入 docker 组(这样执行 docker 命令不需要每次加 sudo):
# 更新软件包列表并安装 curl(下载工具)
sudo apt update && sudo apt install curl -y
# 下载 Docker 官方安装脚本并执行
sudo curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
# 把你的用户加入 docker 组,避免每次都要 sudo
sudo usermod -aG docker $USER
重启系统使 Docker 组权限生效。验证:
docker --version
docker ps # 不需要 sudo 即为正常
1.2 安装 VS Code + Dev Containers 插件
VS Code 是代码编辑器,Dev Containers 插件让它能连接到 Docker 容器里工作。瑞莎的构建环境就是通过这个插件自动启动的:
从 VS Code 下载页面 下载 deb 包并安装:
# 安装下载好的 VS Code deb 包
sudo apt install ./code_*_amd64.deb
打开 VS Code,在左侧 Extensions(扩展)中搜索并安装 Dev Containers 插件。
1.3 克隆瑞莎 Cubie A7A 构建仓库
# 把瑞莎的构建代码下载到本地
git clone https://github.com/radxa-build/radxa-cubie-a7a.git
cd radxa-cubie-a7a
1.4 启动 Dev Container
在 VS Code 中打开 radxa-cubie-a7a 目录。VS Code 检测到 .devcontainer 配置后,会弹出提示 "Reopen in Container",点击确认。
首次启动时,Docker 会自动拉取容器镜像并安装交叉编译工具链,需要下载数 GB 数据,请预留充足时间和磁盘空间。如果拉取失败,检查网络是否能访问 Docker Hub,必要时配置镜像加速。
1.5 编译 U-Boot
U-Boot 是板子通电后第一个运行的程序,它负责初始化硬件、找到内核、把控制权交给内核。下面的命令在容器里编译它:
容器启动后,在 VS Code 终端中执行:
# 进入 U-Boot 源码目录
cd u-boot
# 加载 Cubie A7A 的默认配置
make radxa-cubie-a7a_defconfig
# 编译(-j$(nproc) 表示用所有 CPU 核心并行编译,加快速度)
make -j$(nproc)
编译产物中需要关注的文件:
| 文件 | 用途 |
|---|---|
u-boot-sunxi-with-spl.bin | 完整的 U-Boot + SPL 镜像,需烧录到 TF 卡前部(8KB 偏移处) |
1.6 编译 Kernel
内核是操作系统的核心引擎,负责管理 CPU、内存、USB、网卡等所有硬件。编译时你可以根据需要调整配置——比如开启 PREEMPT 抢占模式,对 ROS2 实时性有帮助:
# 进入内核源码目录
cd ../linux
# 加载 Cubie A7A 的默认内核配置
make radxa-cubie-a7a_defconfig
# (可选)如果你需要调整内核配置,取消下面这行的注释
# make menuconfig
# 建议关注:
# General setup → Preemption Model → Preemptible Kernel (Low-Latency Desktop)
# 这个选项让内核更频繁地切换任务,降低延迟,对 ROS2 实时控制有帮助
# 同时确认 USB、网卡、ext4/vfat 文件系统等驱动已启用
# 编译内核
make -j$(nproc)
编译产物中需要关注的文件:
| 文件 | 用途 |
|---|---|
arch/arm64/boot/Image | 内核镜像 |
arch/arm64/boot/dts/allwinner/sun55i-t527-radxa-cubie-a7a.dtb | 设备树文件(具体文件名以实际编译产出为准) |
内核模块目录(/lib/modules/<version>/) | 安装内核模块时需要 |
1.7 保存编译产物
编译完后,需要把产出文件收集起来,后面组装 TF 卡时用:
# 在容器内创建一个临时目录,存放所有编译产物
mkdir -p /tmp/kernel-artifacts
# 复制内核镜像(这是系统启动时加载的核心文件)
cp arch/arm64/boot/Image /tmp/kernel-artifacts/
# 复制设备树文件(描述板子的硬件配置——有哪些外设、引脚怎么连)
cp arch/arm64/boot/dts/allwinner/*.dtb /tmp/kernel-artifacts/
# 安装内核模块(驱动程序集合,比如网卡驱动、USB 驱动)
make modules_install INSTALL_MOD_PATH=/tmp/kernel-artifacts
然后从宿主机将编译产物复制出来(Dev Container 的工作目录默认映射到宿主机,具体路径以实际挂载为准)。
第二步:在虚拟机里构建 Ubuntu 22.04 的"车身"
这一步的目标是产出第三块积木——rootfs,也就是你实际使用的 Ubuntu 系统文件。我们用 debootstrap 这个工具,从 Ubuntu 的软件仓库直接下载一套纯净的 arm64 版 Ubuntu 22.04。
因为你的虚拟机是 x86 架构,而目标系统是 arm64,所以中间需要借助 qemu-aarch64-static 来"模拟"arm64 环境完成系统配置。
2.1 安装依赖
# 更新软件包列表
sudo apt update
# debootstrap:从软件仓库下载完整系统
# qemu-user-static:让 x86 虚拟机模拟运行 arm64 程序
sudo apt install debootstrap qemu-user-static
2.2 用 debootstrap 下载 Ubuntu 22.04 基础系统
# 创建工作目录(所有和移植相关的文件都放这里)
mkdir -p ~/cubie_a7a_ubuntu && cd ~/cubie_a7a_ubuntu
# 第一阶段:从 Ubuntu 软件仓库下载 arm64 版的基础系统文件
# --arch=arm64:目标架构是 arm64
# --foreign:先只下载不解包配置(因为当前 x86 机器无法直接运行 arm64 程序)
# jammy:Ubuntu 22.04 的代号
# ubuntu-rootfs:存放系统文件的目录名
sudo debootstrap --arch=arm64 --foreign jammy ubuntu-rootfs http://ports.ubuntu.com/ubuntu-ports/
2.3 借助 qemu 完成第二阶段配置
# 把 qemu 的 arm64 模拟器复制到 rootfs 里
# 这样 chroot 进去后,arm64 程序就能在 x86 虚拟机上"假装"运行了
sudo cp /usr/bin/qemu-aarch64-static ubuntu-rootfs/usr/bin/
# chroot 进入 rootfs(相当于"假装"自己已经在 arm64 板子上了)
# 执行 debootstrap 的第二阶段——解包、配置所有软件包
sudo chroot ubuntu-rootfs /bin/bash -c "
/debootstrap/debootstrap --second-stage
"
2.4 基础系统配置
给这个"裸系统"装上必要的东西——用户名、密码、网络、SSH 等,让它变成一个真正可用的系统:
sudo chroot ubuntu-rootfs /bin/bash -c "
# 设置主机名(板子在网络上的名字)
echo 'cubie-a7a' > /etc/hostname
# 配置 apt 软件源(告诉系统从哪里下载软件包)
cat > /etc/apt/sources.list << 'EOF'
deb http://ports.ubuntu.com/ubuntu-ports/ jammy main restricted universe multiverse
deb http://ports.ubuntu.com/ubuntu-ports/ jammy-updates main restricted universe multiverse
deb http://ports.ubuntu.com/ubuntu-ports/ jammy-security main restricted universe multiverse
EOF
# 更新软件包列表,安装基础工具
apt update
# vim:文本编辑器 net-tools:网络工具 network-manager:网络管理
# systemd-resolved:DNS 解析 openssh-server:远程登录 avahi-daemon:设备发现
apt install -y sudo vim net-tools network-manager systemd-resolved \
openssh-server avahi-daemon locales
# 设置系统语言为英文(避免中文乱码问题)
locale-gen en_US.UTF-8
update-locale LANG=en_US.UTF-8
# 创建用户 ubuntu(和香橙派 5 Pro 保持一致,方便脚本复用)
useradd -m -s /bin/bash ubuntu
echo 'ubuntu:ubuntu' | chpasswd
usermod -aG sudo ubuntu
# 设置 root 密码(调试阶段用)
echo 'root:root' | chpasswd
"
2.5 配置网络
让板子启动后能自动联网、能被 SSH 远程登录:
sudo chroot ubuntu-rootfs /bin/bash -c "
# 启用网络管理服务(开机自动启动)
systemctl enable systemd-networkd
systemctl enable systemd-resolved
# 配置以太网自动获取 IP(DHCP)
cat > /etc/systemd/network/20-eth0.network << 'EOF'
[Match]
Name=eth0
[Network]
DHCP=yes
EOF
# 允许 root 通过 SSH 登录(调试阶段用,正式使用记得关掉)
sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
"
2.6 安装内核模块
把第一步编译出来的内核模块(驱动程序)复制到 rootfs 里。内核和模块必须版本一致,否则启动后很多硬件无法工作:
# 假设第一步的编译产物已复制到 ~/cubie_a7a_ubuntu/kernel-artifacts/
# 把内核模块复制到 rootfs 的 /lib/modules/ 目录
sudo cp -r ~/cubie_a7a_ubuntu/kernel-artifacts/lib/modules/* \
~/cubie_a7a_ubuntu/ubuntu-rootfs/lib/modules/
2.7 清理并退出
# 移除 qemu 模拟器——rootfs 最终要在真实的 arm64 硬件上运行,不需要它了
sudo rm -f ~/cubie_a7a_ubuntu/ubuntu-rootfs/usr/bin/qemu-aarch64-static
echo "rootfs 构建完成,位于: ~/cubie_a7a_ubuntu/ubuntu-rootfs/"
第三步:组装三块积木,烧录到 TF 卡
前两步产出了三样东西——U-Boot、内核、rootfs。这一步把它们拼到一起,写入 TF 卡。插到 Cubie A7A 上通电就能启动。
3.1 给 TF 卡分区
TF 卡需要分成两个区域:一个放内核(boot 分区),一个放系统文件(root 分区)。先把 TF 卡通过读卡器插入电脑,在虚拟机里用 lsblk 确认设备名。务必确认正确,选错会覆盖系统盘:
# 列出所有磁盘设备,找到 TF 卡(根据容量判断)
lsblk
# 假设 TF 卡是 /dev/sdb
# 用 fdisk 给 TF 卡分区
sudo fdisk /dev/sdX
# 在 fdisk 中依次输入以下命令:
# g → 创建 GPT 分区表(现代分区格式)
# n → 1 → <回车> → +256M → 第一个分区,256MB,放内核
# n → 2 → <回车> → <回车> → 第二个分区,剩余全部空间,放系统文件
# w → 写入分区表并退出
# 格式化两个分区
# boot 分区用 FAT32 格式(U-Boot 能识别的格式)
sudo mkfs.vfat -F 32 /dev/sdX1
# root 分区用 ext4 格式(Linux 原生文件系统)
sudo mkfs.ext4 -L rootfs /dev/sdX2
3.2 烧录 U-Boot(第一块积木)
U-Boot 比较特殊——它不是普通文件,必须写入 TF 卡最前部、分区表之前的"裸区域"。板子通电后,芯片会直接从这里读取并执行:
# 把 U-Boot 写入 TF 卡前部
# seek=8:跳过前 8KB(留给分区表),从第 8KB 处开始写入
sudo dd if=~/cubie_a7a_ubuntu/u-boot-sunxi-with-spl.bin of=/dev/sdX bs=1024 seek=8 conv=sync
注意:
of=/dev/sdX是整张卡(不是/dev/sdX1),因为 U-Boot 不放在任何分区里。
3.3 复制内核和系统文件到 TF 卡(第二、三块积木)
# 创建临时目录用于挂载 TF 卡的两个分区
mkdir -p ~/cubie_a7a_ubuntu/tf_boot
mkdir -p ~/cubie_a7a_ubuntu/tf_root
# 挂载分区——让 TF 卡的分区变成你电脑上的文件夹
sudo mount /dev/sdX2 ~/cubie_a7a_ubuntu/tf_root # root 分区
sudo mount /dev/sdX1 ~/cubie_a7a_ubuntu/tf_boot # boot 分区
# 把整个 Ubuntu 系统复制到 root 分区
sudo cp -a ~/cubie_a7a_ubuntu/ubuntu-rootfs/* ~/cubie_a7a_ubuntu/tf_root/
# 把内核镜像和设备树复制到 boot 分区
sudo cp ~/cubie_a7a_ubuntu/kernel-artifacts/Image ~/cubie_a7a_ubuntu/tf_boot/
sudo cp ~/cubie_a7a_ubuntu/kernel-artifacts/*.dtb ~/cubie_a7a_ubuntu/tf_boot/
3.4 配置启动参数(告诉 U-Boot 怎么启动内核)
U-Boot 启动后需要知道:内核文件在哪、设备树文件在哪、系统分区在哪。这些信息写在 extlinux.conf 里:
# 创建 extlinux 配置目录
sudo mkdir -p ~/cubie_a7a_ubuntu/tf_boot/extlinux
# 写入启动配置文件
sudo tee ~/cubie_a7a_ubuntu/tf_boot/extlinux/extlinux.conf > /dev/null << 'EOF'
TIMEOUT 30
DEFAULT ubuntu
LABEL ubuntu
LINUX /Image
FDT /sun55i-t527-radxa-cubie-a7a.dtb
APPEND root=/dev/mmcblk0p2 rootwait rw console=ttyS0,115200 earlycon
EOF
各行的含义:
LINUX /Image:告诉 U-Boot 内核文件叫Image,在 boot 分区根目录FDT /sun55i-t527-radxa-cubie-a7a.dtb:设备树文件名(以第一步实际编译产出的.dtb为准)。设备树描述了板子的硬件配置——有哪些外设、引脚怎么连、驱动怎么匹配APPEND root=/dev/mmcblk0p2:系统文件在 TF 卡的第二个分区。mmcblk0是 TF 卡在 Cubie A7A 上的设备名,p2是第二个分区console=ttyS0,115200:开启串口输出,方便调试(波特率 115200)earlycon:让内核从启动的最早阶段就开始往串口打印信息,出问题时能看到卡在哪一步
如果第一步编译时在内核配置中看到了全志平台特定的启动参数(如
clk_ignore_unused、pd_ignore_unused),也一并加入APPEND行。
3.5 配置 fstab(告诉系统开机后自动挂载分区)
# fstab 是"文件系统挂载表",告诉 Linux 启动后自动把 TF 卡的两个分区挂载到对应目录
sudo tee ~/cubie_a7a_ubuntu/tf_root/etc/fstab > /dev/null << 'EOF'
# root 分区 → 挂载到 /(根目录)
/dev/mmcblk0p2 / ext4 defaults,noatime 0 1
# boot 分区 → 挂载到 /boot(方便以后更新内核)
/dev/mmcblk0p1 /boot vfat defaults,noatime 0 2
EOF
3.6 卸载 TF 卡,完成
# 卸载两个分区(确保所有数据已写入)
sudo umount ~/cubie_a7a_ubuntu/tf_boot
sudo umount ~/cubie_a7a_ubuntu/tf_root
echo "烧录完成!把 TF 卡插入 Cubie A7A,上电启动。"
启动调试
将 TF 卡插入 Cubie A7A,连接调试串口(波特率 115200),上电启动。
首次启动可能遇到的问题及排查方向:
| 现象 | 可能原因 | 排查方向 |
|---|---|---|
| 上电后串口完全无输出 | U-Boot 未正确烧录 | 检查 dd 命令的 seek=8 偏移是否正确;确认 u-boot-sunxi-with-spl.bin 文件完整 |
| U-Boot 启动但找不到内核 | extlinux.conf 路径不对 | 确认 boot 分区中 Image 和 dtb 文件路径与 extlinux.conf 中配置一致 |
| 内核 panic,root 挂载失败 | root 分区路径不对 | 检查 extlinux.conf 中 root= 参数,可能需要改为 root=PARTUUID=... |
| 内核启动但 systemd 服务大量失败 | 内核模块版本与内核不匹配 | 确认内核模块是从同一次编译产出的,uname -r 与 /lib/modules/ 目录名一致 |
| 网络不通 | 网卡设备名不匹配 | ip link 查看实际网卡名,修改 /etc/systemd/network/20-eth0.network 中的 Name= 字段 |
| SSH 连不上 | SSH 服务未启动或网络不通 | 串口登录后执行 systemctl status ssh,检查网卡是否获取到 IP |
后续步骤
完成前三步并成功启动后:
- 第四步(验证基础功能):网络连通性、SSH 登录、CPU 频率调节、存储读写性能
- 第五步(安装 ROS2 Humble):添加 ROS2 apt 仓库,
apt install ros-humble-ros-base,跑通 talker/listener - 第六步(GPU 和 NPU 驱动适配):GPU 驱动需确认 Ubuntu 22.04 的 mesa 版本是否支持 IMG BXE-2-32;NPU 用户态库需验证与 glibc 2.35 的兼容性
评论区