介绍
NFS,即网络文件系统,是一种分布式文件系统协议,允许您在服务器上挂载远程目录。这使您可以管理不同位置的存储空间并从多个客户端写入该空间。NFS 提供了一种相对标准和高效的方式来通过网络访问远程系统,并且在必须定期访问共享资源的情况下运行良好。
在本指南中,我们将介绍如何在 Ubuntu 20.04 上安装 NFS 功能所需的软件,在服务器和客户端上配置两个 NFS 挂载,以及挂载和卸载远程共享。
先决条件
我们将在本教程中使用两台服务器,其中一台与另一台共享其文件系统的一部分。要继续,您将需要:
-
两台 Ubuntu 20.04 服务器。每一个都应该有一个具有特权的非root用户
sudo
、一个用 UFW 设置的防火墙和私有网络,如果它对你可用的话。- 如需帮助设置具有特权和防火墙的非root用户
sudo
,请按照我们的Ubuntu 20.04 初始服务器设置指南进行操作。 - 如果您将 DigitalOcean Droplets 用于您的服务器和客户端,您可以在我们关于如何创建 VPC 的文档中阅读有关设置专用网络的更多信息。
- 如需帮助设置具有特权和防火墙的非root用户
在本教程中,我们将共享其目录的服务器称为主机,将挂载这些目录的服务器称为客户端。您需要知道两者的 IP 地址。如果可用,请务必使用专用网络地址。
在本教程中,我们将通过占位符host_ip
和client_ip
. 请根据需要替换。
步骤 1 — 下载和安装组件
我们将首先在每台服务器上安装必要的组件。
在主机上
在主机服务器上,安装该nfs-kernel-server
软件包,这将允许您共享您的目录。由于这是您apt
在此会话中执行的第一个操作,因此请在安装前刷新本地包索引:
- sudo apt update
- sudo apt install nfs-kernel-server
安装这些软件包后,切换到客户端服务器。
在客户端
在客户端服务器上,我们需要安装一个名为 的包nfs-common
,它提供 NFS 功能而不包含任何服务器组件。同样,在安装之前刷新本地包索引以确保您拥有最新信息:
- sudo apt update
- 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
Outputdrwxr-xr-x 2 root root 4096 May 14 18:36 .
作为安全措施,NFS 会将客户端上的任何根操作转换为凭据。因此,我们需要更改目录所有权以匹配这些凭据。nobody:nogroup
- sudo chown nobody:nogroup /var/nfs/general
您现在已准备好导出此目录。
示例 2:导出主目录
在我们的第二个示例中,目标是使存储在主机上的用户主目录在客户端服务器上可用,同时允许这些客户端服务器的受信任管理员进行访问,以方便地管理用户。
为此,我们将导出/home
目录。由于它已经存在,我们不需要创建它。我们也不会更改权限。如果我们这样做了,对于在主机上拥有主目录的任何人来说,它都可能导致一系列问题。
步骤 3 — 在主机服务器上配置 NFS 导出
接下来,我们将深入研究 NFS 配置文件以设置这些资源的共享。
在主机上,/etc/exports
使用root权限在文本编辑器中打开文件:
- sudo nano /etc/exports
该文件的注释显示了每个配置行的一般结构。语法如下:
directory_to_share client(share_option1,...,share_optionN)
我们需要为我们计划共享的每个目录创建一行。请务必将client_ip
此处显示的占位符更改为您的实际 IP 地址:
/var/nfs/general client_ip(rw,sync,no_subtree_check)
/home client_ip(rw,sync,no_root_squash,no_subtree_check)
在这里,我们对两个目录使用相同的配置选项,但no_root_squash
. 让我们来看看每个选项的含义:
rw
:此选项为客户端计算机提供对卷的读取和写入访问权限。sync
:此选项强制 NFS 在回复之前将更改写入磁盘。这会导致更稳定和一致的环境,因为回复反映了远程卷的实际状态。但是,它也降低了文件操作的速度。no_subtree_check
:此选项可防止子树检查,这是一个主机必须检查文件是否在每个请求的导出树中实际上仍然可用的过程。在客户端打开文件时重命名文件时,这可能会导致许多问题。在几乎所有情况下,最好禁用子树检查。no_root_squash
: 默认情况下,NFS 会将来自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 client_ip 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 — 在客户端上创建挂载点和挂载目录
现在主机服务器已配置并为其共享提供服务,我们将准备我们的客户端。
为了使远程共享在客户端可用,我们需要将主机上要共享的目录挂载到客户端上的空目录中。
注意:如果您的挂载点中有文件和目录,一旦您挂载 NFS 共享,它们就会隐藏起来。为避免丢失重要文件,请确保如果您挂载在已存在的目录中,则该目录为空。
我们将为我们的坐骑创建两个目录:
- sudo mkdir -p /nfs/general
- sudo mkdir -p /nfs/home
现在我们有一个放置远程共享的位置并且我们已经打开了防火墙,我们可以使用主机服务器的 IP 地址挂载共享:
- sudo mount host_ip:/var/nfs/general /nfs/general
- sudo mount host_ip:/home /nfs/home
这些命令会将共享从主机安装到客户端计算机上。您可以通过多种方式仔细检查它们是否成功安装。您可以使用mount
orfindmnt
命令检查这一点,但df -h
提供更易读的输出:
- df -h
OutputFilesystem Size Used Avail Use% Mounted on
udev 474M 0 474M 0% /dev
tmpfs 99M 936K 98M 1% /run
/dev/vda1 25G 1.8G 23G 8% /
tmpfs 491M 0 491M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 491M 0 491M 0% /sys/fs/cgroup
/dev/vda15 105M 3.9M 101M 4% /boot/efi
tmpfs 99M 0 99M 0% /run/user/1000
10.132.212.247:/var/nfs/general 25G 1.8G 23G 8% /nfs/general
10.132.212.247:/home 25G 1.8G 23G 8% /nfs/home
我们挂载的两个股票都出现在底部。因为它们是从同一个文件系统挂载的,所以它们显示相同的磁盘使用情况。要查看每个挂载点下实际使用了多少空间,请使用磁盘使用率命令du
和挂载路径。该-s
标志提供使用情况摘要,而不是显示每个文件的使用情况。的-h
打印人类可读输出。
例如:
- du -sh /nfs/home
Output36K /nfs/home
这表明整个主目录的内容仅使用了 36K 的可用空间。
步骤 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 Aug 1 13:31 /nfs/general/general.test
因为我们在不改变 NFS 的默认行为的情况下挂载了这个卷,并通过命令以客户端机器的root用户身份创建了该文件sudo
,所以文件的所有权默认为nobody:nogroup
. 客户端超级用户将无法在此挂载 NFS 的共享上执行典型的管理操作,例如更改文件的所有者或为一组用户创建新目录。
示例 2:主目录共享
要比较通用共享和主目录共享的权限,请/nfs/home
以相同的方式创建文件:
- 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
我们使用该命令home.test
以root身份创建sudo
,与创建general.test
文件的方式完全相同。但是,在这种情况下,它归root所有,因为我们no_root_squash
在此挂载上指定选项时覆盖了默认行为。这允许我们在客户端机器上的root用户充当root,并使用户帐户的管理更加方便。同时,这意味着我们不必在主机上授予这些用户 root 访问权限。
步骤 7 — 在启动时挂载远程 NFS 目录
我们可以在启动时自动挂载远程 NFS 共享,方法是将它们添加到客户端的/etc/fstab
文件中。
在文本编辑器中使用 root 权限打开此文件:
- sudo nano /etc/fstab
在文件底部,为我们的每个共享添加一行。它们将如下所示:
. . .
host_ip:/var/nfs/general /nfs/general nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0
host_ip:/home /nfs/home nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0
注意:您可以在 NFS 手册页中找到有关我们在此处指定的选项的更多信息。您可以通过运行以下命令来访问它:
- man nfs
该客户端将在开机时自动挂载远程分区,尽管它可能需要一些时间来建立供股可用的连接和。
步骤 8 — 卸载 NFS 远程共享
如果您不再希望将远程目录挂载到您的系统上,您可以通过移出共享目录结构并卸载来卸载它,如下所示:
- cd ~
- sudo umount /nfs/home
- sudo umount /nfs/general
请注意该命令名为umount
没有unmount
,你可能期望。
这将删除远程共享,只留下您的本地存储可访问:
- df -h
OutputFilesystem Size Used Avail Use% Mounted on
udev 474M 0 474M 0% /dev
tmpfs 99M 936K 98M 1% /run
/dev/vda1 25G 1.8G 23G 8% /
tmpfs 491M 0 491M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 491M 0 491M 0% /sys/fs/cgroup
/dev/vda15 105M 3.9M 101M 4% /boot/efi
tmpfs 99M 0 99M 0% /run/user/1000
如果您还想防止它们在下次重新启动时重新安装,请编辑/etc/fstab
并删除该行或通过#
在该行的开头放置一个字符来将其注释掉。您还可以通过删除该auto
选项来阻止自动挂载,这将允许您仍然手动挂载它。
结论
在本教程中,我们创建了一个 NFS 主机并通过创建两个不同的 NFS 挂载来说明一些关键的 NFS 行为,我们与 NFS 客户端共享这些挂载。
如果您希望在生产中实施 NFS,请务必注意协议本身并未加密。在您通过专用网络共享的情况下,这可能不是问题。在其他情况下,需要 VPN 或某种其他类型的加密隧道来保护您的数据。