介绍
在本实验中,你将学习在 Red Hat Enterprise Linux (RHEL) 系统上配置 NFS 客户端访问所需的基本技能。你将首先使用 mount 命令手动挂载一个网络共享,以理解基本流程。在此之后,你将在 /etc/fstab 中配置一个持久化挂载,以确保 NFS 共享在系统重启后自动可用,从而为静态网络文件系统集成提供基础理解。
在掌握了这些核心概念的基础上,你将通过设置 automounter 来进一步学习更动态和高效的方法。这包括安装和启用 autofs 服务,然后创建间接映射(indirect maps)以实现按需目录挂载,以及创建直接映射(direct maps)以实现静态挂载点。你将通过验证直接和间接 automounts 对不同用户都能正确工作来完成本次实验,从而巩固你管理健壮 NFS 客户端配置的能力。
使用 mount 命令手动挂载 NFS 共享
在此步骤中,你将学习如何使用网络文件系统 (NFS) 协议来手动访问网络共享目录。NFS 允许客户端系统通过计算机网络访问文件,其方式类似于访问本地存储。在本练习中,我们将在你的本地机器上模拟 NFS 服务器和客户端,以练习必要的命令。
你的系统上已预先配置了一个 NFS 服务器,用于导出(共享)目录 /srv/nfs/shared_data。你的任务是将此共享目录挂载到一个本地文件夹,验证访问权限,然后将其卸载。
步骤 1.1:创建本地挂载点
要访问共享的 NFS 目录,你需要一个本地目录作为“挂载点”。这本质上是你客户端系统上的一个空文件夹,远程共享的内容将在挂载后出现在这里。所有操作都将在你的 ~/project 目录下进行。
在你的项目文件夹中创建一个名为 nfs_mount 的目录:
mkdir ~/project/nfs_mount
你可以通过列出项目文件夹的内容来验证目录是否已创建:
ls -F ~/project
nfs_mount/
步骤 1.2:挂载 NFS 共享
现在你可以使用 mount 命令将远程 NFS 共享连接到你新创建的挂载点。该命令需要 sudo 权限,因为挂载文件系统是系统级别的操作。
基本语法是 mount -t nfs <服务器>:<远程目录> <本地挂载点>。
-t nfs: 指定文件系统类型为 NFS。localhost:/srv/nfs/shared_data: 源,即服务器及其导出的路径。~/project/nfs_mount: 目标,即你的本地挂载点。
运行以下命令挂载共享:
sudo mount -t nfs localhost:/srv/nfs/shared_data ~/project/nfs_mount
如果命令成功执行,将不会产生任何输出。
步骤 1.3:验证挂载并与共享交互
运行 mount 命令后,你应该验证共享是否已正确挂载。你可以通过几种方式进行此操作。
首先,使用 mount 命令并通过管道连接 grep 来过滤 NFS 挂载:
mount | grep nfs
localhost:/srv/nfs/shared_data on /home/labex/project/nfs_mount type nfs4 (rw,relatime,vers=4.2,rsize=...,wsize=...,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=...,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
步骤 1.4:卸载 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 共享以实现持久化挂载。
步骤 2.1:准备环境
首先,确保上一步中的挂载点 ~/project/nfs_mount 存在且为空。如果你是直接从上一步继续,它应该已经存在。
如果目录不存在,请立即创建:
mkdir -p ~/project/nfs_mount
另外,请确保当前没有内容挂载到此目录。你可以运行 umount 命令,如果未挂载,它将报告错误,这完全没问题。
sudo umount ~/project/nfs_mount
步骤 2.2:编辑 /etc/fstab 文件
现在,你将向 /etc/fstab 文件添加一个新行来定义持久化 NFS 挂载。你必须使用 sudo 来编辑此系统配置文件。我们将使用 nano 编辑器。
使用以下命令打开文件:
sudo nano /etc/fstab
导航到文件底部并添加以下行。请非常小心语法,因为此文件中的错误可能导致系统启动问题。
localhost:/srv/nfs/shared_data /home/labex/project/nfs_mount nfs defaults,_netdev 0 0
让我们分解这一行:
localhost:/srv/nfs/shared_data: 这是要挂载的设备。它指定了 NFS 服务器 (localhost) 和导出的目录 (/srv/nfs/shared_data)。/home/labex/project/nfs_mount: 这是本地挂载点,共享将在此处可访问。nfs: 这指定了文件系统类型。defaults,_netdev: 这些是挂载选项。defaults包含一组标准选项(如rw表示读写)。_netdev对网络文件系统至关重要;它告诉系统在尝试挂载此共享之前等待网络激活。0: 这是dump字段,由dump备份实用程序使用。值为0表示禁用它。0: 这是pass字段,由fsck实用程序用于确定启动时文件系统检查的顺序。值为0表示文件系统不会被检查。
添加行后,按 Ctrl+X,然后按 Y,最后按 Enter 保存文件并退出 nano。
步骤 2.3:测试 /etc/fstab 条目
你无需重启即可测试新的 /etc/fstab 条目。mount 命令足够智能,可以读取 /etc/fstab。如果你只提供挂载点,mount 将查找 /etc/fstab 中相应的条目并使用它找到的信息。
仅使用挂载点挂载共享:
sudo mount ~/project/nfs_mount
如果命令成功完成而没有错误,则你的 /etc/fstab 条目是正确的。
步骤 2.4:验证挂载
通过检查 mount 命令的输出并列出目录内容来验证共享是否已挂载。
mount | grep nfs_mount
localhost:/srv/nfs/shared_data on /home/labex/project/nfs_mount type nfs4 (rw,relatime,vers=4.2,rsize=...,wsize=...,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=...,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
此挂载现在是持久化的,并且将在重启后自动重新建立。
步骤 2.5:清理环境
为避免与后续实验冲突,你应该撤销更改。首先,卸载共享,然后从 /etc/fstab 中删除你添加的行。
卸载目录:
sudo umount ~/project/nfs_mount
再次打开 /etc/fstab 以删除条目:
sudo nano /etc/fstab
使用箭头键导航到你添加的行(localhost:/srv/nfs/shared_data ...),然后按 Ctrl+K 删除整行。然后,按 Ctrl+X,Y,然后 Enter 保存并退出。
这样可以使系统为实验的下一部分保持干净的状态。
通过安装和启用 autofs 来设置自动挂载器
在之前的步骤中,你探索了手动挂载和持久化挂载。虽然 /etc/fstab 非常适合永久挂载,但它有一个缺点:它会尝试在启动时挂载所有内容。如果网络共享不可用,它可能会减慢甚至中断启动过程。自动挂载器(由 autofs 服务提供)通过按需挂载网络文件系统来解决此问题,仅在首次访问时进行。
autofs 服务使用一组称为“映射”(maps)的配置文件来确定要挂载哪些远程共享以及挂载到何处。在本步骤中,你将通过安装必要的软件包并启动其服务来准备你的系统使用自动挂载器。
步骤 3.1:安装 autofs 软件包
autofs 功能不包含在默认的 RHEL 安装中。你需要使用 dnf 包管理器来安装它。这需要 sudo 权限。
运行以下命令安装 autofs 软件包。-y 标志会自动回答确认提示中的“是”,这对于本次实验很方便。
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!
步骤 3.2:启动 autofs 服务
在标准的 RHEL 系统上,你会使用 systemctl 来启动和启用服务。然而,本次实验在容器化环境中运行,其中 systemctl 不可用。相反,我们将直接使用其命令 automount 来启动 autofs 守护进程。
此命令启动自动挂载器守护进程,它将在后台运行,并监视对其映射中配置的目录的访问尝试。
执行以下命令启动服务:
sudo automount
如果成功,此命令将不会产生任何输出。它只是启动了守护进程。
步骤 3.3:验证服务是否正在运行
由于你无法使用 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 的新基础目录下的项目目录。
步骤 4.1:创建 NFS 服务器导出
首先,让我们准备好要在模拟 NFS 服务器上共享的目录。我们将在 /srv/nfs/ 下创建两个项目目录:design 和 testing。
创建目录并在每个目录中放置一个示例文件:
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 服务器与任何客户端 (*) 共享 design 和 testing 目录,并提供读写 (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
步骤 4.2:创建主映射条目
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 的映射文件以获取指令。”
保存并退出编辑器。
步骤 4.3:创建间接映射文件
现在,创建你在主映射中刚刚引用的间接映射文件 /etc/auto.shares。
sudo nano /etc/auto.shares
向此文件添加以下行:
design -fstype=nfs,rw,sync localhost:/srv/nfs/design
testing -fstype=nfs,rw,sync localhost:/srv/nfs/testing
让我们分解一行:
design: 这是“键”(key)。它对应于/project_shares下的子目录名称。当用户访问/project_shares/design时,此行将被触发。-fstype=nfs,rw,sync: 这些是挂载选项,指定了文件系统类型、读写访问和同步写入。localhost:/srv/nfs/design: 这是要挂载的远程 NFS 共享位置。
保存并退出编辑器。
步骤 4.4:重新加载 autofs 并测试挂载
为了让 autofs 服务识别你的新映射文件,你必须重新加载其配置。由于 systemctl 不可用,我们将向 automount 进程发送 HUP(hangup)信号,这会使其重新读取其配置。
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。
步骤 5.1:准备 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
步骤 5.2:为直接映射创建主映射条目
要使用直接映射,你必须首先从主映射配置中引用它。特殊的挂载点 /- 用于指示关联的映射文件是直接映射。
为我们的直接挂载创建一个新的主映射文件:
sudo nano /etc/auto.master.d/direct.autofs
向此文件添加以下单行:
/- /etc/auto.direct
这一行告诉 autofs:“请查阅文件 /etc/auto.direct 获取直接挂载列表。挂载点是该文件中定义的绝对路径。”
保存并退出编辑器。
步骤 5.3:创建直接映射文件
现在,创建你刚刚引用的直接映射文件 /etc/auto.direct。
sudo nano /etc/auto.direct
向此文件添加以下行。格式与间接映射略有不同。
/mnt/common -fstype=nfs,rw,sync localhost:/srv/nfs/common_data
让我们分析一下这一行:
/mnt/common: 这是“键”(key),但对于直接映射,键是挂载点的完整绝对路径。-fstype=nfs,rw,sync: 这些是挂载选项,与之前相同。localhost:/srv/nfs/common_data: 这是远程 NFS 共享位置。
保存并退出编辑器。
步骤 5.4:重新加载 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
成功了!直接挂载是按需创建的。你也可以使用 mount 命令进行验证:
mount | grep common
localhost:/srv/nfs/common_data on /mnt/common type nfs4 (rw,relatime,vers=4.2,rsize=...,wsize=...,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=...,local_lock=none,addr=...)
你现在已经成功配置了用于动态子目录的间接映射和用于静态绝对挂载点的直接映射。
以不同用户身份验证直接和间接自动挂载
在最后这个步骤中,你将验证自动挂载器在多用户环境中的工作方式。自动挂载使共享可用,但实际控制文件读写权限的是 NFS 服务器上底层的 filesystem 权限。你将创建几个测试用户,将相应的 NFS 共享的所有权分配给他们,然后测试他们对间接和直接映射的访问。
这个实验演示了一个真实场景,其中不同的团队(例如,设计和测试)拥有各自共享目录的所有权,其他用户可以读取,但写入权限仅限于所有者。
步骤 6.1:创建测试用户并设置权限
首先,你需要创建两个新用户:designer1 和 tester1。你还将为他们设置一个简单的密码,以便你可以切换到他们的账户。
使用 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 所有,使其对普通用户只读。
步骤 6.2:以 designer1 用户身份测试访问
使用 su(substitute user)命令切换到 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
步骤 6.3:以 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
步骤 6.4:清理环境
为了完成实验并恢复系统到其原始状态,请删除你创建的测试用户。userdel -r 命令会删除用户及其主目录。
sudo userdel -r designer1
sudo userdel -r tester1
至此,关于使用 autofs 管理 NFS 的实验结束。
总结
在本实验中,你将学习如何在 RHEL 系统上配置 NFS 客户端访问。你将首先执行手动挂载,先创建一个本地挂载点,然后使用 mount 命令连接到 NFS 共享。在通过 mount 命令建立手动连接后,你将继续配置持久挂载,方法是在 /etc/fstab 文件中创建一个条目,确保共享在启动时自动挂载。
此外,本实验还涵盖了使用 autofs 服务配置按需挂载。这包括安装和启用该服务,然后定义如何使用两种不同的方法挂载共享:创建用于动态挂载目录的间接映射,以及用于将共享挂载到静态、预定义位置的直接映射。最后,将验证直接和间接自动挂载是否都能为不同用户正确工作。



