(Network File System 网络文件系统和 Need for Speed 极品飞车的缩写都是 NFS~)
先决条件
- 两台 Linux 服务器,一台开共享一台挂载共享。
- (可选,强烈推荐)为上面两台服务器安装 tailscale 组虚拟局域网。NFS 是基于主机的,并没有内置的密码验证机制,因此暴露于公网并不安全;而使用 Kerberos 身份验证又过于麻烦。安装 tailscale 可见: 大内网战略(1):使用 Tailscale 搭建 VLAN - 知乎。两台服务器都有公网 IP 就相当于点对点的 VNet;没有就相当于内网穿透。
提示
示例服务端为 debian 11,客户端为 Ubuntu 2004 LTS。Red Hat 系的发行版(如 CentOS)命令不相同,需自行网上搜索替换,但是流程大差不差。
服务端设置
安装 NFS 服务端包,并启动服务和开机启动
sudo apt-get update
sudo apt-get install nfs-kernel-server
sudo systemctl start nfs-server
sudo systemctl enable nfs-server
创建挂载文件夹,并往其中新建文件
sudo mkdir -p /nfsshare/share1
sudo chown $USER:$USER /nfsshare/share1
touch /nfsshare/share1/test1.txt
echo "Hello, world!" > /nfsshare/share1/test1.txt
配置NFS共享
sudo vim /etc/exports
在末尾添加:
# *号允许所有IP访问(如果暴露于公网则强烈不建议),替换为IP或者主机名就是只允许该主机访问本NFS
/nfsshare/share1 *(rw,sync,no_subtree_check)
其他参数:
rw
:指定共享为读写权限。这允许客户端计算机在共享上执行读和写操作。ro
:指定共享为只读权限。这将限制客户端计算机只能在共享上执行读操作。sync
:此选项要求服务器在接收到写操作后立即将数据同步写入磁盘。这提供了较高的数据一致性,但可能会影响性能。async
:与sync
相反,此选项允许服务器将写操作缓冲起来,并在适当的时候写入磁盘。这可能会提高性能,但可能会导致数据在写操作期间丢失。no_subtree_check
:此选项禁用子树检查,这可以提高性能。这是默认行为。子树检查会导致NFS服务器检查每个目录的权限和访问控制列表 (ACL),以确保客户端具有访问权限。no_root_squash
:默认情况下,NFS服务器会将来自root用户的请求映射为匿名用户,这称为"root squashing"。使用此选项可以禁用这种映射,允许root用户在共享上保留其权限。all_squash
:此选项将所有用户请求映射为匿名用户,不考虑其真实身份。这可用于强制用户在共享上的操作以匿名身份执行。subtree_check
:启用子树检查,确保共享的每个目录都受到检查。
重启服务:
sudo systemctl restart nfs-server
sudo systemctl status nfs-server
如下图就是成功启动:

此时输入 sudo showmount -e
,会显示所有目前活跃的 NFS 共享。
最后,如果你选择将 NFS 服务暴露于公网,需要在云服务器安全面板和服务器防火墙中放行 NFS 使用的TCP和UDP端口 2049;而若使用 tailscale 等 VNet 则不需要。
客户端设置
安装、创建挂载点
sudo apt-get update
sudo apt-get install nfs-common
sudo mkdir -p /mnt/nfsshare_test1
sudo chown $USER:$USER /mnt/nfsshare_test1
挂载
备份并打开 /etc/fstab
sudo cp /etc/fstab /etc/fstab.bak
sudo vim /etc/fstab
在末尾添加:
<NFS服务器IP>:/nfsshare/share1 /mnt/nfsshare_test1 nfs defaults 0 0
保存并关闭,然后输入
sudo mount -a
df -h
如果成功,应该如下图:

检查挂载
echo "Hello world again!" >> "/mnt/nfsshare_test1/test2.txt"
ls /mnt/nfsshare_test1 -l -a
cat /mnt/nfsshare_test1/test1.txt
cat /mnt/nfsshare_test1/test2.txt
你的输入应该类似于下图:

解除共享
客户端卸掉挂载
提示
客户端卸掉挂载不会关闭服务端的 NFS 服务,也不会删掉 NFS 里的文件。
首先删除开机自动挂载: sudo vim /etc/fstab
,删除添加的那行,然后保存并关闭。
然后卸掉挂载:
cd /
sudo umount /mnt/nfsshare_test1
df -h
df -h
显示应该没有了挂载。
服务器停止共享
提示
停止共享前请确保所有客户端都已卸掉该共享。停止共享不会删除文件。
sudo vim /etc/exports
,删除或者注释掉添加的共享。
然后重启服务:
sudo systemctl restart nfs-server
此时输入 sudo showmount -e
,之前的 NFS 共享应该已经消失。
Comments NOTHING