NFS(Network File System)是一种基于RPC协议的网络文件系统,允许一台服务器将本地目录共享给网络中的其他Linux主机,客户端挂载后可以像操作本地磁盘一样读写远程文件。相比Samba、FTP等方案,NFS配置简单、传输效率高,特别适合内网环境下多台CentOS服务器之间的数据共享,比如网站代码同步、日志集中存储等场景。本文以CentOS 7为例,从服务端安装、共享目录配置,到客户端挂载和开机自动挂载,完整走一遍搭建流程。

一、服务端安装与基础配置
首先在作为NFS服务器的CentOS主机上安装两个软件包:nfs-utils是NFS的主程序,rpcbind负责RPC服务的端口注册与转发,NFS的多个守护进程都依赖它工作。使用yum安装即可:
yum install -y nfs-utils rpcbind systemctl enable rpcbind && systemctl start rpcbind systemctl enable nfs-server && systemctl start nfs-server
安装完成后,先创建一个用于共享的目录,例如/data/share,并设置合理的权限。这里建议把目录属主设为普通用户,避免共享目录被随意写入系统文件:
mkdir -p /data/share chown -R nfsnobody:nfsnobody /data/share chmod -R 755 /data/share
需要注意的是,CentOS 7中nfs-utils安装后默认会创建nfsnobody用户(旧版本的CentOS 6叫nobody),如果系统中没有这个用户,可以手动指定其他低权限账号,或者直接在配置文件里控制访问权限。接下来检查服务状态,执行rpcinfo -p能看到nfs、mountd等相关服务已经注册到RPC,说明服务端守护进程运行正常。
二、配置共享目录与exports文件详解
NFS的核心配置文件是/etc/exports,每一行定义一个共享目录,格式为:共享路径 + 客户端地址 + 参数选项。编辑该文件,加入如下内容:
/data/share 192.168.1.0/24(rw,sync,no_root_squash) /data/share 10.0.0.15(ro,async)
第一行表示把/data/share共享给192.168.1.0网段的所有主机,可读写、同步写入、不压制root权限;第二行表示只读共享给特定IP。这里的参数含义需要理解清楚:
- rw / ro:读写或只读权限,客户端挂载时的基本权限边界。
- sync:数据同步写入磁盘,稳定性好但性能略低;async是先写入缓存再落盘,速度快,但异常断电可能丢数据。生产环境建议对重要数据使用sync。
- no_root_squash:客户端root用户对共享目录拥有服务端的root权限,方便管理但有安全风险;默认值root_squash会把客户端root映射为nfsnobody低权限用户,更安全。
- no_all_squash:保留普通用户的身份,不做统一映射,这是默认行为。
- anonuid / anongid:指定匿名用户的UID和GID,常与root_squash配合,把映射目标锁定为指定账号。
配置修改后不要重启服务,直接执行exportfs -rv即可让配置生效,其中r表示重新挂载全部配置,v表示显示详细过程。执行exportfs -v或showmount -e localhost可以查看当前已导出的共享列表,确认配置无误。
三、防火墙放行与SELinux处理
NFS涉及多个服务端口,其中nfs主服务端口固定为2049,但mountd、statd、rquotad等服务的端口默认是随机的,这会给防火墙配置带来麻烦。推荐的做法是先把这些服务端口固定下来。编辑/etc/nfs.conf或在旧版本中编辑/etc/sysconfig/nfs,添加如下配置:
# /etc/nfs.conf [nfsd] # 主端口默认2049,无需修改 [mountd] port=20048 [statd] port=32769 outgoing-port=32768
保存后重启nfs-server,然后放行防火墙:
firewall-cmd --permanent --add-service=nfs firewall-cmd --permanent --add-service=mountd firewall-cmd --permanent --add-service=rpc-bind firewall-cmd --reload
如果测试环境为了省事,也可以直接systemctl stop firewalld临时关闭防火墙,但生产环境不建议这样做。另外SELinux也可能拦截访问,如果挂载后出现权限异常,可以先用setenforce 0临时关闭测试,确认是SELinux的问题后,再通过chcon -t public_content_rw_t /data/share调整目录安全上下文,并设置setsebool -P nfs_export_all_rw on,比直接禁用SELinux更规范。
四、客户端挂载与开机自动挂载
客户端机器同样需要安装nfs-utils才能使用挂载命令,不需要启动nfs-server服务。安装后先查看服务端导出了哪些共享:
yum install -y nfs-utils showmount -e 192.168.1.10
如果能看到共享列表,说明网络和权限都没问题,可以执行挂载:
mkdir -p /mnt/nfsdata mount -t nfs -o vers=4 192.168.1.10:/data/share /mnt/nfsdata df -h | grep nfsdata
其中-o vers=4指定使用NFSv4协议,性能和安全性都优于v3。挂载成功后往/mnt/nfsdata写一个测试文件,再到服务端/data/share目录确认文件是否出现。要实现开机自动挂载,传统方式是在/etc/fstab中添加一行:
192.168.1.10:/data/share /mnt/nfsdata nfs defaults,vers=4,_netdev 0 0
其中的_netdev参数告诉系统这是网络设备,需要等网络就绪后再挂载,避免开机时因网络未启动而卡住。更稳妥的做法是使用autofs按需自动挂载,编辑/etc/auto.master加入一行/mnt /etc/auto.nfs,再创建/etc/auto.nfs文件写入nfsdata -rw,vers=4 192.168.1.10:/data/share,然后重启autofs服务。这样只有在实际访问目录时才会触发挂载,即使服务端临时离线也不影响客户端开机。
五、常见问题排查思路
挂载失败时报错信息是最好的线索。如果提示mount.nfs: Connection timed out,多半是防火墙没放行或服务端IP不通,先用ping和telnet测试2049端口;如果提示Permission denied,检查exports文件中是否包含客户端IP、参数是否为ro、以及root_squash导致的权限映射问题;如果showmount直接报错clnt_create: RPC: Program not registered,说明服务端rpcbind或nfs-server没启动,回到服务端执行systemctl status rpcbind排查。
还有一种常见情况是挂载成功但写入报错只读文件系统,原因是exports里配置了ro或者客户端挂载时漏掉了rw参数。另外要注意目录权限与NFS权限是叠加关系:即使exports给了rw,如果服务端目录本身对nfsnobody用户不可写,客户端同样无法创建文件。建议用rpcinfo -p 服务端IP和tail -f /var/log/messages两个工具配合定位,绝大多数问题都能快速找到原因。
整套流程跑下来,NFS的搭建其实并不复杂,关键在于理解RPC的工作机制和exports参数的安全含义。生产环境中建议始终使用sync、root_squash等偏保守的配置,配合固定端口和防火墙白名单,就能得到一套稳定且安全的文件共享服务。
NFS服务器CentOS NFS搭建Linux挂载修改时间:2026-09-03 04:32:40