虚拟机开启NFS这事,本质上就是给系统装一个NFS软件包,改一行配置文件,再启动服务,三步走完。 但在实际环境里,相当一部分人在虚拟机上卡在权限、防火墙或者网络配置上,挂载不成功,这篇文章把完整流程和常见坑一次性讲清楚。
虚拟机开启NFS之前,先弄明白这几个关键问题
虚拟机NFS和Samba怎么选
NFS是Linux和Unix生态里的文件共享协议,客户端访问时跟访问本地磁盘一样,不产生文件锁冲突,Samba走的是SMB/CIFS协议,主要服务于Windows和Linux混杂的环境。
行业共识认为,如果虚拟机清一色Linux,NFS在性能和资源占用上比Samba更划算,办公网里Windows机器多,Samba更省事,这个选择没有绝对的“哪个好”,只看手头机器的操作系统构成。
哪些场景适合在虚拟机上配置NFS
拿常见的开发环境举例:一台虚拟机装CentOS,另一台测Kubernetes,两边都要用同一个代码目录,用NFS挂载一次,两边同时读写,目录结构保持同步,省掉来回拷贝的功夫。
- 虚拟机迁移后数据还在原宿主机,NFS可以在一定程度上实现存储和计算分离
- 多台虚拟机共享同一份配置或证书文件
- Linux虚拟机上搭建WordPress或Nextcloud,把数据目录挂到远端存储上
这些场景背后的逻辑都一样:把存储从虚拟机里剥离出来,放到网络另一端,现在很多人直接把NFS跑在云虚拟机上,比如在华北2(北京)或华东1(杭州)开一台按量付费的Linux云主机,配置2核4G,专门做团队共享存储,按小时计费,多数时段一小时成本不到一块钱,不开机不产生费用,测试阶段比买物理NAS省得多。
虚拟机怎么开启NFS服务,一条龙操作步骤
以下步骤以CentOS 7/8、Ubuntu 20.04/22.04为例,其他发行版命令大同小异。
第一步:确认内核支持并安装软件包
先看内核模块是否在编:
cat /proc/filesystems | grep nfs
输出里有nfsd,说明内核支持,然后装软件包:
# CentOS / RHEL系列 yum install -y nfs-utils # Ubuntu / Debian系列 apt update && apt install -y nfs-kernel-server
装完之后确认安装版本:
rpm -qa | grep nfs-utils # RedHat系 dpkg -l | grep nfs-kernel # Debian系
第二步:修改/etc/exports配置文件
这是整个配置中最核心的一步,编辑/etc/exports,每一行定义一条共享规则:
/shared/data 192.168.1.0/24(rw,sync,no_root_squash)
几个常见参数的含义:
rw表示读写,ro表示只读sync是同步写入,配合wdelay使用可以适当减少写放大no_root_squash允许客户端root用户保留root权限,个人测试环境用这个省事,生产环境建议换成root_squash- 授权对象可以用
168.1.0/24网段,也可以用.example.com通配域名
改完先检查配置语法:
exportfs -arv
这条命令会重新加载所有导出项,有语法错误会当场报错。
第三步:启动服务并设置开机自启
# CentOS 7/8 systemctl enable --now nfs-server # Ubuntu 20.04以上 systemctl enable --now nfs-kernel-server
老教程里的service nfs start在新版systemd环境下不好使,育成交给systemd管的习惯。
第四步:客户端挂载并验证
在另一台虚拟机(或宿主机)执行:
mkdir -p /mnt/nfs_test mount -t nfs 192.168.1.10:/shared/data /mnt/nfs_test df -h | grep nfs_test
看到挂载点出现在df结果里,说明通了,想开机自动挂载,就写进/etc/fstab:
168.1.10:/shared/data /mnt/nfs_test nfs defaults,noatime,_netdev 0 0
虚拟机NFS挂载不上怎么办,排查思路和实操命令
挂载失败是最常见的问题,按下面顺序排查,绝大多数情况能定位。
权限和用户映射导致的访问失败
客户端能挂上,但读写时报Permission denied,多半是root_squash和属主不一致造成的,先看服务端共享目录的属主和权限:
ll -d /shared/data
目录属主是root且权限是755,客户端的普通用户自然写不进去,两个解决方向:
- 把目录属主改成
nfsnobody(CentOS)或nobody(Ubuntu) - 在exports配置里针对特定客户端加
no_root_squash,本地测试随意,生产环境慎用
防火墙和SELinux拦截NFS流量
NFS依赖多端口,被防火墙拦住的概率相当大,CentOS如果开了SELinux,先临时放开试试:
setsebool -P nfs_export_all_rw 1
再放行防火墙服务:
firewall-cmd --permanent --add-service=nfs firewall-cmd --permanent --add-service=mountd firewall-cmd --permanent --add-service=rpc-bind firewall-cmd --reload
Ubuntu的ufw只需要一条命令:
ufw allow nfs
如果服务端手动固定了端口,还得额外放行对应端口,没固定就省事一些。
网络和共享参数排查
客户端先执行:
showmount -e 192.168.1.10
能列出导出列表,说明网络通、服务在跑,列不出来,就按顺序ping、telnet 2049端口、查rpcbind状态:
systemctl status rpcbind ss -tlnp | grep 2049
链路断在哪一环,问题就出在哪,多数情况下,NFS挂载失败都是防火墙或rpcbind状态异常,不是协议本身的问题。
虚拟机NFS性能调优和安全加固,上线前记得做这几件事
性能参数:挂载选项别省
客户端挂载时加上noatime和nodiratime,减少不必要的写操作,网络带宽充足的场景,可以在exports里设置
wdelay(延迟合并写)替代sync,写吞吐会高一些,但掉电风险随之上升,实验环境无所谓,生产环境请老老实实用sync。
亲测一个批量生成图片的任务,虚拟机挂NFS从默认参数换成noatime加rsize=32768、wsize=32768之后,整体耗时缩短了三分之一左右。读写块大小和atime更新,是NFS性能最明显的两个变量。
安全加固:默认暴露要收敛
NFS默认信任内网,但建议做一份最小化授权:
- exports里用精确IP或网段,别用
- 只导出必要目录,别把根目录丢出去
- 条件允许时加
sec=krb5p做加密认证 - 客户端只需读的场景就用
ro
回到开头那句话,虚拟机开启NFS,真的就是装包、改配置、起服务这三板斧,权限、防火墙、网络这三关守住了,挂载顺利就是自然的事。
虚拟机NFS问与答:挂载故障定位思路
问题1:虚拟机开了NFS服务,宿主机挂载超时,怎么办?
先确认虚拟机的网络模式,NAT模式下宿主机和虚拟机不在同一广播域,需要切换桥接模式或配置端口转发,接着检查虚拟机内部防火墙是否放行NFS相关端口,再确认服务端/etc/exports里允许的网段包含宿主机的IP。
问题2:NFS挂载后虚拟机重启,发现挂载点丢失?
检查/etc/fstab中挂载选项是否包含_netdev,NFS依赖网络,系统启动时网络栈可能还没就绪,加_netdev可以让挂载动作等待网络就绪后再执行。
问题3:NFS服务端重启后,客户端挂载的目录变成只读?
这是NFS常见的“陈旧句柄”问题,客户端重新执行umount -l强制卸载,再次挂载即可,如果现象反复出现,重点检查服务端导出的目录路径是否有变更,以及客户端/etc/fstab里的远程路径是否写错。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/654666.html





