2. 开发环境搭建
嵌入式Linux开发与桌面开发最大的区别在于宿主机-目标机分离模式。开发者需要在性能强劲的x86工作站(宿主机)上编写代码,并使用交叉编译工具链生成ARM/MIPS/RISC-V等架构的可执行文件,再通过TFTP/NFS等网络服务将内核与根文件系统传输到嵌入式板卡(目标机)上运行。本章将系统讲解这一基础环境的搭建方法。
2.1 交叉编译工具链安装
交叉编译工具链是嵌入式开发的基石。它运行在x86宿主机上,但生成的目标代码却面向ARM、MIPS等不同架构。工具链的核心组件包括:交叉编译器(如 arm-linux-gnueabihf-gcc)、交叉链接器(ld)、交叉汇编器(as)以及C库(glibc/uClibc)。
2.1.1 工具链选择与下载
目前主流的交叉编译工具链来源有三种,开发者可根据项目需求选择:
| 工具链来源 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| Linaro GCC | ARM Cortex-A系列通用开发 | 官方维护、更新快、支持ARMv7/ARMv8 | 仅支持ARM架构 |
| Buildroot / Yocto | 定制化根文件系统 + 工具链 | 高度可定制、与系统集成紧密 | 构建时间长、学习曲线陡 |
| 芯片厂商SDK | 特定SoC(如NXP i.MX、TI AM335x) | 硬件适配最佳、包含板级支持包 | 版本固定、更新滞后 |
2.1.2 安装步骤
- 下载工具链压缩包(约200MB):
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
- 解压到指定目录(建议统一放在 /opt/toolchains 下):
sudo mkdir -p /opt/toolchains
sudo tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz -C /opt/toolchains/
- 配置环境变量(编辑 ~/.bashrc 或 /etc/profile):
export PATH=$PATH:/opt/toolchains/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
- 使环境变量生效并验证:
source ~/.bashrc
arm-linux-gnueabihf-gcc --version
若输出类似 arm-linux-gnueabihf-gcc (Linaro GCC 7.5-2019.12) 7.5.0 的信息,则安装成功。
sudo apt install libc6:i386 lib32stdc++6 即可解决。
2.2 TFTP/NFS服务器配置
嵌入式开发中,内核镜像(uImage/zImage)、设备树(.dtb)和根文件系统需要从宿主机传输到目标机。TFTP用于引导阶段(U-Boot加载内核),NFS用于运行阶段(挂载远程根文件系统)。
2.2.1 TFTP服务器
TFTP(Trivial File Transfer Protocol)是一种轻量级文件传输协议,常用于U-Boot引导时下载内核和设备树。配置步骤如下:
- 安装TFTP服务器与客户端:
sudo apt update
sudo apt install tftpd-hpa tftp-hpa
- 配置TFTP根目录(编辑 /etc/default/tftpd-hpa):
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure --create"
- 创建目录并设置权限:
sudo mkdir -p /srv/tftp
sudo chmod -R 777 /srv/tftp
- 重启服务并测试:
sudo systemctl restart tftpd-hpa
echo "test" | sudo tee /srv/tftp/test.txt
tftp localhost -c get test.txt
若当前目录下出现 test.txt 文件,则TFTP服务器正常工作。
2.2.2 NFS服务器
NFS(Network File System)允许目标机将宿主机上的某个目录挂载为根文件系统,极大方便了内核调试阶段的文件修改。配置步骤如下:
- 安装NFS服务器:
sudo apt install nfs-kernel-server
- 创建共享目录并导出根文件系统(假设根文件系统位于 /srv/nfs/rootfs):
sudo mkdir -p /srv/nfs/rootfs
# 将已构建的根文件系统复制到此目录
sudo cp -a /path/to/your/rootfs/* /srv/nfs/rootfs/
- 编辑 /etc/exports 添加共享配置:
/srv/nfs/rootfs *(rw,sync,no_subtree_check,no_root_squash)
rw 表示读写权限;sync 保证数据同步写入;no_root_squash 允许目标机以root身份访问,避免权限问题。
- 重启NFS服务并验证:
sudo exportfs -a
sudo systemctl restart nfs-kernel-server
showmount -e localhost
输出应包含 /srv/nfs/rootfs 条目。
2.3 串口终端与网络调试
串口是嵌入式开发中最可靠的调试通道,用于输出内核启动日志、进入U-Boot命令行以及运行交互式shell。网络调试则用于高效传输数据和远程GDB调试。
2.3.1 串口终端配置
大多数ARM开发板通过USB转串口(如CP2102、CH340、FT232)与宿主机连接。在Linux下,串口设备通常显示为 /dev/ttyUSB0 或 /dev/ttyACM0。
- 安装串口终端工具(推荐 minicom 或 screen):
sudo apt install minicom
- 配置 minicom:
sudo minicom -s
进入配置菜单后,设置以下参数:
| 参数项 | 推荐值 | 说明 |
|---|---|---|
| 串口设备 | /dev/ttyUSB0 | 根据实际设备节点调整 |
| 波特率 | 115200 | 大多数开发板默认值 |
| 数据位 | 8 | 标准设置 |
| 停止位 | 1 | 标准设置 |
| 奇偶校验 | 无 | 标准设置 |
| 硬件流控 | 关闭 | 避免干扰数据 |
- 保存配置并连接:选择 "Save as dfl",然后退出菜单即可进入终端界面。若开发板已上电并连接,应能看到U-Boot启动信息。
sudo usermod -a -G dialout $USER,然后注销重新登录。
2.3.2 网络调试基础
网络调试主要涉及IP地址配置和连通性测试。宿主机与目标机通常通过直连网线或小型交换机连接,并配置在同一网段。
- 宿主机网络配置(设置静态IP):
sudo ip addr add 192.168.1.100/24 dev eth0
sudo ip link set eth0 up
- 目标机网络配置(在U-Boot中设置):
setenv ipaddr 192.168.1.10
setenv serverip 192.168.1.100
setenv gatewayip 192.168.1.1
setenv netmask 255.255.255.0
saveenv
- 连通性测试:在U-Boot中执行
ping 192.168.1.100,若收到响应,则网络链路正常。
2.4 环境验证清单
完成上述配置后,建议按以下清单逐项验证,确保开发环境可用:
| 验证项 | 验证方法 | 预期结果 |
|---|---|---|
| 交叉编译器 | arm-linux-gnueabihf-gcc --version |
显示版本号,无错误 |
| TFTP服务 | tftp localhost -c get test.txt |
成功下载文件 |
| NFS服务 | showmount -e localhost |
显示共享目录 |
| 串口通信 | 连接开发板,观察minicom输出 | 显示U-Boot或内核启动日志 |
| 网络连通 | U-Boot中执行 ping 192.168.1.100 |
收到响应,丢包率0% |
setup_env.sh),后续在新机器上搭建环境时一键执行,避免重复劳动。