在 RHEL 中配置 NFS 客户端访问

红帽企业 LinuxBeginner
立即练习

介绍

在本实验中,你将学习在红帽企业 Linux (RHEL) 系统上配置 NFS 客户端访问的核心技能。你将首先通过 mount 命令手动挂载网络共享,以理解其基本流程。随后,你将在 /etc/fstab 中配置持久化挂载,确保 NFS 共享在系统重启后自动可用,从而建立对静态网络文件系统集成的基础认知。

在掌握这些核心概念的基础上,你将进一步学习一种更动态、更高效的方法——设置自动挂载程序。这包括安装并启用 autofs 服务,然后创建用于按需挂载目录的间接映射,以及用于静态挂载点的直接映射。实验最后,你将验证直接和间接自动挂载在不同用户下是否正常工作,从而巩固你管理稳健 NFS 客户端配置的能力。

使用 mount 命令手动挂载 NFS 共享

在此步骤中,你将学习如何使用网络文件系统 (NFS) 协议手动访问网络共享目录。NFS 允许客户端系统通过计算机网络访问文件,其方式类似于访问本地存储。为了进行练习,我们将在你的本地机器上模拟 NFS 服务器和客户端,以练习必要的命令。

系统已预先配置了一个 NFS 服务器,用于导出(共享)目录 /srv/nfs/shared_data。你的任务是将此共享目录挂载到本地文件夹,验证访问权限,然后将其卸载。

创建本地挂载点

要访问共享的 NFS 目录,你需要一个本地目录作为「挂载点」。这本质上是客户端系统上的一个空文件夹,一旦挂载,远程共享的内容就会出现在这里。所有操作都将在你的 ~/project 目录中进行。

在你的项目文件夹中创建一个名为 nfs_mount 的目录:

mkdir ~/project/nfs_mount

你可以通过列出项目文件夹的内容来验证目录是否已创建:

ls -F ~/project
nfs_mount/

挂载 NFS 共享

现在,你可以使用 mount 命令将远程 NFS 共享挂载到你刚创建的挂载点上。该命令需要 sudo 权限,因为挂载文件系统属于系统级操作。

基本语法为 mount -t nfs -o vers=3 <server>:<remote_directory> <local_mount_point>

  • -t nfs -o vers=3:指定文件系统类型为 NFS,并强制使用 NFSv3,这是本实验环境中的工作协议。
  • localhost:/srv/nfs/shared_data:源路径,即服务器及其导出的路径。
  • ~/project/nfs_mount:目标路径,即你的本地挂载点。

运行以下命令挂载共享:

sudo mount -t nfs -o vers=3 localhost:/srv/nfs/shared_data ~/project/nfs_mount

如果执行成功,该命令不会产生任何输出。

验证挂载并与共享进行交互

运行 mount 命令后,你应该验证共享是否已正确挂载。可以通过几种方式进行验证。

首先,使用 mount 命令并通过管道传递给 grep 来过滤 NFS 挂载:

mount | grep nfs
localhost:/srv/nfs/shared_data on /home/labex/project/nfs_mount type nfs (rw,relatime,vers=3,rsize=...,wsize=...,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,local_lock=none,addr=...)

接下来,检查挂载点的内容。它现在应该显示远程 /srv/nfs/shared_data 目录中的文件。

ls -l ~/project/nfs_mount
total 4
-rw-r--r--. 1 root root 32 Nov 10 14:30 welcome.txt

你现在可以像操作本地文件夹一样与该目录进行交互。请注意,在本实验环境中,由于 NFS 服务器配置了 no_root_squash,文件所有者为 root。在生产环境中,根据 NFS 服务器的设置,你可能会看到所有者为 nobody。让我们在挂载的共享中创建一个新文件。由于 NFS 共享可能由 root 拥有,你需要使用 sudo 配合 tee 命令来写入文件:

echo "My test file" | sudo tee ~/project/nfs_mount/my_file.txt > /dev/null

验证你的新文件是否与原始文件并存:

ls -l ~/project/nfs_mount
total 8
-rw-r--r--. 1 root  root  13 Nov 10 14:35 my_file.txt
-rw-r--r--. 1 root  root  32 Nov 10 14:30 welcome.txt

卸载 NFS 共享

当你使用完网络共享后,使用 umount 命令将其干净地卸载非常重要。这可以确保所有数据已同步且连接已正确关闭。你只需要指定挂载点即可。

sudo umount ~/project/nfs_mount

要确认共享已卸载,请列出 ~/project/nfs_mount 目录的内容。它现在应该再次为空。

ls -l ~/project/nfs_mount
total 0

在 /etc/fstab 中配置持久化 NFS 挂载

在上一步中,你学习了如何使用 mount 命令手动挂载 NFS 共享。然而,此类挂载是临时的,系统重启后将失效。要使挂载永久生效,你需要向 /etc/fstab(文件系统表)文件添加条目。该文件包含系统启动时自动挂载的文件系统和设备列表。

在此步骤中,你将通过向 /etc/fstab 添加条目,将同一个 NFS 共享配置为持久化挂载。

准备环境

首先,确保上一步中的挂载点 ~/project/nfs_mount 存在且为空。如果你是直接从上一步继续操作,它应该已经存在。

如果目录不存在,请立即创建它:

mkdir -p ~/project/nfs_mount

此外,确保当前没有内容挂载到该目录。你可以运行 umount 命令,如果未挂载,它会报告错误,这完全没问题。

sudo umount ~/project/nfs_mount

编辑 /etc/fstab 文件

现在,你将向 /etc/fstab 文件添加一行新内容来定义持久化 NFS 挂载。你必须使用 sudo 来编辑此系统配置文件。我们将使用 nano 编辑器。

使用以下命令打开文件:

sudo nano /etc/fstab

导航到文件末尾并添加以下行。请务必小心语法,因为该文件中的错误可能导致系统启动问题。

localhost:/srv/nfs/shared_data /home/labex/project/nfs_mount nfs defaults,_netdev,vers=3 0 0

让我们解析一下这一行:

  • **localhost:/srv/nfs/shared_data**:这是要挂载的设备。它指定了 NFS 服务器 (localhost) 和导出的目录 (/srv/nfs/shared_data)。
  • **/home/labex/project/nfs_mount**:这是共享可访问的本地挂载点。
  • **nfs**:指定文件系统类型。
  • **defaults,_netdev,vers=3**:这些是挂载选项。defaults 包含一组标准选项(如读写 rw)。_netdev 对于网络文件系统至关重要;它告诉系统在尝试挂载此共享之前等待网络处于活动状态。vers=3 使实验保持在当前容器化环境可用的 NFS 协议上。
  • **0**:这是 dump 字段,由 dump 备份工具使用。值为 0 表示禁用。
  • **0**:这是 pass 字段,由 fsck 工具使用,用于确定启动时文件系统检查的顺序。值为 0 表示不对该文件系统进行检查。

添加该行后,按 Ctrl+X,然后按 Y,最后按 Enter 保存文件并退出 nano

测试 /etc/fstab 条目

你不需要重启即可测试新的 /etc/fstab 条目。mount 命令足够智能,可以读取 /etc/fstab。如果你只提供挂载点,mount 将查找 /etc/fstab 中的相应条目并使用其中找到的信息。

仅使用挂载点挂载共享:

sudo mount ~/project/nfs_mount

如果命令执行没有报错,说明你的 /etc/fstab 条目是正确的。

验证挂载

通过检查 mount 命令的输出并列出目录内容,验证共享现在是否已挂载。

mount | grep nfs_mount
localhost:/srv/nfs/shared_data on /home/labex/project/nfs_mount type nfs (rw,relatime,vers=3,rsize=...,wsize=...,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,local_lock=none,addr=...,_netdev)

现在,检查内容。你应该能看到共享中的文件。

ls -l ~/project/nfs_mount
total 4
-rw-r--r--. 1 root root 32 Nov 10 14:30 welcome.txt

此挂载现在是持久化的,重启后会自动重新建立。

清理环境

为避免与后续练习冲突,你现在应该撤销这些更改。首先卸载共享,然后从 /etc/fstab 中删除你添加的行。

卸载目录:

sudo umount ~/project/nfs_mount

再次打开 /etc/fstab 以删除条目:

sudo nano /etc/fstab

使用箭头键导航到你添加的行(localhost:/srv/nfs/shared_data ... vers=3 ...),然后按 Ctrl+K 删除整行。接着,按 Ctrl+XYEnter 保存并退出。

这使系统保持干净状态,以便进行实验的下一部分。

通过安装和启用 autofs 设置自动挂载程序

在之前的步骤中,你探索了手动挂载和持久化挂载。虽然 /etc/fstab 非常适合永久挂载,但它有一个缺点:它会在启动时尝试挂载所有内容。如果网络共享不可用,这可能会减慢甚至导致启动过程挂起。由 autofs 服务提供的自动挂载程序通过按需挂载网络文件系统(仅在首次访问时挂载)解决了这个问题。

autofs 服务使用一组称为「映射 (maps)」的配置文件来确定要挂载哪些远程共享以及挂载到哪里。在此步骤中,你将通过安装必要的软件包并启动其服务,为使用自动挂载程序做好准备。

安装 autofs 软件包

autofs 功能不包含在默认的 RHEL 安装中。你需要使用 dnf 软件包管理器安装它。这需要 sudo 权限。

运行以下命令安装 autofs 软件包。-y 标志会自动回答确认提示中的「yes」,这对于本实验很方便。

sudo dnf install -y autofs

该命令将下载并安装 autofs 软件包及其所有必需的依赖项。你将看到类似以下的输出:

Last metadata expiration check: ...
Dependencies resolved.
================================================================================
 Package       Architecture    Version                Repository           Size
================================================================================
Installing:
 autofs        x86_64          1:5.1.7-50.el9         ...                  ...
...

Transaction Summary
================================================================================
Install  1 Package

Total download size: ...
Installed size: ...
...
Complete!

启动 autofs 服务

在标准的 RHEL 系统上,你会使用 systemctl 来启动和启用服务。然而,本实验运行在无法使用 systemctl 的容器化环境中。相反,我们将直接使用其命令 automount 来启动 autofs 守护进程。

此命令启动自动挂载守护进程,它将在后台运行并监控对映射文件中配置的目录的访问尝试。

执行以下命令启动服务:

sudo automount

如果成功,该命令不会产生任何输出。它只是启动了守护进程。

验证服务是否正在运行

由于你无法使用 systemctl status autofs 来检查服务,你可以使用 ps 命令验证 automount 进程是否正在运行。ps aux 命令列出所有正在运行的进程,我们可以通过管道 | 将其输出传递给 grep 来过滤 automount 进程。

ps aux | grep automount

你应该至少看到一行关于 automount 进程本身的输出。显示 grep automount 的第二行只是你运行的 grep 命令,可以忽略。

root      ...  0.0  0.0 ...      ?        Ssl  15:30   0:00 /usr/sbin/automount
labex     ...  0.0  0.0 ...      pts/0    S+   15:31   0:00 grep --color=auto automount

看到 /usr/sbin/automount 进程确认了服务正在运行并准备好处理按需挂载。在接下来的步骤中,你将配置告诉 autofs 该做什么的映射。

为动态目录创建间接自动挂载映射

在此步骤中,你将使用间接映射 (indirect map) 配置你的第一个自动挂载规则。间接映射是最常见的自动挂载配置类型。它的工作原理是将单个基目录(如 /home/net)与映射文件关联起来。当用户尝试访问该基目录下的子目录时,autofs 会在映射文件中查找子目录的名称,并按需挂载相应的远程共享。

这对于挂载用户主目录或一系列共享项目文件夹非常有用,而无需一次性挂载所有内容。我们将配置一个间接映射,以动态挂载位于名为 /project_shares 的新基目录下的项目目录。

创建 NFS 服务器导出

首先,让我们准备要在模拟 NFS 服务器上共享的目录。我们将在 /srv/nfs/ 下创建两个项目目录:designtesting

创建目录并在每个目录中放置一个示例文件:

sudo mkdir -p /srv/nfs/{design,testing}
sudo sh -c 'echo "Design documents" > /srv/nfs/design/README'
sudo sh -c 'echo "Testing scripts" > /srv/nfs/testing/README'

接下来,我们需要告诉 NFS 服务器导出这些目录。我们通过向 /etc/exports 文件添加条目来实现。

使用 nano 打开文件:

sudo nano /etc/exports

向文件添加以下行。这些行告诉 NFS 服务器与任何客户端 (*) 共享 designtesting 目录,并赋予读写 (rw) 权限。

/srv/nfs/design *(rw,sync,no_root_squash)
/srv/nfs/testing *(rw,sync,no_root_squash)

保存文件并退出 (Ctrl+X, Y, Enter)。

最后,通过重新导出所有目录来应用 NFS 服务器的更改:

sudo exportfs -ra

创建主映射条目

autofs 配置从主映射文件 /etc/auto.master 开始。最佳实践是不直接编辑此文件,而是将新的配置文件添加到 /etc/auto.master.d/ 目录中。

为我们的项目共享创建一个新的主映射文件:

sudo nano /etc/auto.master.d/shares.autofs

向此文件添加以下单行内容:

/project_shares /etc/auto.shares

这一行告诉 autofs:「对于 /project_shares 目录下的任何访问,请查阅位于 /etc/auto.shares 的映射文件以获取指令。」

保存并退出编辑器。

创建间接映射文件

现在,创建你刚才在主映射中引用的间接映射文件 /etc/auto.shares

sudo nano /etc/auto.shares

向此文件添加以下行:

design  -fstype=nfs,rw,sync,vers=3   localhost:/srv/nfs/design
testing -fstype=nfs,rw,sync,vers=3   localhost:/srv/nfs/testing

解析一下这一行:

  • **design**:这是「键 (key)」。它对应于 /project_shares 下的子目录名称。当用户访问 /project_shares/design 时,此行被触发。
  • **-fstype=nfs,rw,sync,vers=3**:这些是挂载选项,指定了文件系统类型、读写访问、同步写入以及本实验环境中使用的 NFS 版本。
  • **localhost:/srv/nfs/design**:这是要挂载的远程 NFS 共享位置。

保存并退出编辑器。

重新加载 autofs 并测试挂载

为了让 autofs 服务识别你的新映射文件,你必须重新加载其配置。由于无法使用 systemctl,我们向 automount 进程发送 HUP(挂起)信号,这会导致它重新读取配置。

sudo killall -HUP automount

现在,让我们测试一下。首先,尝试列出基目录 /project_shares 的内容。它看起来是空的,因为还没有挂载任何内容。

ls -l /project_shares
total 0

接下来,尝试访问其中一个子目录。这是触发 autofs 执行挂载的操作。

ls -l /project_shares/design
total 4
-rw-r--r--. 1 root root 17 Nov 10 16:10 README

成功!design 共享已自动挂载。现在,如果你再次列出基目录,你将看到 design 目录,因为它是一个活动的挂载点。

ls -l /project_shares
total 0
dr-xr-xr-x. 2 root root 0 Nov 10 16:12 design

testing 目录执行同样的操作,以确认它也能正常工作:

ls -l /project_shares/testing
total 4
-rw-r--r--. 1 root root 16 Nov 10 16:10 README

你已成功配置并测试了间接自动挂载映射。

为静态挂载点创建直接自动挂载映射

在此步骤中,你将了解第二种自动挂载配置类型:**直接映射 (direct map)**。与将多个挂载分组在公共基目录下的间接映射不同,直接映射定义了文件系统中特定、独立的挂载点。直接映射中的每个条目都对应一个单一的绝对路径。

直接映射适用于在固定、众所周知的位置挂载少量共享,例如将共享工具目录挂载到 /usr/local/tools。我们将配置一个直接映射,将共享的 common_data 目录挂载到 /mnt/common

准备 NFS 服务器导出

和之前一样,我们首先需要设置要在模拟 NFS 服务器上共享的目录。我们将创建一个名为 common_data 的目录。

创建目录并在其中创建一个示例文件:

sudo mkdir -p /srv/nfs/common_data
sudo sh -c 'echo "Common shared data" > /srv/nfs/common_data/info.txt'

现在,向 /etc/exports 添加一个条目,使该目录可通过 NFS 使用。

sudo nano /etc/exports

向文件添加以下新行。这将共享 /srv/nfs/common_data 目录。

/srv/nfs/common_data *(rw,sync,no_root_squash)

保存文件并退出 (Ctrl+X, Y, Enter)。

通过重新导出所有目录来应用 NFS 服务器的更改:

sudo exportfs -ra

为直接映射创建主映射条目

要使用直接映射,你必须首先在主映射配置中引用它。特殊的挂载点 /- 用于指示关联的映射文件是一个直接映射。

为我们的直接挂载创建一个新的主映射文件:

sudo nano /etc/auto.master.d/direct.autofs

向此文件添加以下单行内容:

/- /etc/auto.direct

这一行告诉 autofs:「查阅文件 /etc/auto.direct 以获取直接挂载列表。挂载点是该文件中定义的绝对路径。」

保存并退出编辑器。

创建直接映射文件

现在,创建你刚才引用的直接映射文件 /etc/auto.direct

sudo nano /etc/auto.direct

向此文件添加以下行。其格式与间接映射略有不同。

/mnt/common -fstype=nfs,rw,sync,vers=3   localhost:/srv/nfs/common_data

解析一下这一行:

  • /mnt/common:这是「键」,但对于直接映射,键是挂载点的完整绝对路径
  • **-fstype=nfs,rw,sync,vers=3**:这些是挂载选项,与之前相同,包括本实验环境中使用的 NFS 版本。
  • **localhost:/srv/nfs/common_data**:这是远程 NFS 共享位置。

保存并退出编辑器。

重新加载 autofs 并测试直接挂载

就像你对间接映射所做的那样,你必须重新加载 autofs 配置,使其识别新的直接映射。

sudo killall -HUP automount

现在,让我们测试直接挂载。与间接映射不同,在尝试访问之前,挂载点 /mnt/common 在文件系统中并不存在。

尝试访问目录 /mnt/common。这将触发 autofs 创建挂载点并挂载共享。

ls -l /mnt/common
total 4
-rw-r--r--. 1 root root 19 Nov 10 17:00 info.txt

成功!直接挂载是按需创建的。在本实验环境中,成功的 ls -l /mnt/common 输出是最可靠的确认,因为当 NFS 服务器和客户端是同一台机器时,挂载显示可能会有所不同。

你现在已经成功配置了用于动态子目录的间接映射,以及用于静态绝对挂载点的直接映射。

以不同用户身份验证直接和间接自动挂载

在最后一步中,你将验证自动挂载程序在多用户环境中的工作方式。自动挂载使共享可用,但控制谁能真正读取或写入文件的,是 NFS 服务器上的底层文件系统权限。你将创建几个测试用户,将各自 NFS 共享的所有权分配给他们,然后测试他们对间接映射和直接映射的访问权限。

此练习演示了一个真实场景:不同的团队(例如设计和测试)拥有各自共享目录的所有权,其他用户拥有读取权限,但写入权限仅限于所有者。

创建测试用户并设置权限

首先,你需要创建两个新用户:designer1tester1。你还需要为他们设置一个简单的密码,以便切换到他们的账户。

使用 useradd 命令创建用户。-m 标志会为他们创建主目录。

sudo useradd -m designer1
sudo useradd -m tester1

接下来,为每个用户设置密码。为简单起见,在本实验中,我们将两者的密码都设为 labex.io(符合长度、大小写混合、数字和特殊字符的复杂性要求)。

sudo passwd designer1
## Enter new UNIX password: labex.io
## Retype new UNIX password: labex.io
## passwd: password updated successfully

sudo passwd tester1
## Enter new UNIX password: labex.io
## Retype new UNIX password: labex.io
## passwd: password updated successfully

现在,更改「服务器」端 (/srv/nfs/*) 共享目录的所有权,以授予这些新用户访问权限。

sudo chown -R designer1:designer1 /srv/nfs/design
sudo chown -R tester1:tester1 /srv/nfs/testing

/srv/nfs/common_data 目录将保持由 root 拥有,使其对普通用户只读。

以 designer1 用户身份测试访问

使用 su(切换用户)命令切换到 designer1 用户账户。- 确保你获得该用户的完整登录环境。

su - designer1
## Password: labex.io

你的命令提示符将变为 [designer1@host ~]$

首先,通过间接映射测试对 design 共享的访问。这应该会成功。

ls -l /project_shares/design
total 4
-rw-r--r--. 1 designer1 designer1 17 Jun 16 16:12 README

现在,尝试向该目录写入文件。这也应该成功。

echo "My design file" > /project_shares/design/design_file.txt
ls -l /project_shares/design
total 8
-rw-r--r--. 1 designer1 designer1 15 Jun 16 16:18 design_file.txt
-rw-r--r--. 1 designer1 designer1 17 Jun 16 16:12 README

接下来,尝试访问 testing 共享。你可以看到内容,但由于它由 tester1 拥有,因此无法写入。

ls -l /project_shares/testing
total 4
-rw-r--r--. 1 tester1 tester1 16 Jun 16 16:12 README

最后,测试直接映射的共享。designer1 应该能够读取它,但不能写入。

cat /mnt/common/info.txt
Common shared data
echo "test" > /mnt/common/new_file.txt
-bash: /mnt/common/new_file.txt: Permission denied

退出 designer1 会话以返回 labex 用户。

exit

以 tester1 用户身份测试访问

现在,以 tester1 用户身份执行类似的测试。

su - tester1
## Password: labex.io

访问 design 共享。你可以看到包括 designer1 创建的文件在内的内容,但无法写入。

ls -l /project_shares/design
total 8
-rw-r--r--. 1 designer1 designer1 15 Jun 16 16:18 design_file.txt
-rw-r--r--. 1 designer1 designer1 17 Jun 16 16:12 README

现在,访问并写入 testing 共享。这应该会成功,因为 tester1 拥有此目录。

ls -l /project_shares/testing
total 4
-rw-r--r--. 1 tester1 tester1 16 Jun 16 16:12 README
echo "My test script" > /project_shares/testing/test_script.sh
ls -l /project_shares/testing
total 8
-rw-r--r--. 1 tester1 tester1 16 Jun 16 16:12 README
-rw-r--r--. 1 tester1 tester1 15 Jun 16 16:19 test_script.sh

退出 tester1 会话。

exit

清理环境

要完成实验并将系统恢复到原始状态,请删除你创建的测试用户。userdel -r 命令会删除用户及其主目录。

sudo userdel -r designer1
sudo userdel -r tester1

至此,关于使用 autofs 管理 NFS 的实验结束。

总结

在本实验中,你学习了如何在 RHEL 系统上配置 NFS 客户端访问。你首先执行了手动挂载,即创建本地挂载点,然后使用 mount 命令连接到 NFS 共享。在使用 mount 命令建立手动连接后,你继续通过在 /etc/fstab 文件中创建条目来配置持久化挂载,确保共享在启动时自动挂载。

此外,实验还涵盖了使用 autofs 服务配置按需挂载。这包括安装并启用该服务,然后定义如何使用两种不同的方法挂载共享:创建用于动态挂载目录的间接映射,以及用于将共享挂载到静态、预定义位置的直接映射。实验最后验证了直接和间接自动挂载在不同用户下是否正常工作。