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加载内核并启动
验证方法与判定标准
- 主机侧验证:执行
exportfs -v能看到导出条目;systemctl status nfs-kernel-server显示active。 - 开发板侧验证:执行
mount命令无报错,ls /mnt能看到主机目录内容,touch测试文件创建成功且主机上能看到该文件,即判定NFS配置成功。 - 网络连通性前提:确保开发板与主机能互相ping通,且主机防火墙未屏蔽NFS端口(2049及rpcbind端口111)。若ping不通,先排查网线、IP配置和防火墙。
常见问题排查
- 挂载超时:检查主机防火墙
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启动根文件系统)。