2. 开发环境搭建:安装虚拟机、配置Ubuntu系统、安装必要工具链、配置SSH和NFS服务
说实话,嵌入式Linux开发的第一步,就是把你的开发环境整利索了。我见过太多新手,上来就急着写代码,结果编译环境没配好,折腾一整天连个Hello World都跑不起来。嗯,咱们先把地基打牢。
本章核心目标:在一台Windows或macOS主机上,通过虚拟机搭建Ubuntu开发环境,并配置好SSH远程登录和NFS网络文件系统。这套环境,我用了快十年,基本没变过。
2.1 为什么非得用虚拟机?
你可能会问:我直接在Windows上装个交叉编译工具链不行吗?
行是行,但你会遇到一堆麻烦。嵌入式Linux的编译工具链、依赖库、脚本工具,绝大多数都是为Linux设计的。在Windows上折腾,说白了就是给自己挖坑。我在项目中遇到过一位同事,非要在Windows上用Cygwin编译U-Boot,结果折腾了两天,最后还是老老实实装了虚拟机。
我个人习惯用VMware Workstation,当然VirtualBox也行,免费嘛。但如果你做的是商业项目,我建议还是用VMware,稳定性和性能都好一些。
2.2 安装虚拟机与Ubuntu系统
步骤其实很简单,但有几个坑你得注意。
- 下载Ubuntu镜像:我推荐Ubuntu 20.04 LTS或22.04 LTS。别追最新版,LTS版本稳定,社区支持好,遇到问题好搜解决方案。
- 创建虚拟机:内存至少给4GB,硬盘建议60GB以上。你想想看,后面要装工具链、下载内核源码、编译文件系统,空间小了真不够用。
- 安装系统:一路默认就行,但记得在安装时勾选「为图形或无线硬件安装第三方软件」,省得后面折腾显卡驱动。
我的小技巧:安装完成后,第一时间执行 sudo apt update && sudo apt upgrade -y。别拖,拖到后面你可能会忘记,然后编译时遇到一堆莫名其妙的依赖问题。
2.3 安装必要工具链
嵌入式开发离不开交叉编译工具链。说白了,就是在你的x86电脑上编译出能在ARM板子上跑的程序。
我个人习惯用Linaro提供的工具链,稳定且更新及时。安装方式如下:
# 下载ARM交叉编译工具链
wget https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz
# 解压到指定目录
tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz -C /opt/
# 配置环境变量
echo 'export PATH=$PATH:/opt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin' >> ~/.bashrc
source ~/.bashrc
# 验证安装
arm-linux-gnueabihf-gcc --version
除了交叉编译工具链,还有一些基础工具也得装上:
| 工具 | 用途 | 安装命令 |
|---|---|---|
| build-essential | 基础编译环境 | sudo apt install build-essential |
| git | 版本控制 | sudo apt install git |
| vim | 文本编辑器 | sudo apt install vim |
| net-tools | 网络工具 | sudo apt install net-tools |
| nfs-kernel-server | NFS服务端 | sudo apt install nfs-kernel-server |
注意:我曾经因为忘记安装 libncurses-dev,导致编译内核时 make menuconfig 报错。这个库是内核配置界面的依赖,一定要装上:sudo apt install libncurses-dev
2.4 配置SSH服务
SSH这东西,说白了就是让你能远程登录到虚拟机。我平时开发都是SSH连进去,不用开虚拟机界面,省资源。
# 安装SSH服务
sudo apt install openssh-server
# 启动SSH服务
sudo systemctl start ssh
sudo systemctl enable ssh
# 查看IP地址
ifconfig
然后你就可以在主机上用SSH客户端连过去了:
ssh 用户名@虚拟机IP
避坑指南:如果你发现连不上,先检查虚拟机网络模式。我个人习惯用「桥接模式」,这样虚拟机和主机在同一个网段,互相访问方便。NAT模式也行,但需要做端口转发,麻烦。
2.5 配置NFS服务
NFS是嵌入式开发中非常重要的服务。你想想看,每次修改代码都要重新编译、烧录到板子上,多浪费时间。有了NFS,你可以把开发板上的根文件系统挂载到虚拟机里,直接在板子上运行你刚编译好的程序。
配置步骤如下:
# 创建共享目录
sudo mkdir -p /srv/nfs/rootfs
# 配置NFS导出
sudo vim /etc/exports
在文件中添加一行:
/srv/nfs/rootfs *(rw,sync,no_subtree_check,no_root_squash)
然后重启NFS服务:
sudo exportfs -a
sudo systemctl restart nfs-kernel-server
注意:no_root_squash 这个参数很重要。如果不加,开发板上的root用户访问共享目录时会被映射成nobody用户,导致权限问题。我曾经在这个坑里爬了半天,后来才发现是少了这个参数。
2.6 验证环境
环境搭好了,咱们得验证一下能不能用。写个简单的测试程序:
// test.c
#include <stdio.h>
int main() {
printf("Hello, Embedded Linux!\n");
return 0;
}
用交叉编译工具链编译:
arm-linux-gnueabihf-gcc -o test test.c
file test
如果输出显示 ELF 32-bit LSB executable, ARM,说明工具链没问题。
然后把这个文件放到NFS共享目录里,在开发板上挂载并运行:
# 在开发板上执行
mount -t nfs -o nolock 虚拟机IP:/srv/nfs/rootfs /mnt
/mnt/test
看到 Hello, Embedded Linux! 输出,恭喜你,环境搭建成功了。
总结一下:这套环境我用了很多年,从Ubuntu 14.04一直用到22.04,基本流程没变过。你只要按着步骤来,一般不会出问题。如果遇到报错,别慌,先看错误信息,八成是某个依赖没装或者路径配错了。
环境搭建这块,说白了就是一次配置,长期受益。你花半天时间把环境整好,后面开发效率能提升好几倍。我个人觉得,这是整个嵌入式Linux学习过程中最值得投入时间的一步。
可可精品资料库