CE(NFS服务器)

一、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 服务建立连接。

关键注意事项:

  1. 启动 NFS 服务前,必须先启动 RPC 服务,否则 NFS 服务无法完成端口注册,客户端将无法连接;
  2. 若 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 个关键步骤:

  1. 服务端操作:启动 RPC 服务(对应的服务名称为 rpcbind),RPC 服务启动后会监听 111 端口,等待客户端的端口查询请求;
  2. 服务端操作:启动 NFS 服务,NFS 服务启动后会自动向本地的 RPC 服务注册所有功能模块对应的端口信息(包括数据传输端口、控制端口等);
  3. 客户端操作:启动本地的 RPC 服务(portmap 服务),并向 NFS 服务端的 RPC 服务(111 端口)发送请求,查询 NFS 服务的通信端口;
  4. 服务端响应:服务端的 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:服务端配置(核心操作)
  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
  2. 编写 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回车)
  3. 启动 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
  4. 验证 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:客户端配置与访问
  1. 安装 NFS 客户端依赖(若未安装):

    复制代码
    # 客户端仅需安装nfs-utils即可(rpcbind通常默认已安装)
    yum install nfs-utils -y
  2. 查看服务端 NFS 共享目录:

    复制代码
    # 语法:showmount -e NFS服务端IP
    showmount -e 192.168.48.130
    
    # 预期输出(表明客户端可正常发现服务端共享目录)
    Export list for 192.168.48.130:
    /nfsfile 192.168.48.0/24
  3. 手动挂载 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)
  4. 配置开机自动挂载(永久生效,避免重启后需手动重新挂载):客户端重启后,手动挂载的 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 -xedmesg | grep nfs查看错误日志,常见问题包括:服务端 NFS 服务未启动、网络不通、/etc/fstab配置格式错误(如路径写错、参数分隔符错误)。

3.5 进阶:NFS 账户映射与权限优先级实验

NFS 的权限控制涉及两方面:/etc/exports中的配置权限,以及共享目录的本地文件系统权限。本实验将验证两者的优先级,以及不同账户映射规则的效果。

实验 1:权限优先级验证(文件系统权限 > NFS 配置权限)
  1. 服务端操作:修改共享目录的本地文件系统权限为只读(444),即使 NFS 配置为 rw 权限:

    复制代码
    # 服务端执行:将/nfsfile目录权限改为444(只读)
    chmod -R 444 /nfsfile
    
    # 验证权限
    ll -d /nfsfile
    ll /nfsfile/readme.txt
    # 预期输出:权限均为r--r--r--
  2. 客户端操作:尝试访问和写入共享目录:

    复制代码
    # 客户端尝试进入挂载目录
    cd /nfs1
    # 预期结果:提示"权限不够"(因服务端目录权限为444,即使NFS配置rw也无法访问)
    
    # 若已进入目录,尝试创建文件
    touch test_perm.txt
    # 预期结果:提示"权限不够"
  3. 结论:NFS 的最终访问权限由 "文件系统本地权限" 和 "NFS 配置权限" 共同决定,且文件系统权限优先级更高------ 即使 NFS 配置为 rw,若本地目录权限为只读,客户端也无法写入。

实验 2:不同账户映射规则验证

本实验将分别测试root_squash(默认)、all_squashanonuid/anongid三种映射规则的效果。

2.1 测试root_squash(客户端 root 映射为服务端 nobody)
  1. 服务端修改 NFS 配置:

    复制代码
    vim /etc/exports
    # 修改为以下配置
    /nfsfile 192.168.48.0/24(rw,sync,root_squash,no_subtree_check)
    
    # 重新加载配置(无需重启服务)
    exportfs -r
    
    # 恢复共享目录权限为777
    chmod -R 777 /nfsfile
  2. 客户端操作:

    复制代码
    # 客户端以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)
  1. 服务端修改 NFS 配置:

    复制代码
    vim /etc/exports
    # 修改为以下配置
    /nfsfile 192.168.48.0/24(rw,sync,all_squash,no_subtree_check)
    
    # 重新加载配置
    exportfs -r
  2. 客户端操作:

    复制代码
    # 客户端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(自定义映射账户)
  1. 服务端操作:创建自定义 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
  2. 客户端操作:

    复制代码
    # 客户端任意账户创建文件
    cd /nfs1
    touch test_anonuid.txt
    ll test_anonuid.txt
    # 预期输出:所有者为2000:2000(即服务端的nfsuser账户)

四、autofs 自动挂载服务

4.1 autofs 产生背景与核心优势

传统的 NFS 挂载方式(手动挂载或/etc/fstab开机挂载)存在以下问题:

  1. 网络可靠性问题:若 NFS 服务端宕机或网络中断,客户端挂载目录会处于 "挂死" 状态,访问该目录时会出现长时间超时,影响客户端系统稳定性;
  2. 资源浪费问题:即使客户端长期不访问 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 配置文件语法格式
  1. 主配置文件/etc/auto.master格式:

    复制代码
    挂载父目录  子配置文件路径
    • 挂载父目录:客户端本地的目录(无需提前创建,autofs 会自动创建),所有自动挂载的子目录均位于该目录下;
    • 子配置文件路径:自定义的子配置文件(需手动创建),用于存储该父目录下的所有挂载规则。

    示例:

    复制代码
    /nfs  /etc/auto.nfs  # 父目录/nfs下的自动挂载规则由/etc/auto.nfs文件定义
    /media  /etc/auto.iso  # 父目录/media下的自动挂载规则由/etc/auto.iso文件定义
  2. 子配置文件格式:

    复制代码
    本地挂载子目录  [-挂载参数]  服务端资源路径
    • 本地挂载子目录:位于主配置文件定义的 "挂载父目录" 下的子目录(无需提前创建,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:服务端准备工作
  1. 恢复基础环境(若之前做过其他实验,建议恢复系统快照或重新配置):

    复制代码
    setenforce 0
    systemctl stop firewalld
    yum install nfs-utils rpcbind -y
  2. 创建共享目录并配置 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
  1. 安装依赖包(若未安装):

    复制代码
    yum install nfs-utils autofs -y
  2. 编辑 autofs 主配置文件/etc/auto.master

    复制代码
    vim /etc/auto.master
    
    # 在文件末尾添加以下内容(定义挂载父目录和子配置文件)
    /nfs /etc/auto.nfs
    
    # 保存退出
  3. 创建并编辑 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服务端共享目录
    
    # 保存退出
  4. 启动 autofs 服务并设置开机自启:

    复制代码
    systemctl start autofs
    systemctl enable autofs
    
    # 验证服务状态(确保无报错)
    systemctl status autofs
步骤 3:验证 autofs 自动挂载功能
  1. 初始状态验证(未访问挂载目录时):

    复制代码
    # 查看挂载情况,此时autofs未执行挂载
    df -h | grep nfs
    # 预期输出:无任何相关挂载记录
    
    # 查看父目录/nfs(autofs已自动创建)
    ll /nfs
    # 预期输出:目录为空,无testmnt子目录(子目录在访问时才创建)
  2. 访问挂载目录,触发自动挂载:

    复制代码
    # 进入挂载子目录(触发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
  3. 验证自动卸载功能:

    复制代码
    # 退出挂载目录,等待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
  1. 安装 autofs(若未安装):

    复制代码
    yum install autofs -y
  2. 编辑 autofs 主配置文件/etc/auto.master

    复制代码
    vim /etc/auto.master
    
    # 在文件末尾添加以下内容
    /media /etc/auto.iso
    
    # 保存退出
  3. 创建并编辑 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查看)
    
    # 保存退出
  4. 重启 autofs 服务:

    复制代码
    systemctl restart autofs
步骤 2:验证光盘自动挂载
  1. 插入光盘(物理机插入光盘,虚拟机需挂载 ISO 镜像文件)。

  2. 初始状态验证:

    复制代码
    df -h | grep cdrom
    # 预期输出:无挂载记录
    
    ll /media
    # 预期输出:无cdrom子目录
  3. 访问挂载目录,触发自动挂载:

    复制代码
    cd /media/cdrom
    
    # 验证挂载结果
    df -h | grep cdrom
    # 预期输出(类似如下内容)
    /dev/sr0  8.5G  8.5G     0  100% /media/cdrom
    
    # 查看光盘内容
    ls
    # 预期输出:光盘中的目录和文件(如AppStream、BaseOS、RPM包等)
  4. 验证自动卸载:

    复制代码
    # 退出目录,等待5分钟
    cd ~
    sleep 300
    
    # 查看挂载情况
    df -h | grep cdrom
    # 预期输出:无挂载记录,已自动卸载

五、常见问题排查与注意事项

5.1 常见问题排查

  1. 客户端执行showmount -e 服务端IP时提示 "clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)":

    • 原因:服务端或客户端防火墙未关闭,拦截了 111 端口(RPC)的通信;
    • 解决:关闭防火墙(systemctl stop firewalld)。
  2. 客户端挂载时提示 "mount.nfs: access denied by server while mounting 服务端 IP: 共享目录":

    • 原因:服务端/etc/exports配置中未允许该客户端访问,或权限参数错误;
    • 解决:检查/etc/exports中的客户端网段 / IP 配置,执行exportfs -r重新加载配置。
  3. 客户端挂载后无法写入文件,提示 "Permission denied":

    • 原因 1:服务端 NFS 配置为ro权限,或未配置rw
    • 原因 2:服务端共享目录的本地文件系统权限不足(如未设置 777);
    • 原因 3:客户端账户被映射为匿名账户(nobody),而服务端目录对 nobody 无写入权限;
    • 解决:确认 NFS 配置为rw,服务端目录权限为 777,必要时配置all_squash + anonuid/anongid
  4. autofs 无法自动挂载,进入挂载目录时提示 "No such file or directory":

    • 原因:主配置文件或子配置文件格式错误(如路径写错、参数分隔符错误);
    • 解决:检查/etc/auto.master和子配置文件的语法,查看 autofs 日志排查错误:journalctl -u autofs

5.2 生产环境注意事项

  1. 安全性方面:

    • 避免使用*通配符允许所有主机访问,尽量限制具体的客户端网段;
    • 禁用no_root_squash参数,防止客户端 root 账户操控服务端文件系统;
    • 必要时结合防火墙策略,仅开放 NFS(2049 端口)和 RPC(111 端口)给允许访问的客户端。
  2. 性能优化方面:

    • NFS 配置中添加no_subtree_check参数,减少权限验证开销;
    • 客户端挂载时设置rsize=8192wsize=8192(或更大值,如 16384),优化传输效率;
    • 对于高并发场景,可考虑使用 NFS v4 版本(默认 v3),支持更优的性能和安全性。
  3. 稳定性方面:

    • 配置 autofs 时优先使用soft + intr参数,避免网络异常导致客户端挂死;
    • 定期备份 NFS 共享目录中的数据,防止服务端故障导致数据丢失;
    • 避免在 NFS 共享目录中存放频繁读写的小文件(如日志文件),可采用其他方案(如 ELK)存储。
相关推荐
碳基沙盒15 小时前
OpenClaw 多 Agent 配置实战指南
运维
BingoGo17 小时前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack17 小时前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
Sinclair2 天前
简单几步,安卓手机秒变服务器,安装 CMS 程序
android·服务器
JaguarJack3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
Rockbean3 天前
用40行代码搭建自己的无服务器OCR
服务器·python·deepseek
蝎子莱莱爱打怪4 天前
Centos7中一键安装K8s集群以及Rancher安装记录
运维·后端·kubernetes