3. 开发环境搭建:Ubuntu虚拟机、工具链与Git管理

做嵌入式Linux开发,环境搭建是第一道坎。很多新手一上来就急着编译内核,结果被各种依赖问题搞得焦头烂额。我个人习惯是先把开发环境理清楚,后面才能专心搞移植。

这一章我们聚焦三件事:Ubuntu虚拟机安装、交叉编译工具链配置、Git版本管理。这三样搞定了,后续的内核配置、设备树编写、驱动开发才能顺利推进。

核心要点:开发环境不是“装好就行”,而是要可复现、可迁移。我建议你把这套环境配置过程写成脚本,换机器时一键搞定。

3.1 Ubuntu虚拟机安装与配置

为什么选虚拟机?因为瑞芯微平台开发经常要切换不同内核版本、不同工具链,虚拟机快照功能可以让你随时回退。我在项目中吃过亏——直接在物理机上装Ubuntu,结果一次误操作把系统搞崩了,重装花了大半天。

3.1.1 虚拟机软件选择

软件 优点 缺点 我的建议
VMware Workstation 稳定、快照功能强、3D加速好 收费(有个人免费版) 主力推荐,我用了8年
VirtualBox 免费开源、轻量 性能稍弱、USB透传偶尔出问题 预算有限时首选
QEMU 支持ARM架构模拟 配置复杂、速度慢 调试底层时用,日常不推荐

3.1.2 Ubuntu版本选择

瑞芯微官方SDK通常基于Ubuntu 18.04或20.04。我个人建议用Ubuntu 20.04 LTS,兼容性好,社区支持强。Ubuntu 22.04也能用,但有些老工具链的依赖库需要手动补。

小技巧:安装时选择“最小安装”,省掉LibreOffice等办公软件。嵌入式开发不需要这些,省下来的磁盘空间给内核源码。

3.1.3 虚拟机配置参数

这是我经过多次调试后总结的配置,适合瑞芯微平台开发:

  • CPU:至少4核,推荐8核(编译内核时差距明显)
  • 内存:8GB起步,16GB更佳(我遇到过内存不足导致编译崩溃的情况)
  • 磁盘:100GB动态分配,实际使用约60GB(SDK+内核源码+工具链)
  • 网络:NAT模式+端口转发(方便SSH连接)
  • USB:开启USB 3.0控制器(烧录固件时需要)

注意:磁盘不要选“立即分配所有空间”,动态分配更灵活。我曾经一次性分配200GB,结果后来想扩容反而麻烦。

3.2 交叉编译工具链安装

交叉编译是嵌入式开发的灵魂。说白了,就是在你的x86电脑上编译出能在ARM芯片上跑的程序。瑞芯微官方提供了预编译的工具链,我们直接拿来用就行。

3.2.1 工具链选择

瑞芯微平台主要用两种工具链:

工具链 适用平台 下载位置
gcc-arm-8.3-2019.03 RK3288、RK3399 ARM官网或瑞芯微SDK
gcc-arm-10.3-2021.07 RK3568、RK3588 ARM官网或瑞芯微SDK
Linaro GCC 通用ARM平台 Linaro官网

我个人习惯用gcc-arm-10.3-2021.07,兼容性好,对C++17支持完善。如果你做的是老平台移植,比如RK3288,那用8.3版本更稳妥。

3.2.2 安装步骤

安装过程其实很简单,但有几个坑要注意:

  1. 下载工具链:从ARM官网或瑞芯微SDK中获取
  2. 解压到指定目录:我习惯放在 /opt/toolchains/ 下
  3. 配置环境变量:编辑 ~/.bashrc 添加路径
  4. 验证安装:运行 arm-none-linux-gnueabihf-gcc --version
# 下载工具链(以10.3版本为例)
wget https://developer.arm.com/-/media/Files/downloads/gnu-a/10.3-2021.07/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf.tar.xz

# 解压到 /opt
sudo tar -xf gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf.tar.xz -C /opt/
sudo mv /opt/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf /opt/toolchains/

# 配置环境变量
echo 'export PATH=$PATH:/opt/toolchains/bin' >> ~/.bashrc
echo 'export CROSS_COMPILE=arm-none-linux-gnueabihf-' >> ~/.bashrc
source ~/.bashrc

# 验证
arm-none-linux-gnueabihf-gcc --version

避坑指南:我曾经直接把工具链解压到 /usr/local/,结果跟系统自带的gcc冲突了。建议统一放在 /opt/ 下,用环境变量管理。

3.2.3 构建工具安装

除了交叉编译器,还需要一些构建工具:

  • make:构建系统核心工具
  • cmake:用于一些第三方库的构建
  • autoconf/automake:老项目的构建工具
  • device-tree-compiler:设备树编译工具
  • u-boot-tools:U-Boot镜像制作工具
sudo apt-get update
sudo apt-get install -y \
    make cmake \
    autoconf automake libtool \
    device-tree-compiler \
    u-boot-tools \
    bison flex \
    libncurses-dev \
    libssl-dev \
    bc

经验之谈:libncurses-dev 和 libssl-dev 这两个包经常被忽略。没有它们,内核的menuconfig配置界面和模块签名功能会报错。我刚开始移植时在这上面卡了半小时。

3.3 Git版本管理

嵌入式Linux开发,版本管理不是可选项,而是必需品。你想想看,内核源码几万个文件,设备树、驱动、配置文件来回改,没有Git根本没法追溯。

3.3.1 Git配置

安装Git很简单,但配置要到位:

# 安装Git
sudo apt-get install git

# 配置用户信息(必须)
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"

# 推荐配置
git config --global core.editor "vim"
git config --global merge.tool "vimdiff"
git config --global color.ui true
git config --global core.autocrlf input

注意:core.autocrlf input 这个配置很重要。Windows和Linux的换行符不同,如果不设置,从Windows共享文件夹拷贝代码到虚拟机时,换行符会乱掉。我遇到过因为换行符问题导致内核编译报错,排查了半天。

3.3.2 工作流建议

瑞芯微平台开发,我推荐用这种分支策略:

分支 用途 说明
master 官方主线 只合并经过验证的代码
develop 日常开发 所有修改先合到这里
feature/xxx 新功能开发 比如 feature/rk3588-hdmi
fix/xxx Bug修复 比如 fix/ddr-timing

我个人习惯是:每个功能点开一个分支,开发完再合并到develop。这样出了问题可以快速回退,不会影响主线。

3.3.3 常用Git操作

这些命令在移植过程中会频繁用到:

# 克隆瑞芯微内核源码
git clone https://github.com/rockchip-linux/kernel.git

# 查看提交历史
git log --oneline -10

# 创建并切换分支
git checkout -b feature/rk3588-dsi

# 查看修改
git status
git diff

# 提交修改
git add .
git commit -m "dsi: add support for RK3588 DSI controller"

# 合并分支
git checkout develop
git merge feature/rk3588-dsi

# 打标签(发布版本时用)
git tag v5.10-rk3588-v1.0

小技巧:提交信息要写清楚。我见过太多“fix bug”、“update”这种提交,回头看根本不知道改了啥。建议格式:[模块]: [具体修改],比如 drm: fix HDMI hotplug detection on RK3588。

3.4 环境验证

装完所有工具后,建议做一次完整验证。这是我常用的验证脚本:

#!/bin/bash
# 环境验证脚本

echo "=== 检查交叉编译器 ==="
arm-none-linux-gnueabihf-gcc --version
if [ $? -ne 0 ]; then
    echo "❌ 交叉编译器未安装"
    exit 1
fi

echo "=== 检查构建工具 ==="
make --version | head -1
cmake --version | head -1
dtc --version

echo "=== 检查Git ==="
git --version

echo "=== 编译测试程序 ==="
cat > test.c << EOF
#include <stdio.h>
int main() {
    printf("Hello, RK3588!\n");
    return 0;
}
EOF

arm-none-linux-gnueabihf-gcc -o test test.c
file test
echo "✅ 环境搭建完成!"

核心思路:环境搭建不是一次性工作。每次换机器、换项目,都要重新走一遍这个流程。我建议你把安装步骤写成脚本,放到Git仓库里管理,这样团队新成员也能快速上手。

开发环境搭建知识体系 Ubuntu虚拟机 交叉编译工具链 Git版本管理 VMware/VBox Ubuntu 20.04 4核/8GB/100GB gcc-arm-10.3 环境变量 make/cmake/dtc 分支策略 提交规范 标签管理 核心目标:可复现、可迁移的开发环境 建议将安装步骤写成脚本,放入Git仓库管理 环境验证 → 编译测试程序 ✅ 环境搭建完成

这张图把整个开发环境搭建的知识体系串起来了。从虚拟机配置到工具链安装,再到Git管理,最后通过验证脚本闭环。你照着这个流程走一遍,基本不会出大问题。

最后说一句:环境搭建看似繁琐,但这是整个移植工作的地基。地基打牢了,后面编译内核、调试驱动才能顺风顺水。别嫌麻烦,一步到位比反复折腾要省时间。