如何在Ubuntu 18.04上设置NFS挂载点

介绍

NFS,或称网络文件系统,是一种分布式文件系统协议,允许您挂载远程目录到您的服务器上。这使您可以在不同位置管理存储空间,并从多个客户端向该空间写入。NFS提供了一种相对标准且性能良好的方式,通过网络访问远程系统,在共享资源需要定期访问的情况下效果良好。

在本指南中,您将学习如何在Ubuntu 18.04上安装NFS功能所需的软件,配置服务器和客户端上的NFS挂载,以及挂载和卸载远程共享。

先决条件

在本教程中,我们将使用两台服务器,其中一台将其文件系统的一部分与另一台共享。要完成本教程,您将需要:

  • 两台Ubuntu 18.04服务器。每台都应配置一个非root用户,并设置sudo特权,使用UFW设置防火墙,并且如果可用的话,设置私有网络。

在本教程中,我们将共享其目录的服务器称为主机,将挂载这些目录的服务器称为客户端。我们将使用以下IP地址作为主机客户端值的替代:

  • 主机:203.0.113.0
  • 客户端:203.0.113.24

当这些IP地址出现在命令和配置文件中时,请将它们替换为您自己相应的主机客户端 IP地址。

步骤1 — 下载和安装组件

首先,在每台服务器上安装必要的组件。

在主机上

主机服务器上,安装nfs-kernel-server软件包,这将允许您共享您的目录。由于这是您在本次会话中执行的第一个操作,请在安装之前刷新本地软件包索引:

  1. sudo apt update

接下来,安装软件包:

  1. sudo apt install nfs-kernel-server

安装了这些软件包后,请切换到客户端服务器。

在客户端

客户端服务器上,安装一个名为nfs-common的软件包,该软件包提供了NFS功能,但不包括服务器组件。再次在安装之前刷新本地软件包索引,以确保您拥有最新的信息:

  1. sudo apt update

然后,安装软件包:

  1. sudo apt install nfs-common

现在,两个服务器都安装了必要的软件包,您可以开始配置它们了。

步骤2 — 在主机上创建共享目录

我们将共享两个不同配置设置的单独目录,以便说明NFS挂载可以根据超级用户访问的两种主要方式进行配置。

超级用户可以在其系统上的任何地方执行任何操作。但是,NFS 挂载的目录不属于其所挂载的系统的一部分,因此,默认情况下,NFS 服务器拒绝执行需要超级用户权限的操作。这种默认限制意味着客户端上的超级用户无法以 root 身份编写文件、重新分配所有权或在 NFS 挂载上执行任何其他超级用户任务。

然而,有时客户端系统上有信任的用户需要在挂载的文件系统上执行这些操作,但是他们在主机上不需要超级用户访问权限。您可以配置 NFS 服务器以允许此操作,尽管这会引入一定的风险,因为这样的用户可以获得对整个主机系统的 root 访问权限。

示例 1: 导出通用目录挂载

在第一个示例中,您将创建一个通用的 NFS 挂载,该挂载使用默认的 NFS 行为,使得客户端机器上具有 root 权限的用户使用这些客户端超级用户权限与主机进行交互变得困难。您可以使用类似以下内容存储使用内容管理系统上传的文件,或者为用户创建共享项目文件的空间。

首先,创建一个共享目录:

  1. sudo mkdir /var/nfs/general -p

由于您是使用 sudo 创建它的,所以该目录由 主机root 用户拥有:

  1. ls -la /var/nfs/general
Output
total 8 drwxr-xr-x 2 root root 4096 Feb 7 23:21 . drwxr-xr-x 3 root root 4096 Feb 7 23:21 ..

NFS 将任何 root 操作都转换为 客户端 上的 nobody:nogroup 凭据作为安全措施。因此,您需要更改目录所有权以匹配这些凭据:

  1. sudo chown nobody:nogroup /var/nfs/general

现在您已准备好导出此目录。

示例 2:导出主目录

在我们的第二个示例中,目标是将存储在 主机 上的用户主目录提供给 客户端 服务器,同时允许这些 客户端 服务器的受信任管理员方便地管理用户。

为此,您将导出 /home 目录。由于它已经存在,您不需要创建它。您也不会更改权限。如果您这样做,可能会给 主机 上具有主目录的任何人带来一系列问题。

步骤 3 — 在主机服务器上配置 NFS 导出

接下来,我们将深入研究NFS配置文件,设置共享这些资源。

主机上,使用具有root权限的首选文本编辑器打开/etc/exports文件。这里我们将使用nano:

  1. sudo nano /etc/exports

文件中有注释显示每个配置行的一般结构。语法如下:

/etc/exports
directory_to_share    client(share_option1,...,share_optionN)

您需要为计划共享的每个目录创建一行。由于我们的示例客户端的IP是203.0.113.24,我们的行将如下所示。确保将IP地址更改为您的客户端的IP:

/etc/exports
/var/nfs/general    203.0.113.24(rw,sync,no_subtree_check)
/home       203.0.113.24(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会为某些共享禁用此行为。

完成更改后,请保存并关闭文件。如果您使用nano,可以按CTRL + X然后YENTER来执行此操作。然后,要使您配置的共享对客户端可用,请使用以下命令重新启动NFS服务器:

  1. sudo systemctl restart nfs-kernel-server

但在实际使用新共享之前,您需要确保防火墙规则允许对共享的流量。

步骤4 — 调整主机防火墙

首先,检查防火墙状态以确认是否已启用,并查看当前允许的内容:

  1. sudo ufw status
Output
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 地址:

  1. sudo ufw allow from 203.0.113.24 to any port nfs

您可以通过运行以下命令来验证更改:

  1. sudo ufw status

您应该在输出中收到允许从端口2049发送的流量的列表:

Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere 2049 ALLOW 203.0.113.24 OpenSSH (v6) ALLOW Anywhere (v6)

这证实了UFW将仅允许来自您的客户端机器的端口2049的NFS流量。

步骤5 —— 在客户端上创建挂载点并挂载目录

现在,主机服务器已配置并提供其共享,您将准备好您的客户端

要在客户端上提供远程共享,您需要将要共享到客户端上的空目录挂载到主机上。

注意:如果您的挂载点中有文件和目录,它们将在您挂载NFS共享后变为隐藏。为避免丢失重要文件,请确保如果您挂载到已经存在的目录中,那么该目录是空的。

为您的挂载创建两个目录。运行以下命令来创建第一个:

  1. sudo mkdir -p /nfs/general

然后运行此命令来创建第二个:

  1. sudo mkdir -p /nfs/home

现在,您有了一个放置远程共享的位置,并且已经打开了防火墙,您可以通过使用您的主机服务器的IP地址来挂载共享,在本指南中,IP地址为203.0.113.0

  1. sudo mount 203.0.113.0:/var/nfs/general /nfs/general
  2. sudo mount 203.0.113.0:/home /nfs/home

这些命令将从主机计算机挂载共享到客户机。您可以通过几种方式来双重检查它们是否成功挂载。您可以使用mountfindmnt命令检查此事,但df -h提供了更易读的输出,显示了NFS共享的磁盘使用情况的不同方式:

  1. df -h
Output
Filesystem Size Used Avail Use% Mounted on udev 480M 0 480M 0% /dev tmpfs 99M 5.6M 94M 6% /run /dev/vda1 25G 1.3G 23G 6% / tmpfs 493M 0 493M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 493M 0 493M 0% /sys/fs/cgroup /dev/vda15 105M 4.4M 100M 5% /boot/efi tmpfs 99M 0 99M 0% /run/user/1000 203.0.113.0:/var/nfs/general 25G 1.3G 23G 6% /nfs/general 203.0.113.0:/home 25G 1.3G 23G 6% /nfs/home

您挂载的这两个共享出现在底部。因为它们是从同一文件系统挂载的,所以它们显示相同的磁盘使用情况。要检查每个挂载点实际使用了多少空间,请使用磁盘使用命令du和挂载的路径。-s标志提供了摘要使用情况,而不是显示每个文件的使用情况。-h打印人类可读的输出:

  1. du -sh /nfs/home
Output
44K /nfs/home

这向您展示整个家目录的内容仅使用了可用空间的44K。

步骤6 — 测试NFS访问

接下来,通过向每个共享写入内容来测试对其的访问。

示例1:通用共享

首先,向/var/nfs/general共享写入一个测试文件:

  1. sudo touch /nfs/general/general.test

然后,检查其所有权:

  1. ls -l /nfs/general/general.test
Output
-rw-r--r-- 1 nobody nogroup 0 Feb 7 23:53 /nfs/general/general.test

因为您挂载了此卷而未更改NFS的默认行为,并且通过sudo命令以客户端机器的root用户创建了文件,文件的所有权默认为nobody:nogroup客户端超级用户将无法执行典型的管理操作,例如更改文件的所有者或为一组用户创建新目录,这是因为这个NFS挂载的共享。

示例2:主目录共享

为了比较通用共享和主目录共享的权限,请以相同的方式在/nfs/home中创建一个文件:

  1. sudo touch /nfs/home/home.test

然后查看文件的所有权:

  1. ls -l /nfs/home/home.test
Output
-rw-r--r-- 1 root root 0 Feb 7 23:56 /nfs/home/home.test

您使用sudo命令创建了home.test,就像您创建general.test文件一样。然而,在这种情况下,它由root所有,因为您在此挂载时指定了no_root_squash选项,覆盖了默认行为。这允许您客户端机器上的root用户以root身份运行,并使用户帐户的管理变得更加方便。同时,这意味着您不必在主机上给这些用户root访问权限。

步骤 7 — 在启动时挂载远程 NFS 目录

您可以通过将它们添加到客户端/etc/fstab文件中,在启动时自动挂载远程 NFS 共享。

使用根权限在您喜欢的文本编辑器中打开以下文件:

  1. sudo nano /etc/fstab

在文件末尾,添加每个共享的一行,如下所示:

/etc/fstab
. . .
203.0.113.0:/var/nfs/general    /nfs/general   nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0
203.0.113.0:/home       /nfs/home      nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0

注意:您可以在NFS的man页面中找到有关此处指定的选项的更多信息。您可以通过运行以下命令来访问此页面:

  1. man nfs

客户端服务器将在启动时自动挂载远程分区,尽管建立连接并使共享可用可能需要一些时间。

第 8 步 — 卸载 NFS 远程共享

如果您不再希望远程目录挂载到您的系统上,可以通过移出共享的目录结构并卸载它来取消挂载。

首先进入主目录:

  1. cd ~

然后卸载 /nfs/home。请注意,命令名为 umount 而不是您可能期望的 unmount

  1. sudo umount /nfs/home

接下来,卸载 /nfs/general

  1. sudo umount /nfs/general

这将移除远程共享,仅留下您的本地存储可访问:

  1. df -h
Output
Filesystem Size Used Avail Use% Mounted on udev 480M 0 480M 0% /dev tmpfs 99M 5.5M 94M 6% /run /dev/vda1 25G 1.3G 23G 6% / tmpfs 493M 0 493M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 493M 0 493M 0% /sys/fs/cgroup /dev/vda15 105M 4.4M 100M 5% /boot/efi tmpfs 99M 0 99M 0% /run/user/1000

如果您还希望防止它们在下次启动时重新挂载,编辑 /etc/fstab,并删除该行或在行首加上 # 字符进行注释。您也可以通过删除 auto 选项来阻止自动挂载,这将允许您手动挂载它。

结论

在这个教程中,您创建了一个NFS主机,并通过创建两个不同的NFS挂载来说明了一些关键的NFS行为,这些挂载是您与您的NFS客户端共享的。如果您想要在生产环境中实现NFS,重要的是要注意协议本身并不加密。在您在私有网络上共享文件的情况下,这可能不是一个问题。在其他情况下,将需要使用VPN或其他类型的加密隧道来保护您的数据。请注意,这通常会导致性能显著降低。如果性能是一个问题,考虑使用SSHFS

Source:
https://www.digitalocean.com/community/tutorials/how-to-set-up-an-nfs-mount-on-ubuntu-18-04