Debian 11 NFS挂载配置教程:一步步教你实现网络文件共享
NFS简介
NFS(网络文件系统)是一种分布式文件系统协议,允许您在服务器上挂载远程目录。这使得您可以在不同位置管理存储空间,并允许多个客户端向该空间写入数据。NFS提供了一种相对标准和高效的方式,通过网络访问远程系统,尤其适用于需要定期访问共享资源的场景。
在本指南中,您将学习如何在Debian 11上安装NFS相关软件,配置服务器和客户端上的两个NFS挂载点,以及如何挂载和卸载远程共享。
先决条件
在本教程中,您将使用两台服务器,其中一台将部分文件系统共享给另一台。为了顺利完成本教程,您需要:
- 两台Debian 11服务器。每台服务器都应配置一个具有
sudo
权限的非root用户,一个使用UFW设置的防火墙,如果可用,还应配置私有网络。有关如何设置具有sudo
权限的非root用户和防火墙的帮助,请参阅我们的Debian 11初始服务器设置指南。 - 如果您正在使用Silicon Cloud的vServer作为服务器和客户端,您可以查阅我们的文档如何创建VPC,了解更多关于设置私有网络的信息。
在本教程中,共享其目录的服务器将被称为“主机”,挂载这些目录的服务器将被称为“客户端”。您需要知道两者的IP地址。如果可用,请确保使用私有网络地址。
在本教程中,这些IP地址将用占位符host_ip
和client_ip
代替。请根据您的实际情况进行替换。
步骤一 — 下载并安装组件
您需要先在每台服务器上安装必要的组件。
在主机上
在主机服务器上安装nfs-kernel-server
软件包,这将允许您共享目录。由于这是您在此会话中执行的第一个操作,请在安装之前刷新本地软件包索引。
- sudo apt update
- sudo apt install nfs-kernel-server
安装完这些软件包后,切换到客户端服务器。
在客户端上
在客户端服务器上,您需要安装一个名为nfs-common
的软件包,该软件包提供NFS功能,但不包含任何服务器组件。同样,在安装之前刷新本地软件包索引,以确保您具有最新的信息。
- sudo apt update
- sudo apt install nfs-common
现在两台服务器都已经安装了必要的软件包,您可以开始对它们进行配置了。
步骤二 — 在主机上创建共享目录
您将共享两个具有不同配置设置的目录,以说明NFS挂载在超级用户访问方面的两种关键方式。
超级用户可以在系统上的任何地方执行任何操作。然而,NFS挂载目录并非所挂载系统的一部分,因此默认情况下,NFS服务器会拒绝执行需要超级用户权限的操作。这一默认限制意味着客户端上的超级用户不能以root身份写入文件、重新分配所有权,或在NFS挂载上执行其他超级用户任务。
然而,有时客户端系统上有些受信任的用户需要在已挂载的文件系统上执行这些操作,但实际上他们并不需要在主机上获得超级用户权限。您可以配置NFS服务器来允许这样的操作,尽管这会引入一定的风险,因为这样的用户可能会获得对整个主机系统的root访问权限。
示例1: 导出通用型挂载
在第一个示例中,您将创建一个通用的NFS挂载,使用默认的NFS行为,以使在客户端机器上具有root权限的用户难以通过使用客户端超级用户权限与主机进行交互。您可以使用类似以下代码来存储使用内容管理系统上传的文件,或者为用户创建空间以便轻松共享项目文件。
首先,在主机服务器上创建共享目录。
- sudo mkdir /var/nfs/general -p
mkdir
的-p
选项会创建目录,如果需要的话,还会创建所有父目录。
由于您是使用sudo
创建它,该目录将归主机的root用户所有。
- ls -dl /var/nfs/general
drwxr-xr-x 2 root root 4096 Apr 17 23:51 /var/nfs/general
为了安全起见,NFS会将客户端上的任何root操作转换为nobody:nogroup
的凭据。因此,您需要更改目录的所有权以符合这些凭据。
- sudo chown nobody:nogroup /var/nfs/general
drwxr-xr-x 2 nobody nogroup 4096 Apr 17 23:51 /var/nfs/general
您现在可以导出这个目录了。
示例2: 导出家目录
在第二个示例中,目标是使用户主目录存储在主机上,并在客户端服务器上可用,同时允许受信任的客户端服务器管理员访问他们需要方便管理用户的权限。
为了做到这一点,您需要导出/home
目录。由于它已经存在,您不需要创建它。您也不会改变权限。如果您这样做的话,可能会给使用主机机器上的家目录的任何人带来一系列问题。
步骤三 — 配置主机服务器上的NFS导出
接下来,您将进入NFS配置文件中设置共享这些资源。
在主机上以root权限打开您的文本编辑器,打开/etc/exports
文件。
- sudo nano /etc/exports
文件中的注释显示了每个配置行的一般结构。语法如下:
/etc/exports
directory_to_share client(share_option1,...,share_optionN)
您需要为您计划共享的每个目录创建一行。请确保将此处显示的 client_ip
占位符更改为您实际的客户端公共IP地址。
/var/nfs/general client_ip(rw,sync,no_subtree_check)
/home client_ip(rw,sync,no_root_squash,no_subtree_check)
在这里,您使用相同的配置选项对两个目录进行配置,除了 no_root_squash
。让我们看一下每个选项的含义:
- rw: 此选项赋予客户端计算机对卷的读写访问权限。
- sync: 此选项强制NFS在回复之前将更改写入磁盘。这会带来一个更稳定和一致的环境,因为回复反映了远程卷的实际状态。然而,它也会降低文件操作的速度。
- no_subtree_check: 此选项阻止子树检查,子树检查是一个过程,主机必须为每个请求检查文件是否实际仍然在导出的树中可用。当文件在客户端打开时被重命名,这可能会导致许多问题。在几乎所有情况下,最好禁用子树检查。
- no_root_squash: 默认情况下,NFS会将来自远程root用户的请求转换为服务器上的非特权用户。这旨在作为一项安全功能,以防止客户端上的root账户以root身份使用主机的文件系统。
no_root_squash
会禁用此行为,适用于某些共享。
当您完成对文件进行更改后,保存并关闭文件。然后,为您配置的客户端使共享可用,使用以下命令重启NFS服务器。
- sudo systemctl restart nfs-kernel-server
在您实际使用新的共享之前,您需要确保防火墙规则允许对共享的流量。
第四步 — 调整主机上的防火墙
首先,检查防火墙的状态,看看是否启用,并且如果启用的话,查看当前允许的内容。
- sudo ufw status
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
在您的系统上,只有SSH流量被允许通过,因此您需要为NFS流量添加一条规则。
在许多应用程序中,您可以使用 sudo ufw app list
并按名称启用它们,但NFS不是其中之一。然而,由于 ufw
还会检查 /etc/services
以查找服务的端口和协议,您仍然可以按名称添加NFS。最佳实践建议您启用最具限制性的规则,但仍然允许所需的流量,因此不要仅从任何地方启用流量,要具体指定。
请使用以下命令来打开主机上的端口2049,确保将您的客户端公共IP地址替换进去。
- sudo ufw allow from client_ip to any port nfs
您可以通过输入以下命令来验证更改。
- sudo ufw status
您应该在输出中看到允许从端口2049传输的流量。
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
2049 ALLOW client_ip
OpenSSH (v6) ALLOW Anywhere (v6)
这证实只有来自客户端的NFS流量才能在端口2049上通过UFW进行许可。
第五步 – 在客户端创建挂载点并挂载目录
现在主机服务器已经配置好并正在提供其共享功能,您将准备您的客户端。
为了使远程共享在客户端上可用,您需要将主机上要共享的目录挂载到客户端的空目录上。
注意:
如果在您的挂载点中存在文件和目录,在您挂载NFS共享之后它们将会隐藏起来。为了避免丢失重要文件,请确保如果您挂载到一个已经存在的目录中,则该目录是空的。
这是文章《如何在Debian 11上设置NFS挂载》的第3部分(共4部分)。
在客户端上创建两个用于NFS挂载的目录:
- sudo mkdir -p /nfs/general
- sudo mkdir -p /nfs/home
现在,您已经为存储远程共享文件准备好了位置,并且防火墙也已配置妥当。接下来,您可以使用NFS服务器的IP地址来挂载这些共享目录。
- sudo mount host_ip:/var/nfs/general /nfs/general
- sudo mount host_ip:/home /nfs/home
上述指令会将NFS服务器上的共享文件夹挂载到客户端上。您可以通过多种方式验证挂载是否成功,例如使用 mount
或 findmnt
命令。然而,df -h
命令提供了更易读的输出,它会列出可用的磁盘空间,方便您快速查看挂载状态。
- df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 198M 972K 197M 1% /run
/dev/vda1 50G 3.5G 47G 7% /
tmpfs 989M 0 989M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/vda15 105M 5.3M 100M 5% /boot/efi
tmpfs 198M 4.0K 198M 1% /run/user/1000
10.124.0.3:/var/nfs/general 25G 5.9G 19G 24% /nfs/general
10.124.0.3:/home 25G 5.9G 19G 24% /nfs/home
您挂载的两个共享文件夹都显示在输出的底部。由于它们都来自同一个文件系统,因此它们显示的磁盘使用情况是相同的。如果想查看每个挂载点实际使用的空间大小,可以使用 du
命令配合挂载路径。使用 -s
选项可以提供使用情况的摘要,而不是显示每个文件的使用情况;-h
选项则会以人类可读的格式输出结果。
例如:
- du -sh /nfs/home
36K /nfs/home
这表明整个主目录的内容仅使用了36K的可用空间。
第六步 – 测试NFS访问
接下来,通过向每个共享文件夹写入内容来测试访问权限。
示例1:通用共享
首先,将一个测试文件写入 /nfs/general
共享目录中。
- sudo touch /nfs/general/general.test
然后,检查它的所有权:
- ls -l /nfs/general/general.test
-rw-r--r-- 1 nobody nogroup 0 Apr 18 00:02 /nfs/general/general.test
由于您未更改NFS的默认行为,并且通过 sudo
命令作为客户端的root用户创建了该文件,因此该文件的所有权默认为 nobody:nogroup
。这意味着客户端的超级用户无法在此NFS挂载的共享上执行典型的管理操作,例如更改文件的所有者或为一组用户创建新目录。
示例2:家目录共享
为了比较“通用共享”和“家目录共享”的权限,请按照相同的方式在 /nfs/home
目录下创建一个文件。
- sudo touch /nfs/home/home.test
然后查看文件的所有权:
- ls -l /nfs/home/home.test
-rw-r--r-- 1 root root 0 Apr 18 00:03 /nfs/home/home.test
您使用 sudo
命令以与 general.test
文件相同的方式创建了 home.test
,并且以root用户的身份创建。然而,这种情况下由于您在挂载时指定了 no_root_squash
选项,所以它被 root
拥有。这允许客户端上的root用户作为root进行操作,从而在用户账户管理方面更加方便。同时,也意味着您不必在NFS服务器上给这些用户root访问权限。
第七步 – 启动时挂载远程NFS目录
在Debian 11上设置NFS挂载:自动挂载与卸载
这是文章《如何在Debian 11上设置NFS挂载》的第4部分(共4部分)。
自动挂载NFS共享
您可以通过将远程NFS共享添加到客户端的/etc/fstab
文件中,实现在系统启动时自动挂载它们。
使用管理员权限在文本编辑器中打开此文件:
sudo nano /etc/fstab
在文件底部,为每个共享添加一行。格式如下:
/etc/fstab
-> 文件系统表
. . .
host_ip:/var/nfs/general /nfs/general nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0
host_ip:/home /nfs/home nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0
请确保保存并关闭此文件,以便您的更改生效。
注意:您可以在NFS手册页面中找到有关您指定选项的更多信息。您可以通过运行以下命令访问该页面:
man nfs
尽管建立连接和共享信息可用可能需要一些时间,但客户端将在启动时自动挂载远程分区。
步骤8 — 卸载NFS远程共享
如果您不再希望远程目录挂载在您的系统上,可以通过进入共享的目录结构之外并取消挂载来卸载它,操作如下:
cd ~
sudo umount /nfs/home
sudo umount /nfs/general
请注意,命令的名称是umount
,而不是您可能期望的unmount
。
这将删除远程共享,仅保留您可以访问的本地存储。您可以通过运行df -h
命令来验证:
df -h
输出示例:
Filesystem Size Used Avail Use% Mounted on
tmpfs 198M 972K 197M 1% /run
/dev/vda1 50G 3.5G 47G 7% /
tmpfs 989M 0 989M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/vda15 105M 5.3M 100M 5% /boot/efi
tmpfs 198M 4.0K 198M 1% /run/user/1000
如果您还希望防止它们在下次重新启动时重新挂载,可以编辑/etc/fstab
文件,删除相应的行或在行的开头添加#
字符进行注释。您还可以通过移除自动挂载选项(auto
)来防止自动挂载,这将使您仍然能够手动挂载它。
结论
在本教程中,您创建了一个NFS主机,并通过创建两个不同的NFS挂载来展示了一些关键的NFS行为,然后您与一个NFS客户端共享了这些挂载。
如果您想在生产环境中实施NFS,重要的是要注意该协议本身并没有加密。在您在私人网络上共享的情况下,这可能不是一个问题。但在其他情况下,将需要使用VPN或其他类型的加密隧道来保护您的数据。