(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 共享应该已经消失。


参考

https://www.atlantic.net/dedicated-server-hosting/how-to-install-and-configure-nfs-server-on-debian-11/