在 RHEL 中配置 NFS 客户端访问

LinuxBeginner
立即练习

简介

在本实验中,你将学习如何在 Red Hat Enterprise 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,nolock <server>:<remote_directory> <local_mount_point>

  • -t nfs -o vers=3,nolock:指定文件系统类型为 NFS,强制使用 NFSv3,并在本实验的容器环境中不依赖单独的 NFS 锁服务,因此使用本地文件锁定。
  • localhost:/srv/nfs/shared_data:源,即 NFS 服务器及其导出的路径。
  • ~/project/nfs_mount:目标,即本地挂载点。

运行以下命令挂载共享:

sudo mount -t nfs -o vers=3,nolock 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 所有,因此需要将 sudotee 命令结合使用来写入文件:

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 挂载

在本步骤中,你将在掌握手动挂载后,将 NFS 挂载配置为持久化挂载。手动挂载是临时的,系统重启后不会保留。要使挂载永久生效,需要在 /etc/fstab 文件中添加条目。fstab 是「file systems table」(文件系统表)的缩写,该文件列出了系统启动时自动挂载的文件系统和设备。

本步骤将通过向 /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,nolock 0 0

下面解释这一行的各个字段:

  • **localhost:/srv/nfs/shared_data**:要挂载的设备,指定 NFS 服务器(localhost)和导出的目录(/srv/nfs/shared_data)。
  • **/home/labex/project/nfs_mount**:本地挂载点,共享内容将在这里可访问。
  • **nfs**:指定文件系统类型。
  • **defaults,_netdev,vers=3,nolock**:挂载选项。defaults 包含一组标准选项,例如用于读写的 rw_netdev 对网络文件系统非常重要,它会告诉系统等网络处于活动状态后,再尝试挂载此共享。vers=3,nolock 确保本实验的容器环境使用可正常工作的 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,nolock ...),按 Ctrl+K 删除整行。然后按 Ctrl+XYEnter 保存并退出。

这样可以为实验的下一部分保留干净的系统环境。

安装并启用 autofs,设置自动挂载器

在本步骤中,你将从手动挂载和持久化挂载转向自动挂载。/etc/fstab 适合配置永久挂载,但它有一个缺点:系统启动时会尝试挂载所有内容。如果网络共享不可用,可能会拖慢启动过程,甚至导致启动过程暂停。autofs 服务提供的自动挂载器可以解决这个问题:它只在网络文件系统第一次被访问时按需挂载。

autofs 服务使用一组称为「映射」的配置文件,决定要挂载哪些远程共享以及挂载到哪里。在本步骤中,你将安装所需软件包并启动服务,为使用自动挂载器做好准备。

安装 autofs 软件包

默认的 RHEL 安装通常不包含 autofs 功能。你需要使用 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 应如何工作的映射。

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

在本步骤中,你将使用间接映射配置第一条自动挂载规则。间接映射是最常见的自动挂载配置类型。它会将一个基础目录(例如 /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+XYEnter)。

最后,重新导出所有目录,使修改应用到 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,nolock   localhost:/srv/nfs/design
testing -fstype=nfs,rw,sync,vers=3,nolock   localhost:/srv/nfs/testing

下面分析其中一行:

  • **design**:这是「键」。它对应 /project_shares 下的子目录名称。当用户访问 /project_shares/design 时,就会触发这一行配置。
  • **-fstype=nfs,rw,sync,vers=3,nolock**:这些是挂载选项,指定文件系统类型、读写访问、同步写入、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

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

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

在本步骤中,你将学习第二种自动挂载配置类型:直接映射。间接映射会将多个挂载组织在一个公共基础目录下,而直接映射可以在文件系统中的任意位置定义具体的单独挂载点。直接映射中的每个条目都对应一个单独的绝对路径。

直接映射适合将少量共享内容挂载到固定且明确的位置,例如将共享工具目录挂载到 /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+XYEnter)。

重新导出所有目录,使修改应用到 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,nolock   localhost:/srv/nfs/common_data

下面分析这一行:

  • /mnt/common:这是「键」。但对于直接映射,键是挂载点的完整绝对路径
  • **-fstype=nfs,rw,sync,vers=3,nolock**:这些是挂载选项,与前面相同,包括 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

成功!直接挂载点已经按需创建。在本实验环境中,由于 NFS 服务器和客户端是同一台机器,挂载信息的显示可能有所不同,因此成功执行 ls -l /mnt/common 是最可靠的确认方式。

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

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

在本步骤中,你将验证多用户环境中的自动挂载器工作方式。自动挂载可以使共享可用,但真正控制用户能否读取或写入文件的是 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 共享,完成手动挂载。建立手动连接后,你将在 /etc/fstab 文件中创建条目,配置持久化挂载,确保共享在系统启动时自动挂载。

此外,本实验还介绍了如何使用 autofs 服务进行按需挂载。你将安装并启用该服务,然后通过两种不同方式定义共享的挂载方式:创建间接映射来动态挂载目录,以及创建直接映射来将共享挂载到预先定义的静态位置。最后,你将验证不同用户使用直接自动挂载和间接自动挂载时都能正常工作。