如何在Ubuntu18.04上设置NFS挂载

来自菜鸟教程
跳转至:导航、​搜索

介绍

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

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

先决条件

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

  • 两台 Ubuntu 18.04 服务器。 每个都应该有一个非 root 用户,配置了 sudo 权限,使用 UFW 设置的防火墙,以及私有网络(如果您可以使用)。

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

  • 主持人: 203.0.113.0
  • 客户: 203.0.113.24

当这些 IP 地址出现在命令和配置文件中时,将它们替换为您各自的 hostclient IP 地址。

第 1 步 — 下载和安装组件

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

在主机上

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

sudo apt update

接下来,安装软件包:

sudo apt install nfs-kernel-server

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

在客户端

client 服务器上,安装一个名为 nfs-common 的包,它提供 NFS 功能,但不包含服务器组件。 同样,在安装之前刷新本地包索引以确保您拥有最新信息:

sudo apt update

然后,安装软件包:

sudo apt install nfs-common

现在两台服务器都有必要的包,您可以开始配置它们。

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

我们将共享两个具有不同配置设置的单独目录,以说明可以针对超级用户访问配置 NFS 挂载的两种关键方式。

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

但是,有时 client 系统上的受信任用户需要在已挂载的文件系统上执行这些操作,但不需要对 主机 进行超级用户访问。 您可以将 NFS 服务器配置为允许这样做,尽管这会带来风险,因为这样的用户可以获得对整个 host 系统的 root 访问权限。

示例 1:导出通用挂载

在第一个示例中,您将创建一个通用 NFS 挂载,该挂载使用默认 NFS 行为,使在 client 机器上具有 root 权限的用户难以与host 使用那些 client 超级用户权限。 您可以使用类似的东西来存储使用内容管理系统上传的文件,或者为用户创建空间来共享项目文件。

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

sudo mkdir /var/nfs/general -p

由于您使用 sudo 创建它,因此该目录归 hostroot 用户所有:

ls -la /var/nfs/general
Outputtotal 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 凭据作为安全措施。 因此,您需要更改目录所有权以匹配这些凭据:

sudo chown nobody:nogroup /var/nfs/general

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

示例 2:导出主目录

在我们的第二个示例中,目标是使存储在 host 上的用户主目录在 client 服务器上可用,同时允许这些 client 服务器的受信任管理员访问他们需要方便地管理用户。

为此,您将导出 /home 目录。 由于它已经存在,因此您无需创建它。 您也不会更改权限。 如果你这样做了,对于在 主机 机器上拥有主目录的任何人来说,它可能会导致一系列问题。

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

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

host 机器上,使用 root 权限在首选文本编辑器中打开 /etc/exports 文件。 这里我们将使用 nano

sudo nano /etc/exports

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

/etc/出口

directory_to_share    client(share_option1,...,share_optionN)

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

/etc/出口

/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 用户的请求远程转换为服务器上的非特权用户。 这是为了防止 client 上的 root 帐户将 host 的文件系统用作 root 的安全功能。 no_root_squash 对某些共享禁用此行为。

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

sudo systemctl restart nfs-kernel-server

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

第 4 步 — 调整主机上的防火墙

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

sudo ufw status
OutputStatus: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

在我们的系统上,只允许 SSH 流量通过,因此我们需要为 NFS 流量添加规则。

对于许多应用程序,您可以使用 sudo ufw app list 并按名称启用它们,但 nfs 不是其中之一。 但是,由于 ufw 还检查 /etc/services 以获取服务的端口和协议,因此您仍然可以按名称添加 NFS。 最佳实践建议您启用最严格的规则,该规则仍将允许您希望允许的流量,因此与其启用来自任何地方的流量,您将是具体的。

使用以下命令打开 host 上的端口 2049,确保替换您的 client IP 地址:

sudo ufw allow from 203.0.113.24 to any port nfs

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

sudo ufw status

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

OutputStatus: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                 
2049                       ALLOW       203.0.113.24       
OpenSSH (v6)               ALLOW       Anywhere (v6)

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

第 5 步 — 在客户端上创建挂载点和挂载目录

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

要使远程共享在 client 上可用,您需要将 host 上要共享的目录挂载到 client 上的空目录中。

注意:如果你的挂载点有文件和目录,一旦你挂载NFS共享,它们就会被隐藏。 为避免丢失重要文件,请确保如果您挂载在已存在的目录中,则该目录为空。


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

sudo mkdir -p /nfs/general

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

sudo mkdir -p /nfs/home

现在您有了放置远程共享的位置并打开了防火墙,您可以使用 主机 服务器的 IP 地址来安装共享,在本指南中为 [X192X ]:

sudo mount 203.0.113.0:/var/nfs/general /nfs/general
sudo mount 203.0.113.0:/home /nfs/home

这些命令会将共享从主机安装到 客户端 机器上。 您可以通过多种方式仔细检查它们是否已成功安装。 您可以使用 mountfindmnt 命令检查这一点,但 df -h 提供了更易读的输出,说明 NFS 共享的磁盘使用情况显示方式不同:

df -h
OutputFilesystem 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 打印人类可读的输出:

du -sh /nfs/home
Output44K     /nfs/home

这表明整个主目录的内容只使用了 44K 的可用空间。

第 6 步 — 测试 NFS 访问

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

示例 1:通用股

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

sudo touch /nfs/general/general.test

然后,检查它的所有权:

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

因为您在未更改 NFS 的默认行为的情况下安装了此卷,并通过 sudo 命令将文件创建为 client 机器的 root 用户,因此文件的所有权默认为 [X206X ]。 client 超级用户将无法在这个 NFS 挂载的共享上执行典型的管理操作,例如更改文件的所有者或为一组用户创建新目录。

示例 2:主目录共享

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

sudo touch /nfs/home/home.test

然后查看文件的所有权:

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 创建为 root,与创建 general.test 文件的方式完全相同。 但是,在这种情况下,它由 root 拥有,因为您在此挂载上指定 no_root_squash 选项时覆盖了默认行为。 这允许您在 client 机器上的 root 用户充当 root 并使用户帐户的管理更加方便。 同时,这意味着您不必在 主机 上授予这些用户 root 访问权限。

第 7 步 — 在引导时挂载远程 NFS 目录

您可以通过将远程 NFS 共享添加到 客户端 上的 /etc/fstab 文件来自动挂载远程 NFS 共享。

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

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 页面中找到有关此处指定的选项的更多信息。 您可以通过运行以下命令来访问它:

man nfs

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

第 8 步 — 卸载 NFS 远程共享

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

首先进入主目录:

cd ~

然后卸载 /nfs/home。 请注意,该命令被命名为 umount 而不是 unmount 如您所料:

sudo umount /nfs/home

接下来,卸载 /nfs/general

sudo umount /nfs/general

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

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