第二章:开发环境搭建——Ubuntu系统安装、交叉编译工具链配置、TFTP/NFS服务搭建
做嵌入式Linux开发,第一步就是把“窝”搭好。我见过太多新手,一上来就急着写驱动,结果环境没配好,编译报错折腾一整天。说实话,环境搭建这事儿,你花半天时间认真搞,后面能省下无数个“为什么我的代码跑不起来”的夜晚。
这一章,我们就来搞定三件事:Ubuntu系统安装、交叉编译工具链配置、TFTP/NFS服务搭建。这三样东西,说白了就是你开发路上的“水电煤”。
2.1 Ubuntu系统安装——选对版本,少走弯路
我个人习惯用Ubuntu 20.04 LTS。为什么?因为瑞芯微官方SDK大部分都是基于这个版本验证的。你非要用22.04或者Debian,也不是不行,但可能会遇到一些库版本不兼容的问题。我在项目中就吃过这个亏——用Ubuntu 22.04编译RK3588的SDK,结果Python版本太高,某些脚本跑不起来,折腾了两天才找到原因。
安装方式有两种:
- 物理机安装:性能最好,适合长期开发。建议至少分配100GB磁盘空间,8GB以上内存。
- 虚拟机安装:用VMware或VirtualBox,适合初学者。我给个建议:虚拟机磁盘用动态分配,内存给4GB以上,CPU核心数给2个以上。
安装完成后,第一件事就是换源。国内用默认源下载包太慢了。我一般用清华源或阿里源:
# 备份原源
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
# 替换为清华源(Ubuntu 20.04)
sudo sed -i 's/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list
sudo sed -i 's/security.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list
# 更新
sudo apt update
sudo apt upgrade -y
然后安装一些基础工具,这些后面都会用到:
sudo apt install -y build-essential git vim curl wget \
net-tools openssh-server nfs-kernel-server tftpd-hpa \
python3 python3-pip
2.2 交叉编译工具链配置——让PC编译ARM代码
交叉编译,说白了就是在x86的电脑上编译出能在ARM芯片上跑的程序。你想想看,你的开发板跑的是ARM架构,而你的电脑是x86架构,不用交叉编译,难道你还想在开发板上编译驱动?那速度能急死人。
瑞芯微官方提供了两种工具链:
| 工具链类型 | 适用芯片 | 下载方式 |
|---|---|---|
| gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf | RK3288、RK3399等32位芯片 | ARM官网或SDK中获取 |
| gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu | RK3568、RK3588等64位芯片 | ARM官网或SDK中获取 |
安装步骤其实很简单:
- 下载工具链压缩包,解压到
/opt/目录下 - 配置环境变量,让系统能找到交叉编译器
- 验证安装是否成功
具体操作:
# 以64位工具链为例
sudo mkdir -p /opt/toolchains
sudo tar -xvf gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz \
-C /opt/toolchains/
# 配置环境变量(写入 ~/.bashrc)
echo 'export PATH=$PATH:/opt/toolchains/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin' >> ~/.bashrc
source ~/.bashrc
# 验证
aarch64-none-linux-gnu-gcc --version
chmod +x * 搞定。
验证通过后,写个简单的Hello World测试一下:
# 创建测试文件
echo '#include <stdio.h>
int main() {
printf("Hello, RK3588!\n");
return 0;
}' > hello.c
# 交叉编译
aarch64-none-linux-gnu-gcc -o hello hello.c
# 查看生成的文件类型
file hello
# 输出应该是:ELF 64-bit LSB executable, ARM aarch64, ...
看到“ARM aarch64”字样,说明交叉编译成功了。这个文件在x86电脑上跑不了,得放到开发板上才能执行。
2.3 TFTP服务搭建——网络传输内核和DTB
TFTP,简单文件传输协议。在嵌入式开发中,我们经常用它来通过网络把内核镜像(zImage/Image)和设备树文件(.dtb)传到开发板。为什么不用U盘?因为调试阶段要频繁修改内核,用TFTP传,改完代码编译一下,重启开发板就能加载新内核,效率高得多。
安装和配置:
# 安装TFTP服务器
sudo apt install -y tftpd-hpa
# 修改配置文件
sudo vim /etc/default/tftpd-hpa
配置文件内容如下:
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/tftpboot" # 这是TFTP的根目录
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="-l -c -s"
然后创建目录并设置权限:
sudo mkdir -p /tftpboot
sudo chmod 777 /tftpboot
sudo systemctl restart tftpd-hpa
sudo systemctl enable tftpd-hpa
sudo ufw disable。或者确认69端口是开放的。
测试TFTP是否正常工作:
# 在/tftpboot下放一个测试文件
echo "test" > /tftpboot/test.txt
# 用tftp客户端测试(本地测试)
tftp localhost
tftp> get test.txt
tftp> quit
# 查看是否下载成功
cat test.txt
如果能看到“test”字样,说明TFTP服务正常。后面在U-Boot中,就可以用 tftp 0x02000000 zImage 这样的命令来加载内核了。
2.4 NFS服务搭建——共享根文件系统
NFS,网络文件系统。它的作用比TFTP更强大——让开发板通过网络挂载PC上的目录,当成自己的文件系统来用。你想想看,开发板启动后,根文件系统直接来自你的电脑,你在电脑上修改文件,开发板立刻就能看到。调试应用程序时,这简直是神器。
安装和配置:
# 安装NFS服务器
sudo apt install -y nfs-kernel-server
# 创建共享目录
sudo mkdir -p /nfsroot
sudo chmod 777 /nfsroot
# 配置导出文件
sudo vim /etc/exports
在 /etc/exports 中添加:
/nfsroot *(rw,sync,no_subtree_check,no_root_squash)
参数说明:
rw:读写权限sync:同步写入,保证数据一致性no_subtree_check:禁用子树检查,提高性能no_root_squash:允许开发板以root身份访问,这个很重要!
然后重启服务:
sudo exportfs -a
sudo systemctl restart nfs-kernel-server
no_root_squash 这个选项,我建议一定要加上。如果不加,开发板上的root用户会被映射成nobody,导致很多操作权限不足。我曾经因为这个选项,调试一个驱动时,死活写不了设备节点,折腾了一下午才发现是NFS权限问题。
测试NFS挂载:
# 在开发板上(假设开发板IP为192.168.1.100,PC IP为192.168.1.10)
mount -t nfs -o nolock 192.168.1.10:/nfsroot /mnt
# 查看是否挂载成功
ls /mnt
如果能看到PC上 /nfsroot 目录的内容,说明NFS配置成功。后面在U-Boot中设置bootargs时,加上 root=/dev/nfs nfsroot=192.168.1.10:/nfsroot,开发板就能通过网络启动根文件系统了。
2.5 环境验证——确保一切就绪
环境搭好了,怎么确认没问题?我一般会做一个完整的验证流程:
- 交叉编译一个简单的驱动模块(Hello World级别)
- 通过TFTP把内核和驱动传到开发板
- 开发板通过NFS挂载根文件系统
- 加载驱动模块,验证功能
这个流程走通了,说明你的开发环境是完整的。后面写驱动时,就可以专注于代码本身,不用再怀疑环境问题了。
总结一下这一章的核心:
- Ubuntu 20.04 LTS 是首选,换源、装基础工具
- 交叉编译工具链解压后配置PATH,用file命令验证
- TFTP用于传内核和DTB,NFS用于共享根文件系统
- 防火墙和权限问题是常见的坑,遇到了别慌
嗯,环境搭建就到这里。下一章我们开始真正接触瑞芯微的SDK,看看怎么编译一个完整的内核镜像。到时候你会发现,今天搭的环境,全都能用上。