1. 嵌入式Linux开发环境搭建:交叉编译链安装、TFTP/NFS服务器配置、开发板与PC网络互通
做嵌入式Linux开发,第一步就是把环境搭好。我见过不少新手,代码写得挺溜,结果卡在环境配置上好几天。说白了,环境搭不好,后面全是坑。
这一章我们就把三件事搞定:交叉编译链、TFTP/NFS服务器、网络互通。这三样是后续所有实验的基础,一次配好,后面省心。
1.1 交叉编译链:为什么需要它?
你的PC是x86架构,开发板通常是ARM架构。PC上编译的程序,开发板跑不了。怎么办?用交叉编译链。
交叉编译链,说白了就是一套工具,让你在PC上编译出能在ARM上运行的程序。我习惯用Linaro提供的GCC工具链,稳定,社区支持也好。
安装步骤
- 下载工具链:从Linaro官网下载
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/
- 配置环境变量:编辑
~/.bashrc,添加:
export PATH=$PATH:/opt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin
export CROSS_COMPILE=arm-linux-gnueabihf-
export ARCH=arm
- 验证安装:
arm-linux-gnueabihf-gcc --version
我的习惯:把工具链装到
/opt/ 下,而不是 /usr/local/。这样换系统或重装时,工具链还在,不用重新下载。
1.2 TFTP服务器:快速传输内核和设备树
开发阶段,你经常要往开发板传内核镜像(zImage)和设备树文件(.dtb)。用TFTP,简单粗暴。
安装与配置
- 安装TFTP服务器:
sudo apt-get install tftpd-hpa
- 修改配置文件:编辑
/etc/default/tftpd-hpa:
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="-l -c -s"
- 创建共享目录并设置权限:
sudo mkdir /tftpboot
sudo chmod 777 /tftpboot
- 重启服务:
sudo systemctl restart tftpd-hpa
注意:防火墙要放行UDP 69端口。我曾经在一个项目里折腾了半天,最后发现是防火墙把TFTP拦了。嗯,这种低级错误犯一次就够了。
1.3 NFS服务器:挂载根文件系统
调试驱动时,你不想每次都烧写根文件系统到开发板。用NFS,开发板通过网络挂载PC上的目录作为根文件系统,改完代码直接生效。
安装与配置
- 安装NFS服务器:
sudo apt-get install nfs-kernel-server
- 编辑导出文件:在
/etc/exports中添加:
/home/yourname/rootfs *(rw,sync,no_root_squash,no_subtree_check)
- 重启NFS服务:
sudo exportfs -a
sudo systemctl restart nfs-kernel-server
关键参数说明:
rw:读写权限sync:同步写入,保证数据一致性no_root_squash:允许开发板以root权限访问
1.4 开发板与PC网络互通
环境搭好了,连不上也是白搭。我建议用静态IP,省去DHCP的麻烦。
网络配置示例
| 设备 | IP地址 | 子网掩码 | 网关 |
|---|---|---|---|
| PC(Ubuntu) | 192.168.1.100 | 255.255.255.0 | 192.168.1.1 |
| 开发板 | 192.168.1.200 | 255.255.255.0 | 192.168.1.1 |
PC端配置
sudo ifconfig eth0 192.168.1.100 netmask 255.255.255.0 up
开发板端配置(U-Boot中)
setenv ipaddr 192.168.1.200
setenv serverip 192.168.1.100
setenv netmask 255.255.255.0
setenv gatewayip 192.168.1.1
saveenv
连通性测试
在PC上ping开发板:
ping 192.168.1.200
在开发板上ping PC:
ping 192.168.1.100
避坑指南:如果ping不通,先检查网线。我遇到过好几次,折腾半天,结果是网线没插紧。另外,PC和开发板最好直连,不要经过路由器,减少干扰。
1.5 知识体系总览
下面这张图把本章的核心逻辑串起来了。你想想看,整个开发环境其实就是一条链路:PC上交叉编译,通过TFTP传内核,通过NFS挂载文件系统,网络把一切连起来。
1.6 环境验证清单
环境搭完,别急着往下走。花5分钟跑一遍验证,确保每个环节都通。我习惯列个清单,打勾确认。
| 序号 | 验证项 | 命令/方法 | 预期结果 |
|---|---|---|---|
| 1 | 交叉编译链可用 | arm-linux-gnueabihf-gcc --version |
显示版本信息 |
| 2 | TFTP服务正常 | sudo systemctl status tftpd-hpa |
显示 active (running) |
| 3 | NFS服务正常 | sudo systemctl status nfs-kernel-server |
显示 active (exited) |
| 4 | PC与开发板互通 | ping 192.168.1.200 |
收到回复,无丢包 |
| 5 | TFTP传输测试 | 开发板执行 tftp 192.168.1.100 -g -r zImage |
文件下载成功 |
| 6 | NFS挂载测试 | 开发板执行 mount -t nfs 192.168.1.100:/home/yourname/rootfs /mnt |
挂载成功,可读写文件 |
重要提醒:验证清单里的每一项都要过一遍。我曾经跳过第5步,结果后面调试时发现TFTP传文件总是断断续续,查了半天才发现是服务配置里少了个
-c 参数。基础验证省不得。
环境搭好,验证通过,后面就可以安心搞内核裁剪和驱动开发了。记住,基础打得牢,后面少烦恼。