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挂载流程总览

为了让你对整个流程有个直观的认识,我画了一张图:

NFS挂载流程总览 安装nfs-kernel-server 创建导出目录 编辑/etc/exports exportfs -ra 重启服务 本地mount测试 开发板mount挂载 关键说明: 1. 安装服务后默认自动启动,但配置变更后需手动重启 2. 本地测试可以快速验证配置是否正确,避免板端调试时反复排查 3. 板端挂载时需确保网络互通,IP地址和网段要匹配

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),折腾了半小时才找到问题。所以,细心,再细心。