前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。
简介
NFS,或网络文件系统,是一种分布式文件系统协议,允许您在服务器上挂载远程目录。这使您可以在不同位置管理存储空间并从多个客户端向该空间写入。NFS提供了一种相对标准和高性能的方式来通过网络访问远程系统,并在需要定期访问共享资源的情况下运行良好。
在本指南中,您将学习如何在Ubuntu 18.04上安装 NFS 功能所需的软件,配置服务器和客户端上的 NFS 挂载,并挂载和卸载远程共享。
先决条件
在本教程中,我们将使用两台服务器,其中一台将其文件系统的一部分与另一台共享。要完成本教程,您需要:
-
两台运行 Ubuntu 18.04 的服务器。每台服务器都应配置了具有
sudo
权限的非root用户,并设置了带有 UFW 的防火墙,并且如果可用的话,设置了私有网络。-
要获得有关设置具有
sudo
权限的非root用户和防火墙的帮助,请参阅我们的《在 Ubuntu 18.04 上进行初始服务器设置》指南。 -
如果您使用 DigitalOcean Droplets 作为服务器和客户端,请阅读《如何创建 VPC》以设置私有网络。
-
在本教程中,我们将把共享其目录的服务器称为主机,将挂载这些目录的服务器称为客户端。我们将使用以下 IP 地址作为主机和客户端值的替代:
- 主机:
203.0.113.0
- 客户端:
203.0.113.24
当这些 IP 地址出现在命令和配置文件中时,请将它们替换为您自己的主机和客户端 IP 地址。
步骤 1 — 下载并安装组件
首先,在每台服务器上安装所需的组件。
在主机上
在主机服务器上,安装 nfs-kernel-server
软件包,这将允许您共享您的目录。由于这是您在本次会话中使用 apt
执行的第一个操作,请在安装之前刷新本地软件包索引:
sudo apt update
然后,安装该软件包:
sudo apt install nfs-kernel-server
安装这些软件包后,切换到客户端服务器。
在客户端上
在客户端服务器上,安装一个名为 nfs-common
的软件包,它提供了不包括服务器组件的 NFS 功能。同样,在安装之前刷新本地软件包索引,以确保您拥有最新的信息:
[environment second]
sudo apt update
然后,安装该软件包:
[environment second]
sudo apt install nfs-common
现在,两台服务器都安装了必要的软件包,您可以开始配置它们。
步骤 2 — 在主机上创建共享目录
我们将共享两个具有不同配置设置的独立目录,以便说明 NFS 挂载可以根据超级用户访问的方式进行配置的两种关键方式。
超级用户可以在其系统上执行任何操作。但是,NFS 挂载的目录不是其所挂载的系统的一部分,因此,默认情况下,NFS 服务器拒绝执行需要超级用户权限的操作。这个默认限制意味着客户端上的超级用户不能以root身份写入文件,重新分配所有权或在 NFS 挂载上执行任何其他超级用户任务。
然而,有时客户端系统上存在受信任的用户需要在挂载的文件系统上执行这些操作,但在主机上不需要超级用户访问权限。您可以配置 NFS 服务器以允许此操作,尽管这会引入一定的风险,因为这样的用户可能获得对整个主机系统的root访问权限。
示例 1:导出通用目录挂载
在第一个示例中,您将创建一个通用目录 NFS 挂载,该挂载使用默认的 NFS 行为,使得客户端机器上具有root权限的用户难以使用这些客户端超级用户权限与主机进行交互。您可能会使用类似的方式来存储使用内容管理系统上传的文件,或者为用户创建共享项目文件的空间。
首先,创建一个共享目录:
sudo mkdir /var/nfs/general -p
由于您使用 sudo
创建它,该目录由主机的root用户拥有:
ls -la /var/nfs/general
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
凭据作为安全措施。因此,您需要更改目录所有权以匹配这些凭据:
sudo chown nobody:nogroup /var/nfs/general
现在,您已准备好导出此目录。
示例 2:导出主目录
在我们的第二个示例中,目标是使存储在主机上的用户主目录在客户端服务器上可用,同时允许这些客户端服务器的受信任管理员方便地管理用户。
为了实现这一目标,您将导出/home
目录。由于它已经存在,您无需创建它。您也不会更改权限。如果您这样做,可能会导致主机机器上拥有主目录的任何人遇到一系列问题。
步骤 3 — 在主机服务器上配置 NFS 导出
接下来,我们将深入研究 NFS 配置文件,以设置共享这些资源。
在主机机器上,使用具有root权限的首选文本编辑器打开/etc/exports
文件。这里我们将使用nano
:
sudo nano /etc/exports
该文件有注释显示每个配置行的一般结构。语法如下:
directory_to_share client(share_option1,...,share_optionN)
您需要为您计划共享的每个目录创建一行。由于我们的示例客户端的 IP 地址为203.0.113.24
,我们的行将如下所示。请确保将 IP 地址更改为您的客户端的 IP 地址:
/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
,然后按Y
和ENTER
来完成此操作。然后,为您配置的客户端重新启动 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.24 to any port nfs
您可以通过运行以下命令来验证更改:
sudo ufw status
您应该收到输出中允许从端口2049
的流量的列表:
状态:active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
2049 ALLOW 203.0.113.24
OpenSSH (v6) ALLOW Anywhere (v6)
这证实了 UFW 仅允许来自客户端机器的端口2049
上的 NFS 流量。
步骤 5 —— 创建挂载点并在客户端挂载目录
现在主机服务器已经配置并提供其共享,接下来你需要准备你的客户端。
为了在客户端上使远程共享可用,你需要将主机上要共享的目录挂载到客户端上的空目录中。
创建两个用于挂载的目录。运行以下命令创建第一个目录:
[environment second]
sudo mkdir -p /nfs/general
然后运行以下命令创建第二个目录:
[environment second]
sudo mkdir -p /nfs/home
现在你已经有了一个放置远程共享的位置,并且已经打开了防火墙,你可以通过使用主机服务器的 IP 地址(在本指南中为 203.0.113.0
)来挂载共享:
[environment second]
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 共享的磁盘使用情况:
[environment second]
df -h
[environment second]
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
打印人类可读的输出:
[environment second]
du -sh /nfs/home
[environment second]
44K /nfs/home
这显示整个家目录的内容仅使用了 44K 的可用空间。
步骤 6 —— 测试 NFS 访问
接下来,通过向每个共享写入内容来测试对共享的访问。
示例 1:通用目录共享
首先,向 /var/nfs/general
共享写入一个测试文件:
[environment second]
sudo touch /nfs/general/general.test
然后,检查其所有者:
[environment second]
ls -l /nfs/general/general.test
[environment second]
-rw-r--r-- 1 nobody nogroup 0 Feb 7 23:53 /nfs/general/general.test
因为你在未更改 NFS 的默认行为的情况下挂载了此卷,并且通过 sudo
命令在客户端机器的 root 用户下创建了文件,文件的所有权默认为 nobody:nogroup
。客户端超级用户将无法执行典型的管理操作,比如更改文件的所有者或为一组用户创建新目录,这些操作无法在此 NFS 挂载的共享上执行。
示例 2:家目录共享
为了比较通用目录共享和家目录共享的权限,以相同的方式在 /nfs/home
中创建一个文件:
[environment second]
sudo touch /nfs/home/home.test
然后查看文件的所有权:
[environment second]
ls -l /nfs/home/home.test
[environment second]
-rw-r--r-- 1 root root 0 Feb 7 23:56 /nfs/home/home.test
你使用 sudo
命令以 root 创建了 home.test
,与你创建 general.test
文件的方式完全相同。但是,在这种情况下,它由 root 拥有,因为你在此挂载上指定了 no_root_squash
选项时覆盖了默认行为。这允许你在客户端机器上的 root 用户作为 root,使用户账户的管理更加方便。同时,这意味着你不必在主机上给这些用户赋予 root 访问权限。
步骤 7 — 在启动时挂载远程 NFS 目录
您可以通过将它们添加到 客户端 的 /etc/fstab
文件中,使远程 NFS 共享在启动时自动挂载。
使用您喜欢的文本编辑器以 root 权限打开以下文件:
[environment second]
sudo nano /etc/fstab
在文件末尾,为每个共享添加一行,如下所示:
[environment second]
. . .
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
客户端 服务器将在启动时自动挂载远程分区,尽管建立连接并使共享可用可能需要一些时间。
步骤 8 — 卸载 NFS 远程共享
如果您不再希望远程目录挂载到您的系统上,可以通过移出共享目录结构并卸载来取消挂载。
首先切换到主目录:
[environment second]
cd ~
然后卸载 /nfs/home
。请注意,命令的名称是 umount
而不是您可能期望的 unmount
:
[environment second]
sudo umount /nfs/home
接下来,卸载 /nfs/general
:
[environment second]
sudo umount /nfs/general
这将删除远程共享,仅留下您的本地存储可访问:
[environment second]
df -h
[environment second]
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。