DJVPS820

Ubuntu NFS挂载怎么配置?从安装到挂载的完整

Ubuntu NFS挂载怎么配置?Ubuntu NFS挂载是 Linux 服务器之间共享文件和目录时非常常见的一种方式,尤其适合多台 Ubuntu、Debian 或其他 Linux 服务器需要访问同一份数据的场景。NFS(Network File System)可以让客户端通过网络访问远程服务器上的目录,使用起来和本地目录比较接近,不需要每次通过 FTP、SFTP 等方式手动上传和下载文件。对于网站文件共享、备份目录、媒体文件、程序数据以及多服务器环境来说,NFS 都有比较实际的用途。本文以 Ubuntu 系统为例,从 NFS 服务端安装、共享目录配置、防火墙设置,到客户端安装 NFS 工具、创建挂载点、执行挂载、设置开机自动挂载,再到常见故障排查,完整介绍 Ubuntu NFS 挂载的配置方法,适合刚接触 NFS 的用户,也可以直接作为服务器部署时的操作参考。

一、Ubuntu NFS是什么,为什么需要挂载

NFS 的工作方式可以简单理解为,一台服务器负责提供共享目录,其他服务器通过网络连接到这个目录,然后把远程目录挂载到自己的本地文件系统中。例如,有一台服务器 IP 是 192.168.1.100,服务器上有 /data/share 目录,现在希望另外一台 Ubuntu 服务器访问这个目录,那么就可以在 NFS 服务端把 /data/share 设置为共享目录,然后在客户端创建 /mnt/share,通过 NFS 将远程目录挂载到 /mnt/share。完成以后,客户端进入 /mnt/share,看到的实际上就是 NFS 服务端 /data/share 中的文件。对于使用者来说,它和操作普通本地目录非常接近,但数据实际存储在 NFS 服务端。

需要注意的是,NFS 本身并不是一种把文件复制到客户端的工具,而是一种网络文件系统。客户端执行挂载以后,对共享目录中的读取、创建、修改和删除等操作,都可能通过网络发送到服务端。因此,NFS 的实际体验不仅取决于服务器磁盘性能,也和客户端与服务端之间的网络延迟、带宽、丢包情况以及 NFS 参数有关。如果只是两台同机房服务器之间共享文件,NFS 通常比较方便;如果跨公网使用,则需要更加重视网络安全、访问控制和稳定性,不建议直接把 NFS 服务端口暴露给整个互联网。

二、在Ubuntu服务器安装NFS服务端

首先需要确定哪台服务器作为 NFS 服务端。服务端负责存储实际的数据,并将指定目录通过 NFS 协议共享出去。假设服务端使用 Ubuntu 22.04 或 Ubuntu 24.04,可以先更新软件包列表,然后安装 nfs-kernel-server

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

安装完成后,可以检查 NFS 服务状态:

sudo systemctl status nfs-server

如果看到 active (exited) 或服务处于正常运行状态,一般说明 NFS 服务已经安装并启动。也可以直接执行:

sudo systemctl enable --now nfs-server

这条命令会同时设置 NFS 服务开机启动并立即启动服务。对于服务器来说,建议安装完成后就确认一下服务状态,因为如果 NFS 服务没有正常启动,后面客户端即使配置完全正确,也无法完成挂载。

接下来准备一个用于共享的目录。例如:

sudo mkdir -p /data/share

为了测试方便,可以在目录中创建一个文件:

sudo touch /data/share/test.txt
echo "NFS test" | sudo tee /data/share/test.txt

查看目录:

ls -lah /data/share

如果能够看到 test.txt,说明共享目录已经准备好了。实际生产环境中,/data/share 可以替换成真正的数据目录,例如网站上传目录、备份目录或者专门的数据盘挂载目录,但不建议一开始就直接共享整个 / 根目录。NFS 共享目录应该尽可能限定在实际需要使用的范围内,这样后续权限控制和安全管理都会更加简单。

三、配置NFS共享目录

NFS 服务端最重要的配置文件是:

/etc/exports

可以使用 nano 编辑:

sudo nano /etc/exports

例如只允许 192.168.1.200 这台客户端服务器访问 /data/share,可以添加:

/data/share 192.168.1.200(rw,sync,no_subtree_check)

保存以后,执行:

sudo exportfs -rav

然后查看当前 NFS 导出的目录:

sudo exportfs -v

如果能够看到 /data/share 以及对应的客户端 IP,说明 NFS 共享目录已经成功发布。

/etc/exports 中的配置格式非常重要。前面的 /data/share 是服务端需要共享的目录,后面的 192.168.1.200 是允许访问的客户端 IP,括号里面则是共享参数。rw 表示客户端拥有读写权限,sync 表示服务器同步处理数据写入,通常更适合需要保证数据写入可靠性的场景,no_subtree_check 可以避免部分目录检查带来的问题,也是比较常见的配置方式。

如果需要允许整个局域网访问,例如局域网网段是 192.168.1.0/24,可以写成:

/data/share 192.168.1.0/24(rw,sync,no_subtree_check)

这样该网段中的客户端都可以根据 NFS 权限访问共享目录。生产环境中更建议按照实际需求限制 IP 或网段,而不是直接使用:

/data/share *(rw,sync,no_subtree_check)

虽然 * 配置简单,但是意味着来源范围非常宽,尤其是在服务器存在公网网络连接的情况下,这种配置并不适合作为默认方案。

四、NFS常用参数怎么选择

NFS 的 /etc/exports 可以配置很多参数,但并不是参数越多越好。普通 Ubuntu 服务器做文件共享时,先使用相对简单、容易维护的配置即可。例如:

/data/share 192.168.1.200(rw,sync,no_subtree_check)

其中 rw 是读写权限;如果客户端只需要读取数据,可以使用 ro,这样可以降低客户端误修改文件的风险。sync 主要用于控制服务端写入行为,在对数据可靠性有要求的场景中比较常见。no_subtree_check 则可以避免子目录检查带来的额外问题。

如果需要让客户端以 root 身份操作共享目录时仍然受到普通用户权限限制,可以关注 root_squash。默认情况下,NFS 通常会将客户端 root 用户映射成匿名用户,以减少客户端 root 权限直接作用于服务端文件的风险。例如:

/data/share 192.168.1.200(rw,sync,no_subtree_check,root_squash)

相反,no_root_squash 会允许客户端 root 用户保留对应权限,这在某些特殊服务器环境中确实有用途,但安全风险也更高。除非明确知道为什么需要使用,否则不建议随意配置 no_root_squash

修改 /etc/exports 后不要忘记重新导出:

sudo exportfs -rav

如果修改了很多配置,也可以重启 NFS 服务:

sudo systemctl restart nfs-server

不过一般修改 exports 后执行 exportfs -rav 就足够了,没有必要每次都重启整个服务。

五、Ubuntu防火墙如何放行NFS

如果 Ubuntu 服务端启用了 UFW 防火墙,还需要考虑防火墙规则。首先查看 UFW 状态:

sudo ufw status

如果没有启用防火墙,则不需要为了 NFS 强行添加规则。如果服务器启用了 UFW,建议只允许指定客户端 IP 或内部网段访问,而不是对所有来源开放。

例如客户端 IP 是 192.168.1.200,可以根据实际环境设置允许规则。NFS 具体需要放行的端口与 NFS 版本和相关服务有关,因此在实际配置时最好先确认服务器当前使用的 NFS 版本及 RPC 服务状态。

可以使用:

sudo ss -lntup | grep -E '2049|111'

查看相关网络服务。

也可以使用:

sudo rpcinfo -p

查看 RPC 注册的服务。

如果是在云服务器上部署 NFS,还需要特别注意云厂商的安全组。即使 Ubuntu 本机 UFW 已经放行,如果云服务器安全组没有允许相关流量,客户端依然可能连接失败。对于云服务器而言,安全组和操作系统防火墙需要同时检查。

六、Ubuntu客户端安装NFS工具

服务端配置完成后,就可以开始配置客户端。假设客户端也是 Ubuntu 系统,需要安装 nfs-common

sudo apt update
sudo apt install nfs-common -y

安装完成后,可以先查看服务端提供了哪些共享目录:

showmount -e 192.168.1.100

这里的 192.168.1.100 替换成 NFS 服务端实际 IP。

正常情况下可能看到类似:

Export list for 192.168.1.100:
/data/share 192.168.1.200

如果能够看到 /data/share,说明客户端已经能够获取 NFS 服务端的导出信息。需要注意,如果服务端使用 NFSv4 或网络环境进行了特殊配置,showmount 的表现可能与传统 NFS 配置不同,所以不能仅仅根据 showmount 是否有结果判断 NFS 服务是否完全正常。

七、创建挂载目录并测试NFS挂载

客户端需要先创建一个本地目录作为挂载点:

sudo mkdir -p /mnt/share

然后执行 NFS 挂载:

sudo mount -t nfs 192.168.1.100:/data/share /mnt/share

如果没有出现任何报错,可以检查:

df -h

或者:

mount | grep nfs

也可以直接进入目录:

cd /mnt/share
ls -lah

如果能够看到服务端刚刚创建的 test.txt,说明基本挂载成功。

为了进一步确认客户端确实可以写入,可以测试:

echo "Hello NFS" | sudo tee /mnt/share/client-test.txt

然后回到服务端:

ls -lah /data/share

如果能够看到 client-test.txt,说明客户端的读写权限已经正常。

需要特别注意,NFS 挂载目录中的文件权限依然和 Linux 用户、用户组以及 UID/GID 有关系。很多新手在这里容易遇到一个问题:客户端用户看起来和服务端用户名一样,但实际 UID 不一样,最终导致文件显示为数字 UID 或者出现没有权限修改文件的情况。因此,如果 NFS 用于多服务器之间共享需要严格控制权限的数据,除了 NFS 本身的 exports 配置,还应该提前规划服务器之间的用户和组 UID/GID。

八、查看NFS当前挂载状态

NFS 挂载成功以后,可以使用下面这些命令确认状态:

df -hT

这个命令可以看到文件系统类型。如果挂载成功,一般会出现 nfsnfs4 等相关类型。

也可以使用:

mount | grep nfs

或者:

findmnt -t nfs,nfs4

findmnt 在排查挂载问题时比较方便,因为它可以比较直观地显示挂载点、源地址和文件系统类型。

例如:

192.168.1.100:/data/share /mnt/share nfs4

这就表示客户端 /mnt/share 当前挂载的是服务端 192.168.1.100/data/share

九、设置Ubuntu开机自动挂载NFS

如果手动 mount 成功,服务器重启之后默认不会自动恢复挂载,因此生产环境一般需要配置 /etc/fstab

编辑:

sudo nano /etc/fstab

添加:

192.168.1.100:/data/share /mnt/share nfs defaults,_netdev 0 0

这里的 _netdev 非常重要,它可以告诉系统这个文件系统依赖网络,在系统启动过程中不要把它当成普通本地磁盘处理。

保存以后,不要马上重启服务器,先执行:

sudo mount -a

如果没有报错,再检查:

df -hT

确认 /mnt/share 已经正常挂载。

如果服务器经常出现网络启动较慢、NFS 服务端暂时不可用等情况,还可以根据具体需求考虑 systemd automount 等方式,让访问目录时再建立挂载。对于普通服务器而言,先使用 fstab + _netdev 就已经可以满足很多场景,不需要一开始就把配置做得过于复杂。

十、Ubuntu NFS挂载失败常见问题

Ubuntu NFS 挂载最常见的问题之一就是客户端连接不到服务端。例如执行:

sudo mount -t nfs 192.168.1.100:/data/share /mnt/share

提示 Connection timed out,这时候不要马上修改 NFS 参数,应该先从网络开始检查。客户端可以测试:

ping 192.168.1.100

然后测试 NFS 相关端口:

nc -zv 192.168.1.100 2049

如果网络本身不通,就应该先检查服务器 IP、路由、安全组和防火墙。如果 TCP 2049 无法连接,则需要重点检查 NFS 服务是否启动以及防火墙是否放行。

另一个常见问题是:

mount.nfs: access denied by server while mounting

这种情况通常与 /etc/exports 中的客户端 IP、网段或权限配置有关。例如服务端配置的是:

/data/share 192.168.1.200(rw,sync,no_subtree_check)

但实际客户端 IP 是 192.168.1.201,那么服务端自然不会允许访问。修改配置后记得执行:

sudo exportfs -rav

然后再次测试。

如果出现:

mount.nfs: No such file or directory

则需要检查服务端共享路径是否写错。例如服务端实际目录是:

/data/share

客户端却写成:

/data/shares

自然无法正常挂载。可以通过服务端:

sudo exportfs -v

确认实际导出的目录。

如果挂载成功,但是客户端无法创建文件,则重点检查 Linux 文件权限。服务端执行:

ls -ld /data/share

查看目录所有者和权限:

ls -lah /data/share

同时检查客户端用户 UID:

id

以及服务端对应用户的 UID:

id username

如果两边 UID/GID 不一致,即使用户名相同,也可能出现权限问题。NFS 并不是通过“用户名字符串”来判断用户身份,而是依赖 UID/GID 等身份信息,因此多服务器环境下统一 UID/GID 往往比单纯创建相同名称的用户更加重要。

十一、NFS挂载后如何卸载

如果需要临时取消挂载,可以使用:

sudo umount /mnt/share

如果提示目标目录正在使用,例如:

target is busy

说明当前还有程序正在访问这个目录。可以先退出 /mnt/share

cd ~

然后检查哪些进程正在使用:

sudo lsof +D /mnt/share

也可以:

sudo fuser -vm /mnt/share

找到占用目录的进程后,再根据实际情况处理。不要为了快速卸载就直接强制结束重要业务进程,尤其是 NFS 被网站程序、数据库备份程序或者其他生产任务使用的时候。

十二、NFS版本怎么选择

现在 Ubuntu 系统通常支持 NFSv3 和 NFSv4 等版本。实际使用中可以明确指定版本进行测试,例如:

sudo mount -t nfs -o vers=4 192.168.1.100:/data/share /mnt/share

也可以测试 NFSv3:

sudo mount -t nfs -o vers=3 192.168.1.100:/data/share /mnt/share

如果默认挂载失败,可以分别测试不同版本,从而判断是不是 NFS 版本兼容或者服务配置导致的问题。NFSv4 在现代 Linux 环境中使用比较普遍,而且架构与传统 NFSv3 有一些区别,因此不要简单地把两种版本的目录结构和网络行为完全当成一样。

如果你的服务器全部是较新的 Ubuntu 系统,而且没有特殊的旧设备兼容要求,可以优先围绕 NFSv4 进行配置;如果是老旧设备、多种 Linux 发行版混合环境,则应该结合实际系统版本进行测试。

十三、生产环境使用NFS需要注意什么

NFS 最大的优势是使用方便,但它并不意味着可以把任意目录直接暴露给公网。尤其是云服务器环境,不建议简单地把 NFS 共享配置成 *,然后开放相关端口给整个互联网。更合理的方式是让 NFS 服务端和客户端处于可信的私有网络、VPC 或专用网络环境中,并在安全组和防火墙层面限制来源 IP。对于跨公网的文件共享需求,也应该结合 VPN、专用网络或者其他安全传输方式进行设计,而不是直接把内部 NFS 服务暴露出来。

另外,NFS 共享目录最好不要直接作为数据库的数据目录使用,除非你非常清楚数据库和 NFS 所使用的文件锁、缓存以及一致性机制。数据库对于磁盘延迟和一致性的要求与普通文件共享不同,直接把 MySQL、PostgreSQL 等数据库的数据目录放到 NFS 上,可能带来性能和稳定性问题。NFS 更适合图片、视频、备份文件、安装包、共享文档、网站静态资源以及多个服务器共同访问的普通文件。

如果 NFS 用于网站文件,例如多个 Web 服务器共同使用一个上传目录,还需要考虑网络延迟和大量小文件访问带来的性能影响。用户上传一张图片和网站后台同时处理大量缩略图时,对 NFS 的读写请求可能会明显增加。如果发现网站访问速度突然受到影响,可以使用 iostatnloadiftop 等工具分别观察磁盘、网络和服务器负载,而不要简单认为“服务器配置不够”。

十四、完整配置示例

最后把整个流程串起来,假设 NFS 服务端 IP 为 192.168.1.100,客户端 IP 为 192.168.1.200,服务端共享 /data/share,客户端挂载到 /mnt/share

服务端首先安装:

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

创建共享目录:

sudo mkdir -p /data/share

编辑:

sudo nano /etc/exports

加入:

/data/share 192.168.1.200(rw,sync,no_subtree_check)

应用配置:

sudo exportfs -rav

确认:

sudo exportfs -v

客户端安装:

sudo apt update
sudo apt install nfs-common -y

查看共享:

showmount -e 192.168.1.100

创建挂载点:

sudo mkdir -p /mnt/share

手动挂载:

sudo mount -t nfs 192.168.1.100:/data/share /mnt/share

检查:

df -hT

测试写入:

echo "NFS test" | sudo tee /mnt/share/test.txt

确认无误以后配置开机自动挂载:

sudo nano /etc/fstab

添加:

192.168.1.100:/data/share /mnt/share nfs defaults,_netdev 0 0

最后测试:

sudo umount /mnt/share
sudo mount -a
df -hT

如果 /mnt/share 可以正常出现,并且能够读取服务端文件,那么整个 Ubuntu NFS 挂载流程就基本完成了。

对于大多数 Ubuntu 服务器来说,NFS 配置本身并不复杂,真正容易出问题的地方主要集中在三个方面:第一是 /etc/exports 的客户端 IP 和权限设置,第二是服务器安全组、UFW 以及网络连接,第三是客户端和服务端的 UID/GID 与文件权限。只要按照“先配置服务端共享目录,再通过 exportfs 发布,然后客户端安装 nfs-common,手动挂载测试,最后写入 /etc/fstab”这个顺序进行,排查问题会简单很多。对于个人服务器、小型网站、多台 Linux 服务器之间共享文件,NFS 是一种比较直接的方案;而如果涉及公网、大规模数据、高并发访问或者数据库存储,则应该根据网络、存储和安全需求进一步选择合适的架构,而不是单纯把所有数据目录都放到 NFS 上。

未经允许不得转载:djvps820 » Ubuntu NFS挂载怎么配置?从安装到挂载的完整