第一章 课程导论与开发环境:嵌入式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
如果都能正常工作,恭喜你,环境搭好了。
本章知识体系总览
下面这张图,把第一章的核心逻辑串起来了。你可以把它当作整个课程的“导航地图”。
这张图里,开发模式概述是总纲,下面分出三条路。咱们这门课,重点走中间和右边两条路——NFS挂载和TFTP烧录。左边那条本地编译,了解一下就行,实际项目中很少用。
我的建议:初学者先把NFS玩熟。它反馈快,出错了容易排查。等NFS搞明白了,再碰TFTP。别一上来就搞uboot烧录,万一板子变砖,心态容易崩。