如何在Ubuntu16.04上设置NFS挂载
介绍
NFS 或网络文件系统是一种分布式文件系统协议,允许您在服务器上挂载远程目录。 这使您可以管理不同位置的存储空间并从多个客户端写入该空间。 NFS 提供了一种通过网络访问远程系统的相对快速和简单的方法,并且在定期访问共享资源的情况下运行良好。
在本指南中,我们将介绍如何配置 NFS 挂载。
先决条件
我们将在本教程中使用两台服务器:一台将与另一台共享其文件系统的一部分。 要继续进行,您将需要:
- 两台 Ubuntu 16.04 服务器,每台服务器都有一个非 root 用户,具有 sudo 权限 并启用了专用网络。
- 如需帮助设置具有这些权限的用户,请遵循我们的 Initial Server Setup with Ubuntu 16.04 指南。
- 有关设置专用网络的帮助,请参阅 如何设置和使用 DigitalOcean 专用网络 。
在整个教程中,我们将共享其目录的服务器称为 host,将挂载这些目录的服务器称为 client。 为了使它们保持直截了当,我们将使用以下 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
Output4 drwxr-xr-x 2 root root 4096 Jul 25 15:26 .
NFS 会将客户端上的任何 root
操作转换为 nobody:nogroup
凭据作为安全措施。 因此,我们需要更改目录所有权以匹配这些凭据。
sudo chown nobody:nogroup /var/nfs/general
该目录现在可以导出了。
示例 2:导出主目录
在我们的第二个示例中,目标是使存储在主机上的用户主目录在客户端服务器上可用,同时允许这些客户端服务器的受信任管理员访问他们方便地管理用户所需的访问权限。
为此,我们将导出 /home
目录。 由于它已经存在,我们不需要创建它。 我们也不会更改权限。 如果我们 did,它会给在主机上拥有主目录的任何人带来各种问题。
第 3 步 — 在主机服务器上配置 NFS 导出
接下来,我们将深入研究 NFS 配置文件以设置这些资源的共享。
使用 root 权限在文本编辑器中打开 /etc/exports
文件:
sudo nano /etc/exports
该文件的注释显示了每个配置行的一般结构。 语法基本上是:
/etc/出口
directory_to_share client(share_option1,...,share_optionN)
我们需要为我们计划共享的每个目录创建一行。 由于我们的示例客户端的 IP 为 203.0.113.256
,因此我们的行将如下所示。 请务必更改 IP 以匹配您的客户端:
/etc/出口
/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
OutputStatus: 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 的流量:
OutputStatus: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere 2049 ALLOW 203.0.113.256 OpenSSH (v6) ALLOW Anywhere (v6)
这证实了 UFW 将只允许来自我们客户端计算机的端口 2049 上的 NFS 流量。
第 5 步 — 在客户端上创建挂载点
现在主机服务器已配置并为其共享提供服务,我们将准备我们的客户端。
为了使远程共享在客户端上可用,我们需要将主机目录挂载到一个空的客户端目录上。
注意:如果你的挂载点有文件和目录,一旦你挂载了NFS共享,它们就会被隐藏。 如果您挂载在已经存在的目录中,请确保该目录为空。
我们将为我们的挂载创建两个目录:
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
这些命令应该将共享从主机安装到客户端计算机上。 您可以通过多种方式仔细检查它们是否已成功安装。 您可以使用普通的 mount
或 findmnt
命令检查这一点,但 df -h
将为您提供更多人类可读的输出,说明 nfs 共享磁盘使用情况的不同显示方式:
df -h
OutputFilesystem Size Used Avail Use% Mounted on 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
Output36K /nfs/home
这向我们展示了整个主目录的内容仅使用了 20K 的可用空间。
第 7 步 — 测试 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 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
Output-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 目录
我们可以通过将远程 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
注意: 有关我们在此处指定的选项的更多信息,请参阅使用 man nfs
命令在 fstab
中描述 NFS 安装的手册页。
客户端服务器将在启动时自动挂载远程分区,尽管建立连接和共享可用可能需要一些时间。
步骤 9 — 卸载 NFS 远程共享
如果您不再希望远程目录挂载到您的系统上,您可以通过移出共享目录结构并卸载来卸载它,如下所示:
cd ~ sudo umount /nfs/home sudo umount /nfs/general
这将删除远程共享,只留下您的本地存储可访问:
df -h
Output Filesystem Size Used Avail Use% Mounted on /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 快得多。 NFS 的 Kerberos 身份验证加密是另一个值得探索的选项。