2. 开发环境搭建:Ubuntu虚拟机配置、交叉编译工具链安装、SDK源码获取与同步
做嵌入式Linux开发,环境搭建是第一道坎。很多新手上来就卡在这里——不是虚拟机网络不通,就是编译工具链版本不对,折腾一整天连个Hello World都跑不起来。我刚开始接触Rockchip平台时也踩过不少坑,今天就把这些经验梳理清楚,帮你一次性搞定。
本章核心目标:在Windows/Mac宿主机上搭建一套完整的Rockchip嵌入式Linux开发环境,包括Ubuntu虚拟机、交叉编译工具链、以及SDK源码管理。
2.1 为什么选择虚拟机方案?
你可能会问:为什么不直接在物理机上装Ubuntu?我个人习惯用虚拟机,原因有三:
- 隔离性好:开发环境与日常工作环境互不干扰,搞坏了直接恢复快照
- 可移植性强:换电脑时直接把虚拟机文件拷走,环境完全一致
- 快照功能:每次重大变更前打个快照,出问题秒回退
我在项目中遇到过好几次因为误操作导致环境崩溃的情况,多亏了虚拟机快照,十分钟就恢复了。嗯,这里要提醒一句:别偷懒,关键节点一定要打快照。
2.2 Ubuntu虚拟机配置详解
2.2.1 虚拟机软件选择
| 软件 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|
| VMware Workstation | 稳定、性能好、3D加速强 | 收费(有个人免费版) | 主力开发机 |
| VirtualBox | 免费开源、轻量 | 性能略逊、USB兼容性一般 | 入门学习、轻量使用 |
我个人推荐VMware Workstation Player(个人免费版),稳定性确实好。如果你预算有限,VirtualBox也完全够用。
2.2.2 虚拟机资源配置建议
Rockchip的SDK编译起来挺吃资源的。我建议的配置如下:
- CPU:至少4核,推荐8核(如果你的宿主机支持)
- 内存:至少8GB,推荐16GB
- 磁盘:至少120GB,推荐200GB以上(SDK解压后就有几十GB)
- 网络:NAT模式 + 端口转发,或者桥接模式
注意:磁盘一定要选「动态分配」,别选「固定大小」。我第一次装虚拟机时选了固定大小200GB,结果宿主机磁盘直接爆了。动态分配的话,用多少占多少,灵活得多。
2.2.3 Ubuntu系统安装
推荐使用 Ubuntu 20.04 LTS 或 22.04 LTS。Rockchip官方SDK对这两个版本支持最好。安装过程就不细说了,重点提几个关键点:
- 分区方案:建议单独分一个/home分区,方便以后重装系统时保留数据
- 软件源:安装完成后第一时间换国内源(阿里云、清华、中科大都可以)
- SSH服务:安装openssh-server,方便用终端工具远程连接
2.2.4 必备软件包安装
编译Rockchip SDK需要安装一堆依赖包。我整理了一个清单,直接复制粘贴执行就行:
sudo apt update
sudo apt install -y git repo wget curl \
build-essential cmake make gcc g++ \
libncurses5-dev libssl-dev libelf-dev \
python3 python3-pip python3-dev \
device-tree-compiler u-boot-tools \
bison flex texinfo gawk \
libsdl1.2-dev libgmp-dev libmpfr-dev \
libmpc-dev zlib1g-dev liblz4-tool \
unzip zip tar xz-utils
为什么要装这么多?说白了,SDK里包含了U-Boot、Linux内核、根文件系统、以及各种工具链,每个组件都有自己的依赖。我曾经因为少装了一个libssl-dev,编译内核时卡了半小时才找到原因。
2.3 交叉编译工具链安装
2.3.1 什么是交叉编译?
简单说,就是在你的x86电脑上编译出能在ARM芯片上运行的程序。你想想看,嵌入式设备性能有限,不可能在上面直接编译大型项目。所以我们需要一套交叉编译工具链。
2.3.2 获取工具链
Rockchip官方提供了预编译的交叉编译工具链,推荐使用 gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu 版本。获取方式:
# 下载工具链
wget https://developer.arm.com/-/media/Files/downloads/gnu-a/10.3-2021.07/binrel/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz
# 解压到指定目录
sudo tar -xf gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz \
-C /opt/
# 添加环境变量
echo 'export PATH=$PATH:/opt/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin' \
>> ~/.bashrc
source ~/.bashrc
2.3.3 验证工具链
安装完成后,验证一下是否生效:
aarch64-none-linux-gnu-gcc --version
如果能看到版本信息,说明安装成功。我们来写个简单的测试程序:
# 编写测试代码
cat > hello.c << EOF
#include <stdio.h>
int main() {
printf("Hello, Rockchip!\n");
return 0;
}
EOF
# 交叉编译
aarch64-none-linux-gnu-gcc -o hello hello.c
# 查看生成的文件类型
file hello
输出应该是:hello: ELF 64-bit LSB executable, ARM aarch64。看到这个就对了。
小技巧:我习惯把工具链路径加到/etc/environment里,这样所有用户都能用。另外,建议创建一个软链接,方便切换版本:sudo ln -s /opt/gcc-arm-10.3-2021.07 /opt/gcc-arm
2.4 SDK源码获取与同步
2.4.1 SDK结构概览
Rockchip的SDK采用repo管理,包含多个git仓库。整体结构如下:
2.4.2 获取SDK源码
Rockchip的SDK通常通过repo工具管理。获取步骤如下:
- 安装repo工具
mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
echo 'export PATH=$PATH:~/bin' >> ~/.bashrc
source ~/.bashrc
- 初始化SDK仓库
mkdir -p ~/rockchip_sdk
cd ~/rockchip_sdk
repo init -u https://github.com/rockchip-linux/manifests.git -b master
- 同步源码
repo sync -j4
注意:repo sync会下载几十GB的代码,耗时很长。我建议用-j4参数控制并发数,别开太高,否则容易网络超时。另外,最好在晚上或者网络空闲时执行,我第一次同步时白天跑,结果断断续续搞了三天。
2.4.3 分支管理技巧
SDK同步完成后,你会看到所有子仓库都处于master分支的某个提交上。实际开发时,我习惯这样管理:
| 场景 | 操作 | 说明 |
|---|---|---|
| 查看当前分支 | repo status |
显示所有子仓库的分支和修改状态 |
| 创建开发分支 | repo start <branch_name> --all |
在所有子仓库创建同名分支 |
| 同步最新代码 | repo sync |
拉取远程最新提交 |
| 丢弃本地修改 | repo forall -c 'git reset --hard' |
慎用!会丢失所有未提交的修改 |
为什么要用repo start?因为SDK有几十个仓库,如果手动在每个仓库里创建分支,效率太低。repo工具会自动在所有仓库里创建同名分支,方便统一管理。
2.4.4 常见问题与避坑
网络问题:如果repo sync经常中断,可以试试设置git代理:
git config --global http.proxy http://127.0.0.1:7890
git config --global https.proxy http://127.0.0.1:7890
同步完成后记得取消代理:git config --global --unset http.proxy
磁盘空间:SDK完整同步后大约占用30-50GB空间,编译过程中还会产生大量中间文件。我曾经在120GB的虚拟机上编译,结果磁盘爆满导致编译失败。建议至少预留80GB空闲空间。
2.5 环境验证
所有步骤完成后,我们来验证一下环境是否就绪:
# 1. 检查工具链
aarch64-none-linux-gnu-gcc --version
# 2. 检查SDK目录结构
ls ~/rockchip_sdk/
# 应该看到:u-boot/ kernel/ buildroot/ device/ external/ 等目录
# 3. 尝试编译一个简单模块
cd ~/rockchip_sdk/kernel
make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- defconfig
make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- -j4
如果内核能顺利编译通过,说明你的开发环境已经完全就绪了。
总结一下:本章我们完成了三件事——搭建了Ubuntu虚拟机、安装了交叉编译工具链、获取并同步了Rockchip SDK源码。这些是后续所有开发工作的基础。环境搭好了,后面的事情就顺了。