第一章 课程导论与开发环境:嵌入式Linux开发模式概述

大家好,我是你们这门课的老朋友。做了十几年嵌入式Linux,踩过的坑比吃过的盐还多。今天咱们开篇,先把地基打牢。

嵌入式Linux开发,说白了就是“交叉编译 + 远程部署”。你想想看,你的开发机(通常是Ubuntu)性能强劲,但目标板(比如ARM开发板)资源有限。你不可能在板子上装个GCC去编译内核吧?那得等到猴年马月。

所以,标准流程是:在Ubuntu上写代码、编译,然后把生成的可执行文件或镜像,通过网络或烧录工具,送到目标板上运行。

这里就引出了我们今天的主角:NFS 和 TFTP。

核心概念速览

  • NFS(网络文件系统):让目标板通过网络,直接访问Ubuntu上的一个目录。就像在板子上插了个U盘,但这个U盘在千里之外。
  • TFTP(简单文件传输协议):轻量级的文件下载协议,常用于uboot阶段,把内核或设备树“拉”到板子的内存里。

嵌入式Linux开发模式:三种主流姿势

我刚开始带团队的时候,发现很多新人搞不清开发模式。其实就三种,我给你们捋一捋。

模式 适用阶段 特点 我的经验
1. 本地编译 应用调试初期 直接在板子上gcc,慢但简单 只适合小demo,别当真
2. 交叉编译 + NFS挂载 驱动/应用开发中期 代码在Ubuntu编译,板子通过NFS运行 我最常用的方式,迭代快
3. 交叉编译 + TFTP烧录 uboot/内核调试、量产 通过网络下载镜像到板子内存或Flash 救砖必备技能

我个人习惯,日常开发用模式2,改一行代码,板子上立刻生效,不用反复烧写Flash。但遇到uboot阶段或者要更新内核,就得靠模式3了。

NFS与TFTP协议简介

NFS,全称Network File System。它基于RPC(远程过程调用)实现。你只需要在Ubuntu上export一个目录,板子上mount一下,就能像操作本地文件一样操作远程文件。

避坑指南:我曾经因为NFS版本不匹配,折腾了一整天。Ubuntu默认用NFSv4,但老内核的板子只支持NFSv3。记得在/etc/exports里加上nfsvers=3选项。

TFTP,Trivial File Transfer Protocol。它比FTP还简单,没有认证,没有目录列表,只能读或写文件。但正因为简单,它特别适合uboot这种资源受限的环境。

为什么不用FTP?你想想看,uboot刚启动,网络协议栈都还没完全初始化,跑FTP太费劲了。TFTP基于UDP,轻量级,正好够用。

开发机(Ubuntu)环境准备

工欲善其事,必先利其器。咱们先把Ubuntu环境搭好。我假设你用的是Ubuntu 20.04或22.04 LTS,其他版本大同小异。

第一步:安装必要软件包

sudo apt update
sudo apt install -y nfs-kernel-server tftpd-hpa xinetd
# 交叉编译工具链(以ARM为例)
sudo apt install -y gcc-arm-linux-gnueabihf

这里我多说一句,交叉编译工具链一定要跟你的目标板架构匹配。比如你是ARM Cortex-A7,就用arm-linux-gnueabihf;如果是AArch64,就用aarch64-linux-gnu。

第二步:配置NFS服务器

创建一个共享目录,然后编辑配置文件。

sudo mkdir -p /srv/nfs/rootfs
sudo chown nobody:nogroup /srv/nfs/rootfs
sudo chmod 777 /srv/nfs/rootfs

# 编辑 /etc/exports,添加一行
echo "/srv/nfs/rootfs *(rw,sync,no_subtree_check,no_root_squash)" | sudo tee -a /etc/exports

# 重启NFS服务
sudo systemctl restart nfs-kernel-server

注意:no_root_squash这个选项很关键。如果不加,板子上的root用户会被映射成nobody,导致权限问题。我在项目里吃过这个亏,文件明明在,就是打不开。

第三步:配置TFTP服务器

TFTP配置更简单。我们使用tftpd-hpa,它默认监听在69端口。

sudo mkdir -p /srv/tftp
sudo chmod 777 /srv/tftp

# 编辑 /etc/default/tftpd-hpa
sudo tee /etc/default/tftpd-hpa <<EOF
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure --create"
EOF

sudo systemctl restart tftpd-hpa

嗯,这里要注意:--create选项允许客户端上传文件,调试时很有用。但生产环境建议去掉,防止被乱写。

第四步:验证环境

验证NFS:在Ubuntu本机挂载试试。

sudo mount -t nfs 127.0.0.1:/srv/nfs/rootfs /mnt
ls /mnt
sudo umount /mnt

验证TFTP:用tftp客户端下载一个测试文件。

echo "Hello TFTP" | sudo tee /srv/tftp/test.txt
tftp 127.0.0.1
tftp> get test.txt
tftp> quit
cat test.txt

如果都能正常工作,恭喜你,环境搭好了。

本章知识体系总览

下面这张图,把第一章的核心逻辑串起来了。你可以把它当作整个课程的“导航地图”。

第一章:嵌入式Linux部署实战 - 知识体系 开发模式概述 本地编译 NFS挂载 TFTP烧录 直接在板子上编译 适合小规模测试 Ubuntu导出目录 板子mount挂载 实时同步,迭代快 uboot阶段下载镜像 烧录内核/设备树 核心目标 掌握交叉编译 + 网络部署的完整链路,从uboot到应用层全覆盖

这张图里,开发模式概述是总纲,下面分出三条路。咱们这门课,重点走中间和右边两条路——NFS挂载和TFTP烧录。左边那条本地编译,了解一下就行,实际项目中很少用。

我的建议:初学者先把NFS玩熟。它反馈快,出错了容易排查。等NFS搞明白了,再碰TFTP。别一上来就搞uboot烧录,万一板子变砖,心态容易崩。