如何在 Ubuntu 16.04 上设置 NFS 挂载

时间:2024-11-13 08:43:21

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站

简介

NFS(Network File System)是一种分布式文件系统协议,允许您在服务器上挂载远程目录。这使您可以在不同位置管理存储空间并从多个客户端向该空间写入。NFS提供了一种相对快速和简单的方式来通过网络访问远程系统,并在共享资源将经常访问的情况下运行良好。

在本指南中,我们将介绍如何配置NFS挂载。

先决条件

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

  • 两台安装了Ubuntu 16.04的服务器,每台都有一个具有sudo特权的非root用户,并启用了私有网络。

    • 如需帮助设置具有这些特权的用户,请参阅我们的《在Ubuntu 16.04上进行初始服务器设置》指南。

    • 如需帮助设置私有网络,请参阅《如何设置和使用DigitalOcean私有网络》。

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

  • 主机:203.0.113.0
  • 客户端:203.0.113.256

您应该用您自己的主机和客户端IP地址替换这些值。

步骤1 — 下载和安装组件

我们将从在每台服务器上安装必要的组件开始。

在主机上

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

sudo apt-get update
sudo apt-get install nfs-kernel-server

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

在客户端上

在客户端服务器上,我们需要安装一个名为nfs-common的软件包,它提供了NFS功能,而不包括不需要的服务器组件。同样,我们将在安装之前刷新本地软件包索引,以确保我们有最新的信息:

sudo apt-get update
sudo apt-get install nfs-common

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

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

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

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

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

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

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

首先,创建一个名为nfs的共享目录:

sudo mkdir /var/nfs/general -p

由于我们是使用sudo创建的,所以这个目录在主机上是由root拥有的。

ls -la /var/nfs/general
4 drwxr-xr-x  2 root   root    4096 Jul 25 15:26 .

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

sudo chown nobody:nogroup /var/nfs/general

这个目录现在已经准备好导出。

示例2:导出主目录

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

为此,我们将导出/home目录。由于它已经存在,我们不需要创建它。我们也不会更改权限。如果我们_这样做了,它将会给在主机机器上有主目录的任何人带来各种问题。

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

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

使用 root 权限在文本编辑器中打开 /etc/exports 文件:

sudo nano /etc/exports

该文件中有注释显示每个配置行的一般结构。语法基本上是:


directory_to_share    client(share_option1,...,share_optionN)

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


/var/nfs/general    203.0.113.256(rw,sync,no_subtree_check)
/home       203.0.113.256(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

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

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

首先,让我们检查防火墙状态,看看它是否已启用,如果已启用,看看当前允许了什么:

sudo ufw 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 203.0.113.256 to any port nfs

您可以通过输入以下命令来验证更改:

sudo ufw status

您应该在输出中看到允许从端口 2049 的流量:


状态:active

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

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

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

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

为了使远程共享在客户端上可用,我们需要将主机目录挂载到空的客户端目录上。

我们将为我们的挂载创建两个目录:

sudo mkdir -p /nfs/general
sudo mkdir -p /nfs/home

步骤 6 — 在客户端挂载目录

现在我们已经有了放置远程共享的位置,并且已经打开了防火墙,我们可以通过指定我们的主机服务器(在本指南中为 203.0.113.0)来挂载共享,就像这样:

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
文件系统                容量  已用  可用 已用% 挂载点
udev                      238M     0  238M   0% /dev
tmpfs                      49M  628K   49M   2% /run
/dev/vda1                  20G  1.2G   18G   7% /
tmpfs                     245M     0  245M   0% /dev/shm
tmpfs                     5.0M     0  5.0M   0% /run/lock
tmpfs                     245M     0  245M   0% /sys/fs/cgroup
tmpfs                      49M     0   49M   0% /run/user/0
203.0.113.0:/home      20G  1.2G   18G   7% /nfs/home
203.0.113.0:/var/nfs/general   20G  1.2G   18G   7% /nfs/general

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

例如:

du -sh /nfs/home
36K	/nfs/home

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

步骤 7 — 测试 NFS 访问

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

示例 1:通用目录共享

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

sudo touch /nfs/general/general.test

然后,检查它的所有者:

ls -l /nfs/general/general.test
-rw-r--r-- 1 nobody nogroup 0 Aug  1 13:31 /nfs/general/general.test

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

示例 2:家目录共享

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

sudo touch /nfs/home/home.test

然后查看文件的所有权:

ls -l /nfs/home/home.test
-rw-r--r-- 1 root root 0 Aug  1 13:32 /nfs/home/home.test

我们通过 sudo 命令以 root 用户创建了 home.test,与我们创建 general.test 文件的方式完全相同。然而,在这种情况下,它由 root 拥有,因为我们在此挂载上指定了 no_root_squash 选项,这允许我们在客户端机器上的 root 用户作为 root,并且使用户账户的管理更加方便。同时,这意味着我们不必在主机上为这些用户提供 root 访问权限。

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

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

使用 root 权限在文本编辑器中打开此文件:

sudo nano /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

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

步骤 9 — 卸载 NFS 远程共享

如果你不再希望远程目录在你的系统上挂载,你可以通过移出共享目录结构并卸载来取消挂载,就像这样:

cd ~
sudo umount /nfs/home
sudo umount /nfs/general

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

df -h
文件系统      容量 已用 可用 已用% 挂载点
/dev/vda         59G  1.3G   55G   3% /
none            4.0K     0  4.0K   0% /sys/fs/cgroup
udev            2.0G   12K  2.0G   1% /dev
tmpfs           396M  320K  396M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            2.0G     0  2.0G   0% /run/shm
none            100M     0  100M   0% /run/user

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

结论

在本教程中,我们创建了一个 NFS 主机,并通过创建两个不同的 NFS 挂载来说明了一些关键的 NFS 行为,然后与我们的 NFS 客户端共享了这些挂载。如果你打算在生产环境中实施 NFS,重要的是要注意该协议本身并不加密。在共享的文件旨在公开访问时,这并不会造成严重问题。

然而,如果你要使用 NFS 共享私人数据,你需要决定如何保护这些数据。你可能可以通过 SSH 或 VPN 连接路由 NFS 来创建更安全的体验,但这通常会导致严重的性能损失。如果性能是一个问题,考虑使用 SSHFS。它比未加密的 NFS 流量稍慢,但通常比隧道化的 NFS 快得多。Kerberos 认证加密用于 NFS 是另一个值得探索的选项。