1. 嵌入式Linux开发环境搭建:交叉编译链安装、TFTP/NFS服务器配置、开发板与PC网络互通

做嵌入式Linux开发,第一步就是把环境搭好。我见过不少新手,代码写得挺溜,结果卡在环境配置上好几天。说白了,环境搭不好,后面全是坑。

这一章我们就把三件事搞定:交叉编译链、TFTP/NFS服务器、网络互通。这三样是后续所有实验的基础,一次配好,后面省心。

1.1 交叉编译链:为什么需要它?

你的PC是x86架构,开发板通常是ARM架构。PC上编译的程序,开发板跑不了。怎么办?用交叉编译链。

交叉编译链,说白了就是一套工具,让你在PC上编译出能在ARM上运行的程序。我习惯用Linaro提供的GCC工具链,稳定,社区支持也好。

安装步骤

  1. 下载工具链:从Linaro官网下载 gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz。
  2. 解压到指定目录:
tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz -C /opt/
  1. 配置环境变量:编辑 ~/.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
  1. 验证安装:
arm-linux-gnueabihf-gcc --version
我的习惯:把工具链装到 /opt/ 下,而不是 /usr/local/。这样换系统或重装时,工具链还在,不用重新下载。

1.2 TFTP服务器:快速传输内核和设备树

开发阶段,你经常要往开发板传内核镜像(zImage)和设备树文件(.dtb)。用TFTP,简单粗暴。

安装与配置

  1. 安装TFTP服务器:
sudo apt-get install tftpd-hpa
  1. 修改配置文件:编辑 /etc/default/tftpd-hpa:
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="-l -c -s"
  1. 创建共享目录并设置权限:
sudo mkdir /tftpboot
sudo chmod 777 /tftpboot
  1. 重启服务:
sudo systemctl restart tftpd-hpa
注意:防火墙要放行UDP 69端口。我曾经在一个项目里折腾了半天,最后发现是防火墙把TFTP拦了。嗯,这种低级错误犯一次就够了。

1.3 NFS服务器:挂载根文件系统

调试驱动时,你不想每次都烧写根文件系统到开发板。用NFS,开发板通过网络挂载PC上的目录作为根文件系统,改完代码直接生效。

安装与配置

  1. 安装NFS服务器:
sudo apt-get install nfs-kernel-server
  1. 编辑导出文件:在 /etc/exports 中添加:
/home/yourname/rootfs *(rw,sync,no_root_squash,no_subtree_check)
  1. 重启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挂载文件系统,网络把一切连起来。

嵌入式Linux开发环境搭建——核心逻辑 PC(Ubuntu) 交叉编译链 TFTP服务器 NFS服务器 网络 开发板(ARM) U-Boot引导 内核(zImage) 根文件系统 PC ↔ 开发板 双向通信

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 参数。基础验证省不得。

环境搭好,验证通过,后面就可以安心搞内核裁剪和驱动开发了。记住,基础打得牢,后面少烦恼。