Rocky Linux 9 NFS挂载配置教程:轻松实现文件共享
NFS简介
NFS(网络文件系统)是一种分布式文件系统协议,允许将远程目录挂载到服务器上。这使得您能够在不同位置管理存储空间,并允许多个客户端向该空间写入数据。NFS提供了一种相对标准且高性能的方式来访问网络上的远程系统,在需要定期访问共享资源的情况下效果良好。
在本指南中,您将学习如何在Rocky Linux 9上安装NFS功能所需的软件,配置服务器和客户端上的两个NFS挂载点,并挂载和卸载远程共享。
先决条件
在本教程中,您将使用两台服务器,其中一台将其文件系统的一部分与另一台共享。要跟随操作,您需要:
- 两台Rocky Linux 9服务器。每台服务器都应配置一个具有sudo权限的非root用户,一个使用UFW设置的防火墙,如果可用,还应配置私有网络。有关设置具有sudo权限的非root用户和防火墙的帮助,请遵循我们的Rocky Linux 9初始服务器设置指南。
- 如果您使用Silicon Cloud vServers作为服务器和客户端,可以阅读我们的文档如何创建VPC,了解更多关于设置私有网络的信息。
在本教程中,共享其目录的服务器将被称为“主机”,而挂载这些目录的服务器将被称为“客户端”。您需要知道两者的IP地址。如果有私有网络地址,请务必使用私有网络地址。
在本教程中,“host_ip”和“client_ip”将作为这些IP地址的占位符。请根据实际情况进行替换。
第一步:下载并安装组件
您将首先在每台服务器上安装必要的组件。
在主机上
在主机服务器上,使用dnf
软件包管理器安装nfs-utils
软件包,该软件包允许您共享目录。
sudo dnf install nfs-utils
一旦安装了这些软件包,请切换到客户端服务器。
在客户端上
在客户端服务器上,您需要安装相同的nfs-utils
软件包。
sudo dnf install nfs-utils
现在两台服务器都已安装必需的软件包,您可以开始配置它们了。
第二步:在主机上创建共享目录
为了说明NFS挂载在超级用户访问方面的两种关键配置方式,您将共享两个不同配置设置的独立目录。
超级用户可以在其系统上的任何地方执行任何操作。然而,NFS挂载的目录并不属于它们所挂载的系统的一部分,所以默认情况下,NFS服务器拒绝执行需要超级用户权限的操作。这个默认限制意味着客户端上的超级用户不能以root身份写入文件,重新分配所有权,或在NFS挂载上执行任何其他超级用户任务。
然而,有时候客户系统上有一些可信赖的用户需要在挂载的文件系统上执行这些操作,但他们对主机上的超级用户访问权限并没有需求。您可以配置NFS服务器来允许这样做,尽管这会引入一定的风险,即恶意用户可能获得对整个主机系统的root访问权限。
示例1:导出通用挂载点
在第一个示例中,您将创建一个通用的NFS挂载点,使用默认的NFS行为,以使具有客户端上root权限的用户难以使用那些客户端超级用户权限与主机交互。您可以使用类似这样的方式来存储使用内容管理系统上传的文件,或者为用户创建空间以便轻松共享项目文件。
首先,使用mkdir
命令的-p
选项创建共享目录(该选项将在需要时创建整个文件路径)。
sudo mkdir /var/nfs/general -p
因为您是用sudo
创建的,所以该目录归主机的root用户所有。
ls -dl /var/nfs/general
drwxr-xr-x 2 root root 4096 Apr 17 23:51 /var/nfs/general
为了安全起见,NFS会将客户端上的任何root操作都转换为nobody
用户。因此,您需要将目录所有权更改为nobody
。
sudo chown nobody /var/nfs/general
您现在可以准备导出这个目录了。
示例2:导出用户主目录
在第二个示例中,目标是使用户主目录存储在主机上,在客户端服务器上可用,并允许那些客户端服务器的可信管理员方便地访问所需的用户管理权限。
为了实现此目的,您需要导出/home
目录。由于该目录已存在,您无需创建新目录。您也不需要更改权限。如果您这样做的话,可能会给主机上任何拥有家目录的用户带来各种问题。
第三步:在主机服务器上配置NFS导出
接下来,您将进入NFS配置文件,设置共享这些资源。
Rocky Linux 9自带的默认文本编辑器是vi
。vi
是一个非常强大的文本编辑器,但对于缺乏经验的用户来说可能有些难以理解。您可能希望安装一个更用户友好的编辑器,如nano
,来便于在Rocky Linux 9服务器上编辑配置文件。
sudo dnf install nano
在主机上,以root权限使用nano
或您喜欢的文本编辑器打开/etc/exports
文件。
sudo nano /etc/exports
在Rocky Linux 9上,默认情况下此文件将为空。您需要创建以下语法:
directory_to_share client(share_option1,...,share_optionN)
为您计划共享的每个目录添加一行。请确保将此处显示的client_ip
占位符更改为您实际的IP地址。
/etc/exports
可简述为“导出目录”。
这是文章《如何在Rocky Linux 9上设置NFS挂载》的第2部分(共4部分)。
/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身份使用主机的NFS文件系统。
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
● 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 rocky9-nfs-host systemd[1]: Starting NFS server and services...
Aug 08 17:41:18 rocky9-nfs-host systemd[1]: Started NFS server and services.
在你实际使用新的共享之前,你需要确保防火墙规则允许共享的流量。
第四步:调整主机防火墙
如果您按照我们关于使用Rocky Linux 9的服务器初始设置指南中推荐的方式运行firewalld
防火墙,请检查firewall-cmd
输出中的services
行,以确定当前允许的服务。
- firewall-cmd –permanent –list-all | grep services
services: 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
services: cockpit dhcpv6-client mountd nfs rpc-bind ssh
请注意,这将在全球范围内开放防火墙以提供这些服务,而不仅仅限于单个客户端。这通常不是问题,因为您已经配置了NFS挂载仅可访问单个IP地址。如果您需要直接向防火墙配置添加更多安全性,可以考虑实施防火墙区域。
步骤五 — 在客户端上创建挂载点和挂载目录
既然主机服务器已配置并提供其共享文件,您将准备您的客户端。
为了在客户端上使远程共享可用,您需要将主机上要共享的目录挂载到客户端上的空目录中。
注意:如果您的挂载点中有文件和目录,在挂载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
Filesystem 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
您挂载的两个共享都出现在底部。因为它们是从同一个文件系统挂载的,所以它们显示相同的磁盘使用情况。
步骤六 — 测试NFS访问
接下来,通过向每个共享资源中写入一些内容来测试对其的访问权限。
范例1:普通共享
首先,将一个测试文件写入 /var/nfs/general
共享文件夹中。
- sudo touch /nfs/general/general.test
然后,检查它的所有权:
- ls -l /nfs/general/general.test
-rw-r–r–. 1 nobody nobody 0 Aug 8 18:24 /nfs/general/general.test
因为您在挂载这个卷时没有更改NFS的默认行为,并且通过 sudo
命令以客户端的root用户创建了文件,所以该文件的所有权默认归属于 nobody
。客户端的超级用户将无法执行典型的管理操作,比如更改文件的所有者或为用户组创建新目录,对于这个NFS挂载的共享。
范例2:家目录共享
为了比较通用目录共享和主目录共享的权限,使用同样的方式在 /nfs/home
中创建一个文件。
- sudo touch /nfs/home/home.test
然后查看文件的所有权。
- ls -l /nfs/home/home.test
-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一样操作,并且使用户账户的管理更加方便。同时,这意味着您不必在主机上给这些用户root访问权限。
步骤七 — 在启动时挂载远程NFS目录
这是文章《如何在Rocky Linux 9上设置NFS挂载》的第4部分(共4部分)。
自动挂载NFS共享
您可以将远程NFS共享添加到客户端的/etc/fstab
文件中,从而在系统启动时自动挂载。
使用您的文本编辑器以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手册中找到有关你所指定选项的更多信息。虽然连接可能需要一些时间,并且共享可能需要一段时间才能可用,但客户端会在启动时自动挂载远程分区。
步骤八 – 卸载NFS远程共享
如果您不再希望远程目录在系统中挂载,您可以通过离开共享目录结构并卸载来取消挂载,就像这样:
cd ~
sudo umount /nfs/home
sudo umount /nfs/general
请注意,该命令的名称是umount
,而不是您可能期望的unmount
。
这将删除远程共享,仅保留您的本地存储可访问。
df -h
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
如果你希望在下次重新启动时阻止它们被重新挂载,可以编辑/etc/fstab
,要么删除该行,要么在行的开头加上#
字符进行注释。你也可以通过移除auto
选项来阻止自动挂载,这样你仍然可以手动挂载它。
结论
在本教程中,您创建了一个NFS主机,并通过创建两个不同的NFS挂载来说明了一些关键的NFS行为,这些挂载您与NFS客户端共享。
如果你打算在生产环境中实施NFS,需要注意的是该协议本身并没有加密。在共享数据时,如果是在私有网络中,这可能不是一个问题。但在其他情况下,为了保护你的数据,会需要使用VPN或其他类型的加密隧道。