本教程的先前版本由Melissa Anderson编写。
介绍
NFS或网络文件系统是一种分布式文件系统协议,允许您在服务器上安装远程目录。 这使您可以管理不同位置的存储空间,并从多个客户端写入该空间。 NFS提供了一种通过网络访问远程系统的相对快速简便的方法,并且在必须定期访问共享资源的情况下运行良好。
在本指南中,我们将介绍如何安装NFS功能所需的组件,配置NFS安装以及卸载NFS远程共享。
先决条件
我们将在本教程中使用两个服务器,其中一个与另一个共享其文件系统的一部分。 要继续,您将需要:
两台Ubuntu 18.04服务器。 其中每个都应该有一个配置了
sudo
权限的非root用户,一个使用UFW设置的简单防火墙,以及私有网络(如果你可以使用的话)。- 有关设置具有
sudo
权限和防火墙的非root用户的帮助,请按照我们的初始服务器设置和Ubuntu 18.04指南进行操作。 - 有关设置专用网络的帮助,请参阅如何设置和使用DigitalOcean专用网络 。
- 有关设置具有
在本教程中,我们将共享其目录的服务器称为主机 ,将服务器作为客户端安装这些目录。 为了使它们保持正确,我们将使用以下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功能,而不包括不需要的服务器组件。 同样,在安装之前刷新本地软件包索引,以确保您拥有最新信息:
sudo apt update
sudo apt install nfs-common
既然两台服务器都有必要的软件包,我们就可以开始配置它们。
第2步 - 在主机上创建共享目录
我们将分享两个具有不同配置设置的独立目录,以说明可以针对超级用户访问配置NFS挂载的两种主要方式。
超级用户可以在他们的系统上做任何事情。 但是,NFS挂载的目录不是安装它们的系统的一部分,因此默认情况下,NFS服务器拒绝执行需要超级用户权限的操作。 此默认限制意味着客户端上的超级用户无法以root用户身份写入文件,重新分配所有权或执行任何其他超级用户任务。
但是,有时客户端系统上的可信用户需要在已装入的文件系统上执行这些操作,但不需要在主机上进行超级用户访问。 您可以配置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会将客户端上的任何根操作转换为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.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
禁用某些共享的此行为。
完成更改后,保存并关闭文件。 然后,要使您配置的客户端可以使用共享,请使用以下命令重新启动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
是否有/etc/services
的端口和协议,我们仍然可以按名称添加NFS。 最佳做法建议您启用限制性最强的规则,该规则仍允许您要允许的流量,因此我们将具体说明,而不是从任何地方启用流量。
使用以下命令在主机上打开端口2049
,确保替换客户端的 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步 - 在客户端上创建挂载点和挂载目录
现在主机服务器已配置并提供其共享,我们将为客户端做好准备。
为了使客户端上的远程共享可用,我们需要将要共享的主机上的目录挂载到客户端上的空目录。
注意:如果挂载点中有文件和目录,则挂载NFS共享后它们将立即隐藏。 为避免丢失重要文件,请确保在已存在的目录中安装该目录为空。
我们将为我们的坐骑创建两个目录:
sudo mkdir -p /nfs/general
sudo mkdir -p /nfs/home
既然我们有一个放置远程共享的位置并且我们打开了防火墙,我们可以通过寻址我们的主机服务器来安装共享,本指南中的主机服务器是203.0.113.0
:
sudo mount 203.0.113.0:/var/nfs/general /nfs/general
sudo mount 203.0.113.0:/home /nfs/home
这些命令会将共享从主机安装到客户端计算机上。 您可以通过多种方式仔细检查它们是否成功安装。 您可以使用plain 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
我们安装的两个股票都显示在底部。 因为它们是从同一文件系统挂载的,所以它们显示相同的磁盘使用情况。 要查看每个安装点下实际使用的空间大小,请使用disk usage命令du
和mount的路径。 -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默认行为的情况下安装了此卷并通过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拥有,因为当我们在此mount上指定no_root_squash
选项时,我们会覆盖默认行为。 这允许客户端计算机上的root用户充当root用户 ,并使用户帐户的管理更加方便。 同时,这意味着我们不必在主机上为这些用户提供root访问权限。
第7步 - 在引导时挂载远程NFS目录
我们可以通过将远程NFS共享添加到客户端上的/etc/fstab
文件来自动挂载它们。
在文本编辑器中以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
注意:您可以在NFS手册页中找到有关我们在此处指定的选项的更多信息。 您可以通过运行以下命令来访问它:
man nfs
客户端服务器将在引导时自动挂载远程分区,但可能需要一些时间来建立连接并使共享可用。
第8步 - 卸载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身份验证加密是另一种探索选项。