2. 配置NFS服务

任务说明

本案例目标是在主机(Ubuntu)上配置NFS服务,使ARM开发板能够通过网络挂载主机上的根文件系统目录。这是嵌入式Linux开发中常用的调试手段——开发板从NFS启动根文件系统,主机上的修改即时生效,避免反复烧写Flash。

主机NFS服务配置

以下操作在主机(Ubuntu 20.04/22.04)上以root或sudo权限执行。

1. 安装NFS服务

sudo apt update
sudo apt install -y nfs-kernel-server

2. 创建并导出根文件系统目录

假设你的根文件系统位于 /opt/rootfs(若不存在则先创建),将其导出给开发板访问:

sudo mkdir -p /opt/rootfs
# 将你的根文件系统内容放入/opt/rootfs(如从busybox或buildroot生成的rootfs目录拷贝)
sudo chmod 777 /opt/rootfs   # 开发板需要读写权限,实际产品请按需收紧

3. 编辑NFS导出配置文件

sudo vim /etc/exports

在文件末尾添加以下行(假设开发板IP为192.168.1.100,子网掩码24位):

/opt/rootfs 192.168.1.100(rw,sync,no_root_squash,no_subtree_check)

参数说明:

  • rw:允许读写
  • sync:同步写入,保证数据一致性
  • no_root_squash:允许开发板的root用户拥有主机root权限(NFS默认会把远程root映射为nobody,此选项关闭该映射)
  • no_subtree_check:禁用子树检查,提升稳定性

4. 应用导出配置并启动服务

sudo exportfs -ra
sudo systemctl restart nfs-kernel-server
sudo systemctl enable nfs-kernel-server

5. 验证NFS服务状态

sudo exportfs -v
sudo systemctl status nfs-kernel-server --no-pager

预期输出中应包含类似 /opt/rootfs 192.168.1.100(rw,sync,wdelay,hide,no_subtree_check,no_root_squash) 的行,且服务状态为 active (running)。

开发板端挂载验证

在开发板Linux系统启动后(或进入U-Boot后若支持网络),执行以下命令测试NFS挂载:

# 开发板IP需与主机在同一网段,例如192.168.1.100
mount -t nfs -o nolock 192.168.1.10:/opt/rootfs /mnt
ls /mnt   # 应能看到主机/opt/rootfs下的内容
# 测试写权限
touch /mnt/test_write && echo "NFS write OK" && rm /mnt/test_write

其中 192.168.1.10 为主机IP,请根据实际环境替换。nolock 选项用于关闭NFS锁,避免某些开发板内核NFS客户端锁支持不完整导致挂载失败。

U-Boot中设置NFS启动参数(可选)

若需从NFS直接启动内核,在U-Boot命令行设置:

setenv serverip 192.168.1.10
setenv ipaddr 192.168.1.100
setenv bootargs 'console=ttyS0,115200 root=/dev/nfs nfsroot=192.168.1.10:/opt/rootfs,v3 ip=192.168.1.100:192.168.1.10:192.168.1.1:255.255.255.0::eth0:off'
saveenv
# 然后通过tftp加载内核并启动

验证方法与判定标准

  1. 主机侧验证:执行 exportfs -v 能看到导出条目;systemctl status nfs-kernel-server 显示active。
  2. 开发板侧验证:执行 mount 命令无报错,ls /mnt 能看到主机目录内容,touch 测试文件创建成功且主机上能看到该文件,即判定NFS配置成功。
  3. 网络连通性前提:确保开发板与主机能互相ping通,且主机防火墙未屏蔽NFS端口(2049及rpcbind端口111)。若ping不通,先排查网线、IP配置和防火墙。
主机 (Ubuntu) IP: 192.168.1.10 /opt/rootfs (根文件系统) /etc/exports 配置 nfs-kernel-server (服务) ARM开发板 IP: 192.168.1.100 mount -t nfs ... /mnt /mnt (挂载点) U-Boot: nfsroot=参数 NFS协议 (端口2049) 验证: ls /mnt exportfs -v 检查 touch 写测试

常见问题排查

  • 挂载超时:检查主机防火墙 sudo ufw status,若开启则放行 sudo ufw allow from 192.168.1.100 或直接允许NFS端口。
  • 权限拒绝:确认 /opt/rootfs 目录权限至少为755,且exports中使用了 no_root_squash。
  • 开发板内核需支持NFS客户端:内核配置需开启 CONFIG_NFS_FS=y 和 CONFIG_ROOT_NFS=y(若从NFS启动根文件系统)。