3. NFS服务器搭建与配置
NFS,说白了就是让嵌入式开发板能通过网络,直接访问你电脑上的文件夹。这样你编译好的内核、驱动、应用程序,不用每次都烧录到板子上,直接挂载就能跑。开发效率能提升好几倍。
我记得刚入行那会儿,还不知道用NFS,每次改个驱动都要重新烧录一遍,等个两三分钟是常事。后来老工程师跟我说:「你小子怎么还在用U盘拷?」从那以后,我就再也没离开过NFS。
3.1 安装nfs-kernel-server
在Ubuntu上搭建NFS服务,第一步就是安装软件包。我个人习惯用nfs-kernel-server,稳定,社区支持也好。
sudo apt update
sudo apt install nfs-kernel-server -y
安装完成后,可以检查一下服务状态:
sudo systemctl status nfs-kernel-server
如果看到 active (running),说明服务已经跑起来了。嗯,这里要注意,有些旧版本的Ubuntu可能叫nfs-common,但新版本统一用nfs-kernel-server就行。
3.2 配置/etc/exports导出目录
这是整个NFS配置的核心。/etc/exports文件决定了你要把哪个目录共享出去,以及谁可以访问、有什么权限。
我一般会在/home下建一个专门的目录,比如/home/nfsroot,用来放根文件系统。你想想看,这样管理起来多清晰。
sudo mkdir -p /home/nfsroot
sudo chmod 777 /home/nfsroot
然后编辑/etc/exports文件:
sudo vim /etc/exports
在里面添加一行:
/home/nfsroot *(rw,sync,no_subtree_check,no_root_squash)
我来解释一下这几个参数的含义:
| 参数 | 含义 | 我的建议 |
|---|---|---|
rw |
读写权限 | 开发阶段必须用,不然板子写不了日志 |
sync |
同步写入 | 数据安全第一,别用async |
no_subtree_check |
关闭子树检查 | 提升性能,我每次都加 |
no_root_squash |
允许root用户保持root权限 | 嵌入式开发必备,不然板子上root用户没权限写文件 |
no_root_squash,结果板子上以root身份运行的程序,写文件时一直报权限错误。查了半天才发现是NFS把root映射成了nobody。从那以后,我每次配exports都会检查这个参数。
如果你只想让特定网段的设备访问,可以这样写:
/home/nfsroot 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)
这样只有192.168.1.x网段的设备才能挂载,安全性更高。
3.3 启动服务与本地挂载测试
配置好/etc/exports后,需要重启NFS服务使配置生效:
sudo exportfs -ra
sudo systemctl restart nfs-kernel-server
exportfs -ra这个命令,说白了就是重新读取配置文件并导出所有目录。我个人习惯每次改完exports都跑一遍,确认没有语法错误。
然后查看一下导出的目录列表:
sudo exportfs -v
如果看到类似下面的输出,说明配置成功了:
/home/nfsroot *(rw,sync,wdelay,hide,no_subtree_check,no_root_squash)
3.3.1 本地挂载测试
在正式给开发板用之前,我建议先在本地测试一下。这样可以排除网络和权限问题。
sudo mount -t nfs localhost:/home/nfsroot /mnt
然后检查是否挂载成功:
df -h | grep nfsroot
如果看到类似localhost:/home/nfsroot挂载到了/mnt,就说明一切正常。
测试完成后,记得卸载:
sudo umount /mnt
mount.nfs: Connection refused,八成是NFS服务没启动,或者防火墙挡住了。先检查 systemctl status nfs-kernel-server,再检查 sudo ufw status。我遇到过好几次都是防火墙的问题。
3.4 NFS挂载流程总览
为了让你对整个流程有个直观的认识,我画了一张图:
3.5 常见问题与避坑指南
- 防火墙问题:NFS依赖
rpcbind服务,端口是111。如果板子挂载不上,先检查Ubuntu防火墙是否放行了NFS相关端口。我一般直接sudo ufw disable,但生产环境不建议这么干。 - 权限问题:如果板子上挂载后无法写入文件,八成是
no_root_squash没加,或者导出目录的权限不对。记得chmod 777。 - 版本兼容:Ubuntu 20.04默认用NFSv4,但有些老内核的板子只支持NFSv3。可以在
/etc/default/nfs-kernel-server里配置版本支持。
我的经验总结:NFS配置其实不难,但细节决定成败。每次改完配置,先本地挂载测试一下,能省掉后面板端调试时的大量排查时间。我曾经因为一个拼写错误(exports里写成了no_root_squah,少了个s),折腾了半小时才找到问题。所以,细心,再细心。