H__D  

NFS系统介绍

  NFS(Network File System) 是一种由 Sun Microsystems 开发的分布式文件系统协议,允许客户端计算机通过网络访问服务器上的文件,就像访问本地存储一样。它基于 客户端-服务器(C/S) 架构,广泛应用于 Linux/Unix 环境,支持跨平台文件共享(如 Linux ↔ Windows,需额外软件支持)。

1. NFS 核心特点

  • 透明访问:客户端挂载远程目录后,操作方式与本地文件系统一致。

  • 基于RPC(远程过程调用):依赖 portmap/rpcbind 服务进行通信。

  • 无状态协议(NFSv3及之前):服务器不记录客户端状态,依赖客户端重试机制。

  • 有状态协议(NFSv4+):支持会话(Session),提升性能和安全性。

  • 文件锁定机制:NFSv4 内置文件锁,早期版本需依赖 NLM(Network Lock Manager)

2. NFS 主要版本对比

版本发布时间关键改进缺点
NFSv2 1989 首次标准化,支持UDP/TCP 最大文件2GB,性能低
NFSv3 1995 支持大文件(64位)、异步写入、TCP协议 无状态,锁管理复杂
NFSv4 2000 有状态协议、集成锁管理、支持ACL、安全性强 配置复杂
NFSv4.1 2010 并行存储(pNFS)、会话持久化 需额外存储后端支持
NFSv4.2 2016 服务器端复制、稀疏文件支持 尚未广泛普及

 

3. NFS 工作原理

(1)基本流程

  1. 客户端 发起挂载请求(mount -t nfs)。

  2. 服务器 的 rpcbind 服务告知客户端 NFS 服务端口。

  3. 客户端通过 RPC 调用访问服务器端的 nfsd 守护进程。

  4. 服务器返回文件句柄,客户端可读写远程文件。

(2)协议依赖

    • portmap/rpcbind:端口映射服务(默认端口 111)。

    • nfsd:NFS 服务端守护进程。

    • mountd:处理挂载请求。

    • lockd(可选):文件锁管理(NFSv3需要)。

4. NFS 典型应用场景

(1)企业文件共享

  • 多个服务器共享同一存储(如Web集群的静态资源)。

  • 开发团队共享代码目录(通过NFS挂载到不同主机)。

(2)虚拟化存储

  • 为KVM/VMware提供共享存储(需配合NAS或SAN硬件)。

(3)备份集中化

  • 将备份数据统一存储到NFS服务器,客户端通过挂载写入。

(4)高可用架构

  • 结合 DRBD+Heartbeat 实现NFS服务器高可用。

5. NFS 服务端(Server)安装与配置

(1)安装 NFS 服务

CentOS 使用 nfs-utils 提供 NFS 服务:

# 安装 nfs-utils
sudo yum install -y nfs-utils

# 启动 NFS 服务并设置开机自启
sudo systemctl start nfs-server
sudo systemctl enable nfs-server

(2)创建共享目录

sudo mkdir -p /data/nfs_share
sudo chmod 777 /data/nfs_share # 放宽权限(生产环境应细化权限)

(3)配置 NFS 导出(exports)

编辑 /etc/exports 文件,定义共享目录和访问规则:

sudo vim /etc/exports

添加以下内容(示例允许 所有 网段读写):

/data/nfs_share *(rw,sync,no_root_squash)

参数说明:(更多参数设置,可以自行AI提问)

  • rw:读写权限。

  • sync:同步写入(保证数据一致性)。

  • no_root_squash:允许客户端root用户保留权限(谨慎使用,安全风险高)。

(4)应用配置

# 重新加载 exports 配置(使更改生效)
sudo exportfs -r
# 查看当前共享的目录 
sudo exportfs -v

(5)关闭防火墙

sudo systemctl stop firewalld
sudo systemctl disable firewalld

6. NFS 客户端(Client)安装与挂载

(1)安装 NFS 客户端工具

sudo yum install -y nfs-utils

(2)创建本地挂载点

sudo mkdir -p /mnt/nfs
(3)挂载远程 NFS 共享目录
# 临时挂载(重启失效)
sudo mount -t nfs 192.168.1.171:/data/nfs_share /mnt/nfs

# 永久挂载(编辑 /etc/fstab),这种挂载会一直占用资源,如果访问不多,可以采用另一种方式动态挂载
echo "192.168.1.171:/data/nfs_share /mnt/nfs nfs defaults 0 0" | sudo tee -a /etc/fstab
sudo mount -a # 测试挂载是否成功

(4)验证挂载

# 查看已挂载的NFS共享
df -hT | grep nfs

# 测试写入文件
echo "Hello NFS" > /mnt/nfs/test.txt
cat /mnt/nfs/test.txt

8. 卸载 NFS 共享

客户端卸载

# 卸载后客户端目录中内容会情况,服务段保持不变
# 如果重新挂载,会将服务端文件同步
sudo umount /mnt/nfs

服务端停止共享

# 从 /etc/exports 中删除对应行,然后运行:
# 运行后,客户端挂载目录也无法访问 sudo exportfs -r

9.使用 autofs自动挂载

autofs 是按需自动挂载的标准解决方案,当访问挂载点时才真正建立连接,空闲超时后自动卸载。

1. 安装 autofs

sudo yum install autofs -y  # CentOS/RHEL
systemctl start autofs
systemctl enable autofs

2. 配置主映射文件(/etc/auto.master)

sudo vim /etc/auto.master

添加以下内容(/etc/auto.master文件第8行增加):

/mnt/autofs /etc/auto.nfs --timeout=300
  • /mnt/autofs:本地挂载点父目录(自动创建)

  • /etc/auto.nfs:子配置文件(需新建)

  • --timeout=300:空闲 300 秒后自动卸载(可以不写,默认300秒,可调整)

3. 创建子配置文件(/etc/auto.nfs)

sudo vim /etc/auto.nfs

添加 NFS 共享规则:

nfs_share -fstype=nfs4,vers=4.2,rw,hard,intr 192.168.1.171:/data/nfs_share
  • nfs_share:挂载点的子目录名(实际路径为 /mnt/autofs/nfs_share

  • hard,intr:确保网络中断时不会卡住进程

4. 重启 autofs

sudo systemctl restart autofs

5. 测试动态挂载

# 先查上级目录
ls /mnt/autofs
# 访问挂载点(首次访问时会自动挂载)
ls /mnt/autofs/nfs_share
# 再次查上级目录
ls /mnt/autofs
# 查看挂载状态(应显示 NFS 连接) 
mount | grep nfs
# 等待超时时间(默认300秒)后再次检查,会自动卸载

 

posted on 2025-05-19 00:04  H__D  阅读(82)  评论(0)    收藏  举报