一、NFS 服务器概述
1.1 NFS 背景介绍
NFS(Network File System,网络文件系统)是一款诞生于 UNIX/Linux 体系早期的网络文件共享协议,其历史可追溯到 "需穿白大褂操作计算机" 的年代。在那个网络环境相对封闭、所有联网计算机均被默认为可信的时期,NFS 的设计核心聚焦于文件共享的高效性和易用性,安全性方面的考量相对薄弱,这一特性也成为其后续使用中需要重点关注的点。
作为 FreeBSD 支持的文件系统之一,NFS 的核心作用是允许不同计算机(无论是否同构系统)、不同操作系统(主要适配 UNIX/Linux 系列,部分 Windows 系统可通过插件支持)通过 TCP/IP 网络实现资源共享。从客户端的使用体验来看,NFS 服务器共享的目录可以被挂载到本地文件系统中,后续对该目录的读写操作与本地磁盘分区完全一致,极大降低了用户的使用门槛。
NFS 的一个重要特性是端口不固定。由于其支持的功能模块较多,每个功能模块启动时都会随机占用一个未被使用的、小于 1024 的端口用于数据传输。这一设计会导致客户端无法提前知晓 NFS 服务的具体通信端口,进而无法直接建立连接。为解决这一问题,NFS 必须依赖 RPC(Remote Procedure Call,远程过程调用)协议协同工作:
- RPC 协议会占用固定端口 111,持续监听客户端的端口查询请求;
- NFS 服务启动时,会主动向本地 RPC 服务注册自身所有功能模块对应的端口信息;
- 当客户端需要连接 NFS 服务时,会先向服务端的 RPC 服务发送端口查询请求,RPC 服务查询到对应端口后反馈给客户端,客户端再通过该端口与 NFS 服务建立连接。
关键注意事项:
- 启动 NFS 服务前,必须先启动 RPC 服务,否则 NFS 服务无法完成端口注册,客户端将无法连接;
- 若 RPC 服务重启,之前所有已注册的端口信息会全部丢失,因此 RPC 重启后,其管理的所有服务(包括 NFS)都必须重新启动并重新完成注册。
1.2 NFS 生产应用场景
NFS 的核心定位是跨主机、跨网络的文件共享,其应用场景与 Windows 系统的网络共享、Linux 系统的 Samba 服务有明确区分,具体对比和适用场景如下:
- 功能对比:Windows 网络共享和 Samba 服务更适用于办公局域网环境,主要用于 Windows 与 Linux 之间、Windows 主机之间的文件交换;NFS 则主要面向互联网服务架构,专注于 Linux/Unix 主机之间的高效文件共享。
- 典型用途:在企业集群架构中,NFS 常作为前端所有 Web 服务的共享存储服务器,专门存储用户上传的静态资源,例如图片、附件、头像、视频片段等。需要特别注意的是,网站的程序代码不建议存放在 NFS 共享目录中------ 因为程序代码由开发或运维人员统一批量发布,不存在多节点同步延迟问题,直接部署到各个 Web 节点本地,访问效率远高于通过网络访问 NFS 共享目录。
- 适用规模:NFS 在 2000 万 PV(页面浏览量)以下的中小型网站中应用频率极高,部署成本低、维护简单且性能满足需求;对于大型企业或门户网站,除了部分场景使用 NFS 外,更多会采用分布式文件系统(如 GlusterFS、Ceph 等)来满足海量数据存储和高并发访问需求。
二、NFS 工作原理

2.1 核心交互流程
NFS 服务的正常运行依赖 NFS 服务器、RPC 服务器与客户端三者之间的协同工作,具体流程可拆解为以下 4 个关键步骤:
- 服务端操作:启动 RPC 服务(对应的服务名称为 rpcbind),RPC 服务启动后会监听 111 端口,等待客户端的端口查询请求;
- 服务端操作:启动 NFS 服务,NFS 服务启动后会自动向本地的 RPC 服务注册所有功能模块对应的端口信息(包括数据传输端口、控制端口等);
- 客户端操作:启动本地的 RPC 服务(portmap 服务),并向 NFS 服务端的 RPC 服务(111 端口)发送请求,查询 NFS 服务的通信端口;
- 服务端响应:服务端的 RPC 服务接收到客户端的查询请求后,从已注册的端口信息中查找 NFS 服务的可用端口,将其反馈给客户端;客户端获取端口后,通过该端口与服务端的 NFS 服务建立连接,后续即可进行文件读写操作。
补充说明:NFS 服务的默认数据传输端口为 2049,可通过
cat /etc/services | grep nfs命令在服务端或客户端验证该端口映射关系。
三、NFS 服务器部署与使用
3.1 环境准备与安装
3.1.1 基础环境配置(服务端与客户端均需执行)
在部署 NFS 服务前,需先关闭系统的安全机制(SELinux 和防火墙),避免其拦截 NFS 和 RPC 的通信:
# 临时关闭SELinux(立即生效,重启后失效)
setenforce 0
# 永久关闭SELinux(需重启系统生效,可选)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 临时关闭防火墙(立即生效,重启后失效)
systemctl stop firewalld
# 永久关闭防火墙(需重启系统生效,可选)
systemctl disable firewalld
3.1.2 安装依赖包
NFS 服务的核心依赖包为nfs-utils,RPC 服务依赖包为rpcbind(大部分 Linux 发行版默认已预装,若未安装需手动安装):
# 安装NFS和RPC依赖包
yum install nfs-utils rpcbind -y
# 验证安装结果(可选)
rpm -qa | grep nfs-utils
rpm -qa | grep rpcbind
3.2 NFS 核心配置文件详解
NFS 服务的配置和运行依赖多个关键文件,其路径和功能如下表所示:
| 配置文件 / 命令路径 | 核心作用 |
|---|---|
/etc/exports |
NFS 服务的主配置文件,用于定义共享目录、允许访问的客户端及共享权限,默认为空文件,需手动编写 |
/usr/sbin/exportfs |
NFS 共享目录管理命令,可用于重新加载/etc/exports配置、卸载共享目录、查看共享状态等 |
/var/lib/nfs |
NFS 服务的日志和状态存储目录,包含共享目录的状态文件、挂载记录等 |
/var/lib/nfs/etab |
NFS 服务的权限生效文件,/etc/exports配置生效后,会自动同步到该文件,记录最终的共享权限和客户端规则 |
常用
exportfs命令选项:
exportfs -r:重新加载/etc/exports配置,无需重启 NFS 服务;exportfs -v:查看当前 NFS 服务的共享状态(包括共享目录、客户端、权限等);exportfs -u:卸载指定的共享目录(如exportfs -u 192.168.48.0/24:/nfsfile);exportfs -a:加载/etc/exports中所有的共享配置。
3.3 主配置文件/etc/exports深度解析
/etc/exports是 NFS 服务的核心配置文件,所有共享规则均需在此定义,其语法格式和配置项需严格遵循规范。
3.3.1 基本语法格式
共享目录的绝对路径 允许访问的客户端(权限参数)
- 格式说明:共享目录路径与客户端之间用空格分隔,客户端与权限参数之间无空格(权限参数需用括号包裹);
- 多客户端配置:若需为多个客户端配置不同权限,可在同一行用空格分隔多个 "客户端 (权限)" 组合,或分多行配置。
3.3.2 允许访问的客户端配置规则
允许访问的客户端支持多种格式,可根据实际需求选择,常见格式如下:
| 客户端格式示例 | 说明 |
|---|---|
| 192.168.48.131 | 单个 IP 地址,仅允许该 IP 对应的客户端访问 |
| 192.168.48.0/24 | CIDR 网段格式,允许该网段内所有客户端访问(推荐) |
| 192.168.48.0/255.255.255.0 | 子网掩码格式,与上述 CIDR 格式功能一致 |
| *.openlab.com | 域名格式,允许该域名下所有主机访问(需 DNS 解析支持) |
| 192.168.48.0/24,10.0.0.0/24 | 多网段组合,用逗号分隔,无空格 |
| * | 通配符,允许所有主机访问(生产环境不推荐,安全性低) |
3.3.3 核心权限参数说明
权限参数用于控制客户端对共享目录的操作权限,多个参数之间用逗号分隔,无空格,常见核心参数如下表所示:
| 权限参数 | 作用说明 | 推荐级别 |
|---|---|---|
ro |
只读权限,客户端仅能查看共享目录中的文件,无法创建、修改或删除文件 | 按需选择 |
rw |
读写权限,客户端可创建、修改、删除共享目录中的文件,但最终能否生效需结合共享目录的本地文件系统权限(如目录本身是否有 w 权限) | 按需选择 |
root_squash |
客户端以 root 账户访问共享目录时,自动映射为服务端的匿名账户(nobody,默认 UID/GID=65534),避免客户端 root 账户直接操控服务端文件系统 | 推荐 |
no_root_squash |
客户端以 root 账户访问时,直接映射为服务端的 root 账户,客户端可对共享目录执行任意操作,安全性极低,生产环境严禁使用 | 不推荐 |
all_squash |
无论客户端使用何种账户(root 或普通用户)访问,均映射为服务端的匿名账户(nobody),可避免客户端账户与服务端账户 UID/GID 冲突,生产环境强烈推荐 | 强烈推荐 |
no_all_squash |
客户端普通账户访问时,保持账户身份原样映射(即客户端的 user1 账户映射为服务端的 user1 账户),需确保两端账户 UID/GID 一致,否则可能出现权限问题 | 不推荐 |
anonuid=xxx |
自定义匿名账户的 UID(替代默认的 65534),需提前在服务端创建对应 UID 的用户,适用于需要精准控制文件所有者的场景 | 按需选择 |
anongid=xxx |
自定义匿名账户的 GID(与 anonuid 配合使用),需提前在服务端创建对应 GID 的组 | 按需选择 |
sync |
同步写入机制,客户端写入数据时,服务端同时将数据写入内存和硬盘,确保数据不丢失,性能略低 | 强烈推荐 |
async |
异步写入机制,客户端写入数据时,服务端先将数据存入内存,后续再批量刷入硬盘,性能较高,但服务端意外宕机可能导致数据丢失 | 不推荐 |
no_subtree_check |
关闭子目录检查,减少服务端对共享目录的权限验证开销,可提升 NFS 服务稳定性和性能 | 推荐 |
3.3.4 经典配置示例
结合生产环境需求,以下是几个常用的/etc/exports配置示例,附带详细说明:
示例 1:允许所有主机访问,适用于测试环境
# 共享目录为/home/public,所有主机可读写,同步传输,所有账户映射为nobody
/home/public *(rw,sync,all_squash,no_subtree_check)
示例 2:仅允许指定网段访问,只读权限
# 共享目录为/home/docs,仅192.168.48.0/24网段可访问,只读,root映射为nobody
/home/docs 192.168.48.0/24(ro,root_squash,sync,no_subtree_check)
示例 3:指定网段读写,自定义匿名账户 UID/GID
# 共享目录为/home/data,192.168.48.0/24网段可读写,所有账户映射为UID=2000/GID=2000的账户
/home/data 192.168.48.0/24(rw,all_squash,anonuid=2000,anongid=2000,sync,no_subtree_check)
示例 4:多客户端不同权限配置
# 192.168.48.131(单个IP)只读,10.0.0.0/24网段读写
/home/share 192.168.48.131(ro,sync,root_squash) 10.0.0.0/24(rw,sync,all_squash)
3.4 实战:NFS 基础共享实验(服务端 + 客户端完整流程)
本实验目标:搭建 NFS 服务端,共享指定目录,客户端通过手动挂载和开机自动挂载两种方式访问共享目录。
步骤 1:服务端配置(核心操作)
-
创建 NFS 共享目录并设置本地文件系统权限:
# 创建共享目录(路径可自定义,需与后续配置文件一致) mkdir /nfsfile # 向共享目录写入测试文件,用于后续客户端验证 echo "welcome to www.openlab.com" > /nfsfile/readme.txt # 设置共享目录权限为777,确保客户端匿名账户可读写(生产环境可根据实际需求调整) chmod -R 777 /nfsfile # 验证目录和文件状态 ll -d /nfsfile ll /nfsfile/readme.txt -
编写 NFS 主配置文件
/etc/exports:# 编辑配置文件 vim /etc/exports # 添加以下配置(允许192.168.48.0/24网段访问,读写权限,同步传输,所有账户映射为nobody) /nfsfile 192.168.48.0/24(rw,sync,all_squash,no_subtree_check) # 保存退出(vim编辑器:按ESC,输入:wq回车) -
启动 NFS 和 RPC 服务并设置开机自启:
# 先启动RPC服务(rpcbind),再启动NFS服务,顺序不可颠倒 systemctl start rpcbind systemctl start nfs-server # 设置开机自启,避免系统重启后服务失效 systemctl enable rpcbind systemctl enable nfs-server # 验证服务状态(确保服务正常运行,无报错) systemctl status rpcbind systemctl status nfs-server -
验证 NFS 共享配置:
# 查看当前NFS服务的共享状态 exportfs -v # 预期输出(类似如下内容,表明共享目录已生效) /nfsfile 192.168.48.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,all_squash)
步骤 2:客户端配置与访问
-
安装 NFS 客户端依赖(若未安装):
# 客户端仅需安装nfs-utils即可(rpcbind通常默认已安装) yum install nfs-utils -y -
查看服务端 NFS 共享目录:
# 语法:showmount -e NFS服务端IP showmount -e 192.168.48.130 # 预期输出(表明客户端可正常发现服务端共享目录) Export list for 192.168.48.130: /nfsfile 192.168.48.0/24 -
手动挂载 NFS 共享目录到客户端本地:
# 创建客户端本地挂载目录(路径可自定义) mkdir /nfs1 # 执行挂载命令:mount -t nfs 服务端IP:共享目录 本地挂载目录 mount -t nfs 192.168.48.130:/nfsfile /nfs1 # 验证挂载结果 df -h | grep nfs # 预期输出(类似如下内容,表明挂载成功) 192.168.48.130:/nfsfile 27G 1.6G 24G 7% /nfs1 # 访问共享目录,验证文件可读性 cd /nfs1 cat readme.txt # 预期输出:welcome to www.openlab.com # 验证写入权限(若服务端配置rw权限) touch test_client.txt ll test_client.txt # 预期输出:文件所有者为nobody(因配置了all_squash) -
配置开机自动挂载(永久生效,避免重启后需手动重新挂载):客户端重启后,手动挂载的 NFS 目录会失效,需通过
/etc/fstab文件配置开机自动挂载:# 编辑/etc/fstab文件 vim /etc/fstab # 在文件末尾添加以下内容(每行代表一个挂载配置) 192.168.48.130:/nfsfile /nfs1 nfs defaults 0 0 # 配置说明: # 192.168.48.130:/nfsfile:NFS服务端共享目录路径 # /nfs1:客户端本地挂载目录 # nfs:文件系统类型 # defaults:挂载参数(默认包含rw、suid、dev等,可根据需求添加如noatime等参数) # 0:dump备份参数(0表示不备份,1表示备份) # 0:fsck检查参数(0表示不检查,1表示优先检查,2表示次要检查) # 保存退出后,测试挂载配置是否生效(无需重启系统) mount -a # 再次验证挂载结果(若无报错,表明配置正常) df -h | grep nfs1
补充说明:若执行
mount -a时出现报错,可通过journalctl -xe或dmesg | grep nfs查看错误日志,常见问题包括:服务端 NFS 服务未启动、网络不通、/etc/fstab配置格式错误(如路径写错、参数分隔符错误)。
3.5 进阶:NFS 账户映射与权限优先级实验
NFS 的权限控制涉及两方面:/etc/exports中的配置权限,以及共享目录的本地文件系统权限。本实验将验证两者的优先级,以及不同账户映射规则的效果。
实验 1:权限优先级验证(文件系统权限 > NFS 配置权限)
-
服务端操作:修改共享目录的本地文件系统权限为只读(444),即使 NFS 配置为 rw 权限:
# 服务端执行:将/nfsfile目录权限改为444(只读) chmod -R 444 /nfsfile # 验证权限 ll -d /nfsfile ll /nfsfile/readme.txt # 预期输出:权限均为r--r--r-- -
客户端操作:尝试访问和写入共享目录:
# 客户端尝试进入挂载目录 cd /nfs1 # 预期结果:提示"权限不够"(因服务端目录权限为444,即使NFS配置rw也无法访问) # 若已进入目录,尝试创建文件 touch test_perm.txt # 预期结果:提示"权限不够" -
结论:NFS 的最终访问权限由 "文件系统本地权限" 和 "NFS 配置权限" 共同决定,且文件系统权限优先级更高------ 即使 NFS 配置为 rw,若本地目录权限为只读,客户端也无法写入。
实验 2:不同账户映射规则验证
本实验将分别测试root_squash(默认)、all_squash、anonuid/anongid三种映射规则的效果。
2.1 测试root_squash(客户端 root 映射为服务端 nobody)
-
服务端修改 NFS 配置:
vim /etc/exports # 修改为以下配置 /nfsfile 192.168.48.0/24(rw,sync,root_squash,no_subtree_check) # 重新加载配置(无需重启服务) exportfs -r # 恢复共享目录权限为777 chmod -R 777 /nfsfile -
客户端操作:
# 客户端以root账户创建文件 cd /nfs1 touch test_root_squash.txt ll test_root_squash.txt # 预期输出:文件所有者为nobody(root账户被映射) # 客户端切换为普通用户(如fox)创建文件 su fox cd /nfs1 touch test_user_squash.txt ll test_user_squash.txt # 预期输出:文件所有者为fox(普通用户身份原样映射,因配置了no_all_squash默认值)
2.2 测试all_squash(所有客户端账户映射为 nobody)
-
服务端修改 NFS 配置:
vim /etc/exports # 修改为以下配置 /nfsfile 192.168.48.0/24(rw,sync,all_squash,no_subtree_check) # 重新加载配置 exportfs -r -
客户端操作:
# 客户端root账户创建文件 cd /nfs1 touch test_all_squash_root.txt ll test_all_squash_root.txt # 预期输出:所有者为nobody # 客户端普通用户创建文件 su fox cd /nfs1 touch test_all_squash_user.txt ll test_all_squash_user.txt # 预期输出:所有者为nobody(所有账户均被映射)
2.3 测试anonuid/anongid(自定义映射账户)
-
服务端操作:创建自定义 UID/GID 的账户,并修改 NFS 配置:
# 服务端创建用户(UID=2000,GID=2000) groupadd -g 2000 nfsuser useradd -u 2000 -g 2000 nfsuser # 修改NFS配置 vim /etc/exports /nfsfile 192.168.48.0/24(rw,sync,all_squash,anonuid=2000,anongid=2000,no_subtree_check) # 重新加载配置 exportfs -r -
客户端操作:
# 客户端任意账户创建文件 cd /nfs1 touch test_anonuid.txt ll test_anonuid.txt # 预期输出:所有者为2000:2000(即服务端的nfsuser账户)
四、autofs 自动挂载服务
4.1 autofs 产生背景与核心优势
传统的 NFS 挂载方式(手动挂载或/etc/fstab开机挂载)存在以下问题:
- 网络可靠性问题:若 NFS 服务端宕机或网络中断,客户端挂载目录会处于 "挂死" 状态,访问该目录时会出现长时间超时,影响客户端系统稳定性;
- 资源浪费问题:即使客户端长期不访问 NFS 共享目录,挂载关系依然存在,会持续占用客户端的网络资源和系统资源。
autofs 是一款运行在客户端的 Linux 系统守护进程,其核心设计理念是 "按需挂载、自动卸载",可完美解决上述问题:
- 按需挂载:仅当用户主动访问 NFS 挂载目录时,autofs 才会自动执行挂载操作,建立客户端与服务端的连接;
- 自动卸载:当 NFS 共享目录闲置超过默认时间(300 秒,即 5 分钟)后,autofs 会自动卸载该挂载,释放资源;
- 兼容性强:支持 NFS、本地设备(如光盘、U 盘)、SMB 等多种文件系统的自动挂载。
4.2 autofs 安装与配置文件详解
4.2.1 安装 autofs(仅客户端需安装)
# 客户端安装autofs
yum install autofs -y
# 验证安装结果
rpm -qa | grep autofs
systemctl status autofs # 默认未启动
4.2.2 核心配置文件结构
autofs 的配置采用 "主配置文件 + 子配置文件" 的分层结构,避免主配置文件过于臃肿,便于维护:
- 主配置文件:
/etc/auto.master,用于定义 "挂载父目录" 与 "子配置文件" 的映射关系,即指定哪些目录的自动挂载规则由哪个子配置文件管理; - 子配置文件:由用户自定义命名(如
/etc/auto.nfs、/etc/auto.iso),用于定义具体的挂载规则(如 NFS 服务端地址、共享目录、本地子目录、挂载参数等)。
4.2.3 配置文件语法格式
-
主配置文件
/etc/auto.master格式:挂载父目录 子配置文件路径- 挂载父目录:客户端本地的目录(无需提前创建,autofs 会自动创建),所有自动挂载的子目录均位于该目录下;
- 子配置文件路径:自定义的子配置文件(需手动创建),用于存储该父目录下的所有挂载规则。
示例:
/nfs /etc/auto.nfs # 父目录/nfs下的自动挂载规则由/etc/auto.nfs文件定义 /media /etc/auto.iso # 父目录/media下的自动挂载规则由/etc/auto.iso文件定义 -
子配置文件格式:
本地挂载子目录 [-挂载参数] 服务端资源路径- 本地挂载子目录:位于主配置文件定义的 "挂载父目录" 下的子目录(无需提前创建,autofs 会自动创建);
- 挂载参数:可选,用于控制挂载行为(如读写权限、网络超时策略等),多个参数用逗号分隔;
- 服务端资源路径:NFS 共享目录(格式:
服务端IP:共享目录)或本地设备路径(如:/dev/sr0为光盘设备)。
示例(NFS 自动挂载):
testmnt -rw,soft,intr 192.168.48.130:/data # 父目录为/nfs时,完整挂载路径为/nfs/testmnt
4.2.4 常用挂载参数说明
子配置文件中可指定的挂载参数较多,以下是 NFS 自动挂载常用的核心参数:
| 挂载参数 | 作用说明 |
|---|---|
rw/ro |
读写 / 只读权限(需与 NFS 服务端配置一致,否则可能挂载失败) |
fg/bg |
挂载行为执行方式:fg(前台)表示挂载时阻塞当前进程,直到挂载成功或超时;bg(后台)表示挂载在后台执行,不影响前台程序运行,失败后会自动重试 |
soft/hard |
网络异常处理策略:soft 表示网络中断时,RPC 调用超时后停止重试,返回错误;hard 表示网络中断时,RPC 持续重试,直到连接恢复(配合 intr 参数可中断) |
intr |
配合 hard 参数使用,允许用户中断 RPC 的持续重试(如按 Ctrl+C 终止) |
rsize/wsize |
读写数据块大小(单位:字节),建议设置为 4096 或 8192,优化传输效率(需与服务端兼容) |
noatime |
禁止更新文件的访问时间戳,可减少磁盘 I/O 开销,提升性能 |
nosuid |
禁止执行共享目录中带有 SUID 权限的文件,提升安全性 |
4.3 实战 1:NFS 自动挂载(客户端按需挂载服务端共享目录)
本实验目标:服务端共享/data目录,客户端通过 autofs 实现 "访问时自动挂载、闲置 5 分钟自动卸载"。
步骤 1:服务端准备工作
-
恢复基础环境(若之前做过其他实验,建议恢复系统快照或重新配置):
setenforce 0 systemctl stop firewalld yum install nfs-utils rpcbind -y -
创建共享目录并配置 NFS:
# 创建共享目录 mkdir /data chmod -R 777 /data # 写入测试文件 echo "this is autofs test file" > /data/auto_test.txt # 配置/etc/exports vim /etc/exports /data *(rw,sync,all_squash,no_subtree_check) # 允许所有主机访问 # 启动服务并设置自启 systemctl start rpcbind && systemctl enable rpcbind systemctl start nfs-server && systemctl enable nfs-server # 验证共享状态 exportfs -v
步骤 2:客户端配置 autofs
-
安装依赖包(若未安装):
yum install nfs-utils autofs -y -
编辑 autofs 主配置文件
/etc/auto.master:vim /etc/auto.master # 在文件末尾添加以下内容(定义挂载父目录和子配置文件) /nfs /etc/auto.nfs # 保存退出 -
创建并编辑 autofs 子配置文件
/etc/auto.nfs:# 创建子配置文件 touch /etc/auto.nfs vim /etc/auto.nfs # 添加以下挂载规则 testmnt -rw,soft,intr,rsize=8192,wsize=8192 192.168.48.130:/data # 规则说明: # testmnt:本地挂载子目录(完整路径为/nfs/testmnt) # -rw,soft,intr,...:挂载参数(读写、soft模式、允许中断、读写块大小8192字节) # 192.168.48.130:/data:NFS服务端共享目录 # 保存退出 -
启动 autofs 服务并设置开机自启:
systemctl start autofs systemctl enable autofs # 验证服务状态(确保无报错) systemctl status autofs
步骤 3:验证 autofs 自动挂载功能
-
初始状态验证(未访问挂载目录时):
# 查看挂载情况,此时autofs未执行挂载 df -h | grep nfs # 预期输出:无任何相关挂载记录 # 查看父目录/nfs(autofs已自动创建) ll /nfs # 预期输出:目录为空,无testmnt子目录(子目录在访问时才创建) -
访问挂载目录,触发自动挂载:
# 进入挂载子目录(触发autofs自动挂载) cd /nfs/testmnt # 验证挂载结果 df -h | grep nfs # 预期输出(类似如下内容,表明挂载成功) 192.168.48.130:/data 16G 4.2G 12G 27% /nfs/testmnt # 访问共享目录中的文件,验证可读性 cat auto_test.txt # 预期输出:this is autofs test file # 验证写入权限(服务端配置rw) touch client_auto.txt ll client_auto.txt # 预期输出:所有者为nobody -
验证自动卸载功能:
# 退出挂载目录,等待5分钟(默认闲置时间) cd ~ sleep 300 # 再次查看挂载情况 df -h | grep nfs # 预期输出:无相关挂载记录,表明已自动卸载
补充说明:若需修改自动卸载时间,可编辑
/etc/sysconfig/autofs文件,修改TIMEOUT参数(单位:秒),例如TIMEOUT=60表示闲置 1 分钟后自动卸载,修改后需重启 autofs 服务:systemctl restart autofs。
4.4 实战 2:本地光盘自动挂载(autofs 挂载本地设备)
除了 NFS,autofs 还可用于本地设备的自动挂载,本实验以光盘为例,实现 "访问/media/cdrom时自动挂载光盘,闲置后自动卸载"。
步骤 1:客户端配置 autofs
-
安装 autofs(若未安装):
yum install autofs -y -
编辑 autofs 主配置文件
/etc/auto.master:vim /etc/auto.master # 在文件末尾添加以下内容 /media /etc/auto.iso # 保存退出 -
创建并编辑 autofs 子配置文件
/etc/auto.iso:touch /etc/auto.iso vim /etc/auto.iso # 添加以下挂载规则(光盘设备) cdrom -fstype=iso9660,ro,nosuid,nodev :/dev/sr0 # 规则说明: # cdrom:本地挂载子目录(完整路径为/media/cdrom) # -fstype=iso9660:指定文件系统类型为光盘专用的iso9660 # ro:只读模式(光盘为只读设备,必须配置ro) # nosuid:禁止SUID权限,提升安全性 # nodev:不解析设备文件,避免冲突 # :/dev/sr0:本地光盘设备路径(部分系统为/dev/cdrom,可通过ls /dev | grep cdrom查看) # 保存退出 -
重启 autofs 服务:
systemctl restart autofs
步骤 2:验证光盘自动挂载
-
插入光盘(物理机插入光盘,虚拟机需挂载 ISO 镜像文件)。
-
初始状态验证:
df -h | grep cdrom # 预期输出:无挂载记录 ll /media # 预期输出:无cdrom子目录 -
访问挂载目录,触发自动挂载:
cd /media/cdrom # 验证挂载结果 df -h | grep cdrom # 预期输出(类似如下内容) /dev/sr0 8.5G 8.5G 0 100% /media/cdrom # 查看光盘内容 ls # 预期输出:光盘中的目录和文件(如AppStream、BaseOS、RPM包等) -
验证自动卸载:
# 退出目录,等待5分钟 cd ~ sleep 300 # 查看挂载情况 df -h | grep cdrom # 预期输出:无挂载记录,已自动卸载
五、常见问题排查与注意事项
5.1 常见问题排查
-
客户端执行
showmount -e 服务端IP时提示 "clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)":- 原因:服务端或客户端防火墙未关闭,拦截了 111 端口(RPC)的通信;
- 解决:关闭防火墙(
systemctl stop firewalld)。
-
客户端挂载时提示 "mount.nfs: access denied by server while mounting 服务端 IP: 共享目录":
- 原因:服务端
/etc/exports配置中未允许该客户端访问,或权限参数错误; - 解决:检查
/etc/exports中的客户端网段 / IP 配置,执行exportfs -r重新加载配置。
- 原因:服务端
-
客户端挂载后无法写入文件,提示 "Permission denied":
- 原因 1:服务端 NFS 配置为
ro权限,或未配置rw; - 原因 2:服务端共享目录的本地文件系统权限不足(如未设置 777);
- 原因 3:客户端账户被映射为匿名账户(nobody),而服务端目录对 nobody 无写入权限;
- 解决:确认 NFS 配置为
rw,服务端目录权限为 777,必要时配置all_squash + anonuid/anongid。
- 原因 1:服务端 NFS 配置为
-
autofs 无法自动挂载,进入挂载目录时提示 "No such file or directory":
- 原因:主配置文件或子配置文件格式错误(如路径写错、参数分隔符错误);
- 解决:检查
/etc/auto.master和子配置文件的语法,查看 autofs 日志排查错误:journalctl -u autofs。
5.2 生产环境注意事项
-
安全性方面:
- 避免使用
*通配符允许所有主机访问,尽量限制具体的客户端网段; - 禁用
no_root_squash参数,防止客户端 root 账户操控服务端文件系统; - 必要时结合防火墙策略,仅开放 NFS(2049 端口)和 RPC(111 端口)给允许访问的客户端。
- 避免使用
-
性能优化方面:
- NFS 配置中添加
no_subtree_check参数,减少权限验证开销; - 客户端挂载时设置
rsize=8192和wsize=8192(或更大值,如 16384),优化传输效率; - 对于高并发场景,可考虑使用 NFS v4 版本(默认 v3),支持更优的性能和安全性。
- NFS 配置中添加
-
稳定性方面:
- 配置 autofs 时优先使用
soft + intr参数,避免网络异常导致客户端挂死; - 定期备份 NFS 共享目录中的数据,防止服务端故障导致数据丢失;
- 避免在 NFS 共享目录中存放频繁读写的小文件(如日志文件),可采用其他方案(如 ELK)存储。
- 配置 autofs 时优先使用