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)存储。
相关推荐
橘子131 小时前
MySQL基础(一)
数据库·mysql·php
热心市民R先生2 小时前
Ubuntu 22.04 下 IGH EtherCAT 主站永久性开机自启
linux·运维·服务器
源远流长jerry2 小时前
DPDK 19.08(Ubuntu 16.04)环境搭建
linux·运维·网络·ubuntu
jiayong232 小时前
Word协作与审阅实用手册
服务器·数据库·word
Ha_To2 小时前
2026.1.14 Linux计划任务与进程
linux·运维·服务器
王闯写bug2 小时前
【openEuler】修改ssh端口号
服务器·网络·ssh·openeuler
之歆2 小时前
检索增强拦截器-查询转换器&翻译转化器&document后置处理器
运维·服务器
sxgzzn2 小时前
无人机热成像+数字孪生:光伏运维的智能革命
运维·无人机