如何使用块存储设置NFS服务器
简介
NFS,或称网络文件系统,是一种分布式文件系统协议,允许您在服务器上挂载远程目录。这使得您能够在不同的位置管理存储空间,并从多个客户端向该空间写入。NFS为通过网络访问远程系统提供了相对标准和高效的方式,适用于需要经常访问共享资源的情况。
块存储是用于描述通常由托管提供商提供的基于网络的存储卷的通用术语。与对象存储不同,块存储通常不提供自己的API以进行直接访问。而是需要将其挂载到现有服务器并从该服务器共享。如果您正在使用DigitalOcean的块存储,将NFS服务器运行在已连接的droplet上是暴露块存储卷的一个好解决方案。
在这篇指南中,您将学习如何安装所需的软件来搭建一个NFS服务器,配置服务器和客户端上的两个NFS挂载点,并挂载和卸载远程共享。
先决条件
在本教程中,您将使用两个服务器,其中一个将其文件系统的一部分与另一个服务器共享。要跟随本教程,您将需要:
- Two Ubuntu servers. This tutorial will follow our best practices for Ubuntu 22.04, but most recent Ubuntu or Debian releases should also work. Each of these should have a non-root user with sudo privileges, a firewall set up with UFW, and private networking, if it’s available to you.For assistance setting up a non-root user with sudo privileges and a firewall, follow our Initial Server Setup with Ubuntu 22.04 guide.
If you’re using DigitalOcean Droplets for your server and client, you can read more about setting up a private network in our documentation on How to Create a VPC. DigitalOcean droplets created since 2019 will automatically have a private network interface enabled.
在本教程中,共享其目录的服务器将被称为主机,挂载这些目录的服务器将被称为客户端。主机服务器应连接一个块存储卷。如果您正在使用DigitalOcean块存储,您可以按照文档创建和挂载一个卷。您还需要知道两台服务器的IP地址。除了最初通过SSH连接时,如果有的话,请务必使用私有网络地址。
在本教程中,这些IP地址将被称为占位符“host_ip”和“client_ip”。请根据需要进行替换。
第一步 — 下载和安装组件
你将从在每个服务器上安装必要的组件开始。
在主持人那边
在主机服务器上安装nfs-kernel-server软件包,这将允许您共享目录。由于这是您在此会话中执行的第一个操作,所以在安装之前,请刷新您的本地软件包索引。
- sudo apt update
- sudo apt install nfs-kernel-server
一旦这些软件包安装完成,切换到客户服务器模式。
关于客户方面
在客户端服务器上,你需要安装一个称为nfs-common的包,它提供了NFS功能,但不包含任何服务器组件。同样,在安装之前,请刷新本地软件包索引以确保你有最新的信息。
- sudo apt update
- sudo apt install nfs-common
Note
现在两台服务器都有必要的软件包,你可以开始配置它们了。
第二步 – 在主机上创建共享目录
在本教程中,您将创建一个通用的NFS挂载点,使用默认的NFS行为,使得使用客户机上的root权限的用户难以使用客户超级用户权限与主机进行交互。您可以使用类似这样的方法来存储使用内容管理系统上传的文件,或者为用户创建空间以轻松共享项目文件。
假设您的块存储已经挂载到主机的路径为 /mnt/volume-nyc3-01,您可以在该卷内创建一个名为 nfs 的共享目录。
首先,创建共享目录。
- sudo mkdir -p /mnt/volume-nyc3-01/nfs
由于您正在使用sudo创建它,所以该目录归主机的root用户所有。
- ls -dl /mnt/volume-nyc3-01/nfs/
drwxr-xr-x 2 root root 4096 Sep 27 16:19 /mnt/volume-nyc3-01/nfs/
作为一项安全措施,NFS会将客户端上的任何根操作转换为nobody:nogroup凭据。因此,您需要更改目录的所有权以匹配这些凭据。
- sudo chown nobody:nogroup /mnt/volume-nyc3-01/nfs/
现在你已经准备好导出这个目录了。
步骤三 — 配置主机服务器上的NFS导出
接下来,您将深入研究NFS配置文件,以设置共享这些资源。
在主机上,使用nano或您喜欢的文本编辑器以根权限打开/etc/exports文件。
- sudo nano /etc/exports
文件中的注释显示了每个配置行的一般结构。语法如下:
directory_to_share client(share_option1,...,share_optionN)
你需要为计划共享的每个目录创建一行。确保将这里显示的client_ip占位符更改为你的实际IP地址。
/mnt/volume-nyc3-01/nfs/ client_ip(rw,sync,no_subtree_check)
在这里,你在这两个目录中使用相同的配置选项,除了 no_root_squash。看一下每个选项的含义:
- rw: This option gives the client computer both read and write access to the volume.
- sync: This option forces NFS to write changes to disk before replying. This results in a more stable and consistent environment since the reply reflects the actual state of the remote volume. However, it also reduces the speed of file operations.
- no_subtree_check: This option prevents subtree checking, which is a process where the host must check whether the file is actually still available in the exported tree for every request. This can cause many problems when a file is renamed while the client has it opened. In almost all cases, it is better to disable subtree checking.
- no_root_squash: By default, NFS translates requests from a root user remotely into a non-privileged user on the server. This was intended as security feature to prevent a root account on the client from using the file system of the host as root. no_root_squash disables this behavior for certain shares.
当您完成对文件进行更改后,保存并关闭文件。如果您使用的是nano编辑器,请按Ctrl+X,然后在提示时按Y,最后按Enter。然后,为您配置的客户端使共享文件可用,使用以下命令重新启动NFS服务器。
- sudo systemctl restart nfs-kernel-server
在你真正能够使用新的共享功能之前,你需要确保防火墙规则允许共享的流量通过。
第四步 — 调整主机上的防火墙设置
首先,检查防火墙状态,看它是否已启用,如果已启用,则查看目前允许的内容。
- sudo ufw status
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 client_ip to any port nfs
你可以通过键入来验证这个变化。
- sudo ufw status
您应该在输出中看到允许从2049端口通过的流量。
Status: active To Action From — —— —- OpenSSH ALLOW Anywhere 2049 ALLOW 203.0.113.24 OpenSSH (v6) ALLOW Anywhere (v6)
这证实UFW只会从您的客户机上允许端口2049的NFS流量。
步骤5 – 在客户端创建挂载点并挂载目录
现在主机服务器已经配置好并开始提供服务,接下来你需要准备客户端。
为使客户端能够访问远程共享,您需要将主机上要共享的目录挂载到客户端的一个空目录上。
Note
为你的挂载创建一个目录。
- sudo mkdir -p /nfs/general
现在您已经找到了一个位置来放置远程共享,并且您已经打开了防火墙,您可以使用主机服务器的IP地址挂载共享。
- sudo mount host_ip:/mnt/volume-nyc3-01/nfs/ /nfs/general
这些命令将把主机上的共享挂载到客户端机器上。你可以通过多种方式来确认它已成功挂载。你可以使用mount或findmnt命令来检查,但df -h命令提供了更易读的输出。
- df -h
Filesystem Size Used Avail Use% Mounted on tmpfs 198M 972K 197M 1% /run /dev/vda1 50G 3.5G 47G 7% / tmpfs 989M 0 989M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock /dev/vda15 105M 5.3M 100M 5% /boot/efi tmpfs 198M 4.0K 198M 1% /run/user/1000 10.124.0.3:/mnt/volume-nyc3-01/nfs/ 25G 5.9G 19G 24% /nfs/general
你挂载的共享显示在底部。要查看每个挂载点实际使用了多少空间,可以使用磁盘使用命令du和挂载的路径。-s选项提供使用摘要而不是显示每个文件的用量。-h打印可读性较高的输出。
例如:
- du -sh /nfs/general
4.0K /nfs/general
这表明整个家目录的内容仅使用了4K的可用空间。
第六步 – 测试NFS访问。
接下来,通过写入一些内容来测试对共享文件的访问。
首先,将一个测试文件写入/mnt/volume-nyc3-01/nfs/共享文件夹中。
- sudo touch /nfs/general/test
然后,检查它的所有权。
- ls -l /nfs/general/test
-rw-r–r– 1 nobody nogroup 0 Sep 28 18:05 /nfs/general/test
因为您在未更改NFS的默认行为的情况下挂载了此卷,并在客户机的root用户通过sudo命令创建了该文件,该文件的所有权默认为nobody:nogroup。客户机的超级用户无法执行典型的管理员操作,例如更改文件的所有者或为一组用户创建新目录,对此NFS挂载的共享不可进行。
步骤7 — 在启动时挂载远程NFS目录
你可以将远程NF说明对挂载到/etc/fstab客户端文件,以便在启动时自动实现挂载。
以超级用户权限在文本编辑器中打开该文件。
- sudo nano /etc/fstab
在文件底部,为每个您拥有的股份添加一行。它们将如此显示:
. . .
host_ip:/mnt/volume-nyc3-01/nfs/ /nfs/general nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0
Note
man nfs
客户端将自动在启动时挂载远程分区,尽管可能需要片刻时间来建立连接并使共享可用。
第八步 – 取消挂载NFS远程共享
如果你不再想将远程目录挂载到你的系统上,你可以通过离开共享目录结构并取消挂载来卸载它,就像这样:
- cd ~
- sudo umount /nfs/general
注意命令被命名为umount而不是您可能期望的unmount。
这将删除远程共享,只保留您本地存储的访问权限。
- df -h
Filesystem Size Used Avail Use% Mounted on tmpfs 198M 972K 197M 1% /run /dev/vda1 50G 3.5G 47G 7% / tmpfs 989M 0 989M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock /dev/vda15 105M 5.3M 100M 5% /boot/efi tmpfs 198M 4.0K 198M 1% /run/user/1000
如果你还想防止它们在下次重启时重新挂载,编辑/etc/fstab文件,要么删除该行,要么在行的开头加上 # 字符进行注释。你也可以通过移除自动挂载选项来防止自动挂载,这样你仍然可以手动挂载它。
结论
在本教程中,您创建了一个NFS主机,并通过创建一个NFS挂载来展示了一些关键的NFS行为,这个挂载您与一个NFS客户端共享。
如果您打算在生产环境中使用NFS,重要的是要注意该协议本身没有加密。在使用私有网络共享的情况下,这可能不是一个问题。然而,在其他情况下,保护您的数据将需要使用VPN或其他类型的加密隧道。