如何在 Rocky Linux 8 上设置 NFS 挂载
介绍
NFS,即网络文件系统,是一种分布式文件系统协议,允许您在服务器上挂载远程目录。这允许您管理不同位置的存储空间并从多个客户端写入该空间。 NFS 提供了一种相对标准和高效的方式来通过网络访问远程系统,并且在必须定期访问共享资源的情况下运行良好。
在本指南中,您将了解如何在 Rocky Linux 8 上安装 NFS 功能所需的软件,在服务器和客户端上配置两个 NFS 安装,以及安装和卸载远程共享。
先决条件
您将在本教程中使用两台服务器,其中一台与另一台共享其文件系统的一部分。要继续,您将需要:
- <李> 两台 Rocky Linux 8 服务器。其中每一个都应该有一个具有
sudo
权限的非 root 用户,一个使用 UFW 设置的防火墙,以及私有网络,如果它对你可用的话。 - <李> 如需帮助设置具有
sudo
权限的非根用户和防火墙,请遵循我们的使用 Rocky Linux 8 进行初始服务器设置指南。 <李> 如果您正在为您的服务器和客户端使用 DigitalOcean Droplet,您可以在我们关于如何创建 VPC 的文档中阅读有关设置专用网络的更多信息。 在本教程中,共享其目录的服务器将称为主机,将安装这些目录的服务器称为客户端。您需要知道两者的 IP 地址。如果可用,请务必使用私人 网络地址。
在本教程中,这些 IP 地址将由占位符 host_ip
和 client_ip
引用。请根据需要进行替换。
第 1 步 — 下载并安装组件
您将从在每台服务器上安装必要的组件开始。
在主机上
在主机服务器上,使用 dnf
包管理器安装 nfs-utils
包,这将允许您共享您的目录:
- sudo dnf install nfs-utils
安装这些包后,切换到客户端服务器。
在客户端
在客户端服务器上,您需要安装相同的 nfs-utils
包:
- sudo dnf install nfs-utils
现在两台服务器都有必要的包,您可以开始配置它们了。
第 2 步 — 在主机上创建共享目录
您将共享两个具有不同配置设置的单独目录,以说明可以根据超级用户访问配置 NFS 挂载的两种关键方式。
超级用户可以在他们系统的任何地方做任何事情。然而,NFS 挂载的目录并不是挂载它们的系统的一部分,因此默认情况下,NFS 服务器拒绝执行需要超级用户权限的操作。此默认限制意味着客户端上的超级用户不能以 root 身份写入文件、重新分配所有权或在 NFS 安装上执行任何其他超级用户任务。
然而,有时,客户端系统上的受信任用户需要在挂载的文件系统上执行这些操作,但不需要主机上的超级用户访问权限。您可以将 NFS 服务器配置为允许这样做,尽管它引入了恶意用户可能获得对整个主机系统的 root 访问权限的风险元素。
示例 1:导出通用安装
在第一个示例中,您将创建一个通用 NFS 挂载,它使用默认 NFS 行为,使在客户端计算机上具有 root 权限的用户难以使用这些客户端超级用户权限与主机进行交互。您可能会使用类似这样的东西来存储使用内容管理系统上传的文件,或者为用户创建空间以轻松共享项目文件。
首先,创建共享目录(使用 mkdir
的 -p
选项,如果需要,它将创建整个文件路径):
- sudo mkdir /var/nfs/general -p
由于您是使用 sudo
创建的,因此该目录归主机的根用户所有:
- ls -dl /var/nfs/general
Outputdrwxr-xr-x 2 root root 4096 Apr 17 23:51 /var/nfs/general
作为安全措施,NFS 会将客户端上的任何根操作转换为 nobody
用户。因此,您需要将目录所有权更改为 nobody
:
- sudo chown nobody /var/nfs/general
您现在已准备好导出此目录。
示例 2:导出主目录
在第二个示例中,目标是使存储在主机上的用户主目录在客户端服务器上可用,同时允许这些客户端服务器的受信任管理员访问他们方便地管理用户所需的权限。
为此,您将导出 /home
目录。因为它已经存在,所以你不需要创建它。您也不会更改权限。如果您这样做了,它可能会给在主机上拥有主目录的任何人带来一系列问题。
第 3 步 — 在主机服务器上配置 NFS 导出
接下来,您将深入研究 NFS 配置文件以设置这些资源的共享。
Rocky Linux 9 自带的默认文本编辑器是 vi
。 vi
是一个非常强大的文本编辑器,但对于缺乏使用经验的用户来说可能有点迟钝。你可能想要安装一个更用户友好的编辑器,例如 nano
以方便在你的 Rocky Linux 8 服务器上编辑配置文件:
- sudo dnf install nano
在主机上,在 nano
或您最喜欢的具有 root 权限的文本编辑器中打开 /etc/exports
文件:
- sudo nano /etc/exports
在 Rocky Linux 8 上,这个文件默认为空。这是您需要创建的语法:
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 用户的请求转换为服务器上的非特权用户。这是为了作为安全功能来防止客户端上的 root 帐户以 root 身份使用主机的文件系统。no_root_squash
为某些共享禁用此行为。
完成更改后,保存并关闭文件。如果您使用的是 nano
,请按 Ctrl+X
,然后在出现提示时按 Y
,然后按 Enter。然后,为了让您配置的客户端可以使用共享,启动 NFS 服务器并使用 systemctl
使其自动运行:
- sudo systemctl enable nfs-server
- sudo systemctl start nfs-server
使用 systemctl status
验证服务是否已启动:
- sudo systemctl status nfs-server
Output● nfs-server.service - NFS server and services
Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; vendor preset: >
Drop-In: /run/systemd/generator/nfs-server.service.d
└─order-with-mounts.conf
Active: active (exited) since Mon 2022-08-08 17:41:18 UTC; 4s ago
Process: 14348 ExecStart=/bin/sh -c if systemctl -q is-active gssproxy; then systemct>
Process: 14336 ExecStart=/usr/sbin/rpc.nfsd (code=exited, status=0/SUCCESS)
Process: 14335 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
Main PID: 14348 (code=exited, status=0/SUCCESS)
Aug 08 17:41:18 rocky8-nfs-host systemd[1]: Starting NFS server and services...
Aug 08 17:41:18 rocky8-nfs-host systemd[1]: Started NFS server and services.
然而,在您实际使用新共享之前,您需要确保防火墙规则允许流向共享的流量。
第 4 步 — 调整主机上的防火墙
如果您按照我们使用 Rocky Linux 8 进行初始服务器设置指南中的建议运行 firewalld
防火墙,请在 输出的
:services
行中检查当前允许哪些服务>防火墙命令
- firewall-cmd --permanent --list-all | grep services
Outputservices: cockpit dhcpv6-client ssh
在您的系统上,只允许核心系统服务,因此您需要为 NFS 流量添加规则。 Rocky Linux 上的 NFS 使用三种不同的服务,它们都需要被允许通过你的防火墙。您可以使用 firewall-cmd
添加这些规则:
- firewall-cmd --permanent --add-service=nfs
- firewall-cmd --permanent --add-service=mountd
- firewall-cmd --permanent --add-service=rpc-bind
- firewall-cmd --reload
您可以验证它们是否已添加:
- firewall-cmd --permanent --list-all | grep services
Outputservices: cockpit dhcpv6-client mountd nfs rpc-bind ssh
请注意,这将在全球范围内为这些服务打开防火墙,而不是只为单个客户端打开。这应该不是问题,因为您已经将 NFS 安装配置为只能由单个 IP 地址访问。如果您需要直接向 firewalld 配置添加更多安全性,则可以实施 firewalld 区域。
第 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
或 findmnt
命令进行检查,但 df -h
提供了更具可读性的输出:
- df -h
OutputFilesystem Size Used Avail Use% Mounted on
Filesystem Size Used Avail Use% Mounted on
devtmpfs 370M 0 370M 0% /dev
tmpfs 405M 0 405M 0% /dev/shm
tmpfs 405M 11M 394M 3% /run
tmpfs 405M 0 405M 0% /sys/fs/cgroup
/dev/vda1 25G 1.5G 24G 6% /
tmpfs 81M 0 81M 0% /run/user/0
host_ip:/var/nfs/general 25G 1.6G 24G 7% /nfs/general
host_ip:/home 25G 1.6G 24G 7% /nfs/home
您安装的两个共享都出现在底部。因为它们是从相同的文件系统挂载的,所以它们显示相同的磁盘使用情况。
第 6 步 — 测试 NFS 访问
接下来,通过向每个共享写入内容来测试对共享的访问。
示例 1:通用股份
首先,将测试文件写入 /var/nfs/general
共享:
- sudo touch /nfs/general/general.test
然后,检查其所有权:
- ls -l /nfs/general/general.test
Output-rw-r--r--. 1 nobody nobody 0 Aug 8 18:24 /nfs/general/general.test
由于您在未更改 NFS 的默认行为的情况下安装了此卷,并通过 sudo
命令以客户端计算机的根用户身份创建了该文件,因此该文件的所有权默认为 nobody
。客户端超级用户将无法执行典型的管理操作,例如更改文件的所有者或为一组用户创建新目录,在此 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 8 18:26 /nfs/home/home.test
您使用 sudo
命令以 root 身份创建了 home.test
,这与您创建 general.test
文件的方式完全相同。但是,在这种情况下,它归 root 所有,因为您在此挂载上指定 no_root_squash
选项时覆盖了默认行为。这允许您在客户端计算机上的 root 用户充当 root 并使用户帐户的管理更加方便。同时,这意味着您不必为这些用户提供主机上的根访问权限。
第 7 步 — 在引导时挂载远程 NFS 目录
您可以通过将远程 NFS 共享添加到客户端上的 /etc/fstab
文件来在启动时自动挂载远程 NFS 共享。
在文本编辑器中以 root 权限打开 /etc/fstab
:
- 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 手册中找到有关您在此处指定的选项的更多信息。
客户端将在启动时自动挂载远程分区,尽管可能需要一些时间来建立连接并使共享可用。
第 8 步 — 卸载 NFS 远程共享
如果您不再希望远程目录挂载到您的系统上,您可以通过移出共享的目录结构并卸载来卸载它,如下所示:
- cd ~
- sudo umount /nfs/home
- sudo umount /nfs/general
请注意,该命令名为 umount
,而不是您可能期望的 unmount
。
这将删除远程共享,只留下您的本地存储可访问:
- df -h
OutputFilesystem Size Used Avail Use% Mounted on
devtmpfs 370M 0 370M 0% /dev
tmpfs 405M 0 405M 0% /dev/shm
tmpfs 405M 11M 394M 3% /run
tmpfs 405M 0 405M 0% /sys/fs/cgroup
/dev/vda1 25G 1.5G 24G 6% /
tmpfs 81M 0 81M 0% /run/user/0
如果您还想防止它们在下次重新启动时重新安装,请编辑 /etc/fstab
并删除该行或通过将 #
字符注释掉该行的开头。您还可以通过删除 auto
选项来防止自动挂载,这样您仍然可以手动挂载它。
结论
在本教程中,您创建了一个 NFS 主机,并通过创建两个不同的 NFS 挂载(您与 NFS 客户端共享)说明了一些关键的 NFS 行为。
如果您希望在生产环境中实施 NFS,请务必注意协议本身未加密。在您通过专用网络共享的情况下,这可能不是问题。在其他情况下,需要 VPN 或其他类型的加密隧道来保护您的数据。