如何在Debian 11上设置NFS挂载
介绍
NFS,即网络文件系统,是一种分布式文件系统协议,允许您在服务器上挂载远程目录。这使您能够在不同位置管理存储空间,并从多个客户端向该空间写入。NFS提供了一种相对标准和高效的方式,通过网络访问远程系统,并在需要定期访问共享资源的情况下运作良好。
在本指南中,您将学习如何在Debian 11上安装用于NFS功能的软件,配置服务器和客户端上的两个NFS挂载点,以及挂载和卸载远程共享。
先决条件 jué
在这个教程中,你将使用两个服务器,其中一个将其文件系统的一部分与另一个共享。为了跟上,你将需要:
- Two Debian 11 servers. Each of these should have a non-root user with sudo privileges, a firewall set up with UFW, and private networking, if it’s available to you.For assistance setting up a non-root user with sudo privileges and a firewall, follow our Initial Server Setup with Debian 11 guide.
If you’re using Silicon Cloud vServers for your server and client, you can read more about setting up a private network in our documentation on How to Create a 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会将客户端上的任何根操作转化为 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目录。由于它已经存在,你不需要创建它。你也不会改变权限。如果你这样做的话,可能会给使用主机机器上的家目录的任何人带来一系列问题。
步骤3 — 配置主机服务器上的NFS导出
接下来,您将进入NFS配置文件中设置共享这些资源。
在主机上以root权限打开你的文本编辑器,打开/etc/exports文件。
- sudo nano /etc/exports
文件中的注释显示了每个配置行的一般结构。语法如下:
– 导出目录 (/etc/exports)
Note: This translation assumes that “exports” refers to the “export” function used in file systems to share directories with other systems. If “exports” refers to another context, please provide more information for an accurate translation.
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: This option gives the client computer both read and write access to the volume.
- sync: This option forces NFS to write changes to disk before replying. This results in a more stable and consistent environment since the reply reflects the actual state of the remote volume. However, it also reduces the speed of file operations.
- no_subtree_check: This option prevents subtree checking, which is a process where the host must check whether the file is actually still available in the exported tree for every request. This can cause many problems when a file is renamed while the client has it opened. In almost all cases, it is better to disable subtree checking.
- no_root_squash: By default, NFS translates requests from a root user remotely into a non-privileged user on the server. This was intended as security feature to prevent a root account on the client from using the file system of the host as root. no_root_squash disables this behavior for certain shares.
当您完成对文件进行更改后,保存并关闭文件。然后,为您配置的客户端使共享可用,使用以下命令重启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进行许可。
第五步 – 在客户端创建挂载点并挂载目录
现在主机服务器已经配置好并正在提供其共享功能,您将准备您的客户端。
为了使远程共享在客户端上可用,您需要将主机上要共享的目录挂载到客户端的空目录上。
Note
在客户机上创建两个用于挂载的目录。
- sudo mkdir -p /nfs/general
- sudo mkdir -p /nfs/home
现在,您有一个用于存储远程共享文件的位置,并且您已经打开了防火墙,您可以使用主机服务器的IP地址来挂载这些共享文件。
- sudo mount host_ip:/var/nfs/general /nfs/general
- sudo mount host_ip:/home /nfs/home
以下指令将会将主机计算机上的共享文件夹挂载到客户机上。您可以通过多种方式来确认挂载是否成功。您可以使用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:普通股份
首先,将一个测试文件写入/var/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进行操作,从而在用户账户管理方面更加方便。同时,也意味着你不必在主机上给这些用户root访问权限。
第七步 – 启动时挂载远程NFS目录
您可以通过将远程NFS共享添加到客户机的/etc/fstab文件中,在启动时自动挂载它们。
使用管理员权限在文本编辑器中打开这个文件。
- sudo nano /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
请确保保存并关闭此文件,以便您的更改生效。
Note
man nfs
尽管建立连接和共享信息可用可能需要一些时间,但客户端将在启动时自动挂载远程分区。
步骤8 — 卸载一个NFS远程共享
如果你不再希望远程目录挂载在你的系统上,你可以通过移出共享的目录结构并取消挂载来卸载它,就像这样:
- cd ~
- sudo umount /nfs/home
- sudo umount /nfs/general
请注意,命令的名称是umount,而不是你可能期望的unmount。
这将删除远程共享,仅保留您可以访问的本地存储。
- 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文件,删除该行或在行的开头加上#字符进行注释。您还可以通过移除自动挂载选项来防止自动挂载,这将使您仍然能够手动挂载它。
结论是
在这个教程中,你创建了一个 NFS 主机,并通过创建两个不同的 NFS 挂载来展示了一些关键的 NFS 行为,然后你与一个 NFS 客户端共享了这些挂载。
如果你想在生产环境中实施NFS,重要的是要注意该协议本身并没有加密。在你在私人网络上共享的情况下,这可能不是一个问题。但在其他情况下,将需要使用VPN或其他类型的加密隧道来保护你的数据。