📂 第17课:NFS文件共享

阶段三:网络配置第5/6课

📚 课程目标

一、NFS概述

1.1 NFS版本对比

版本特点端口
NFSv3无状态,UDP/TCP2049(mountd随机)
NFSv4有状态,防火墙友好2049(仅一个端口)
NFSv4.1pNFS并行2049

二、NFS服务端配置

# 安装NFS服务端
sudo apt install nfs-kernel-server    # Debian/Ubuntu
sudo yum install nfs-utils             # RHEL/CentOS

# 创建共享目录
sudo mkdir -p /srv/nfs/share
sudo chown nobody:nogroup /srv/nfs/share

# 配置导出 /etc/exports
/srv/nfs/share    192.168.1.0/24(rw,sync,no_subtree_check)
/srv/nfs/readonly  *(ro,sync,no_subtree_check)
/srv/nfs/home     192.168.1.100(rw,sync,no_root_squash)

# 应用导出配置
sudo exportfs -arv

# 查看当前导出
sudo exportfs -v
showmount -e localhost

2.1 导出选项

选项说明
rw/ro读写/只读
sync/async同步/异步写入
no_subtree_check不检查子树(推荐)
root_squashroot映射为nobody(默认)
no_root_squash保留root权限(危险!)
all_squash所有用户映射为nobody
anonuid/anongid指定匿名用户UID/GID

三、NFS客户端配置

# 安装NFS客户端
sudo apt install nfs-common

# 手动挂载
sudo mkdir -p /mnt/nfs/share
sudo mount -t nfs4 server:/share /mnt/nfs/share

# 挂载选项
sudo mount -t nfs4 -o rw,hard,intr,rsize=1048576,wsize=1048576 server:/share /mnt/nfs/share

# 开机自动挂载 /etc/fstab
server:/share  /mnt/nfs/share  nfs4  rw,hard,intr,_netdev  0 0

3.1 挂载选项详解

选项说明
hard/soft硬挂载(默认)/软挂载
intr允许中断硬挂载的IO
rsize/wsize读写块大小(默认1MB)
timeo=n超时时间(0.1秒单位)
retrans=n重试次数
_netdev网络就绪后才挂载
noatime不更新访问时间

四、NFS4 ACL与安全

# NFS4 ACL(比POSIX ACL更细粒度)
nfs4acl-edit file

# 使用Kerberos认证(安全NFS)
# /etc/exports
/share  *(rw,sec=krb5p)

# 防火墙配置
sudo ufw allow from 192.168.1.0/24 to any port nfs
# NFSv4仅需2049端口

五、AutoFS自动挂载

# 安装autofs
sudo apt install autofs

# /etc/auto.master
/mnt/nfs  /etc/auto.nfs  --timeout=60

# /etc/auto.nfs
share  -rw,soft,intr  server:/share
home   -rw            server:/home

# 重启autofs
sudo systemctl restart autofs

# 访问时自动挂载
ls /mnt/nfs/share    # 自动触发挂载
# 60秒无访问自动卸载

六、NFS性能优化

# 增大读写块大小
mount -o rsize=1048576,wsize=1048576 server:/share /mnt/nfs

# 增多NFS线程
# /etc/default/nfs-kernel-server
RPCNFSDCOUNT=64

# 使用noatime减少写操作
mount -o noatime server:/share /mnt/nfs

# 异步写入(风险:断电可能丢数据)
# /etc/exports 中使用 async 选项

七、故障排查

❌ NFS挂载失败

# 检查服务端
sudo exportfs -v
sudo systemctl status nfs-server
showmount -e server

# 检查端口
rpcinfo -p server

# 检查防火墙
sudo ufw status

# 详细挂载
sudo mount -v -t nfs4 server:/share /mnt/nfs

# 查看NFS统计
nfsstat -s   # 服务端统计
nfsstat -c   # 客户端统计

八、NFS vs 其他文件共享

协议平台性能认证场景
NFSLinuxIP/主机名Linux集群
SMB/CIFS跨平台用户名密码Windows/Linux混合
iSCSI块级CHAPSAN存储
GlusterFS分布式多种集群存储

九、练习

📝 NFS配置实战

# 1. 安装NFS服务端
sudo apt install nfs-kernel-server

# 2. 创建共享目录
sudo mkdir -p /srv/nfs/test
echo "Hello NFS" | sudo tee /srv/nfs/test/hello.txt

# 3. 配置导出
echo "/srv/nfs/test *(ro,sync,no_subtree_check)" | sudo tee -a /etc/exports
sudo exportfs -arv

# 4. 客户端挂载测试
sudo mkdir -p /mnt/nfs-test
sudo mount -t nfs4 localhost:/test /mnt/nfs-test
cat /mnt/nfs-test/hello.txt

# 5. 清理
sudo umount /mnt/nfs-test
🏆

成就解锁:文件共享专家

✅ 理解NFS协议与版本

✅ 掌握NFS服务端与客户端配置

✅ 学会挂载选项与性能调优

✅ 了解AutoFS自动挂载

✅ 掌握NFS故障排查

十、SMB/CIFS文件共享

Windows环境通常使用SMB协议,Linux通过Samba提供SMB服务。

# 安装Samba
sudo apt install samba

# 配置 /etc/samba/smb.conf
[global]
    workgroup = WORKGROUP
    server string = Samba Server
    security = user

[share]
    path = /srv/samba/share
    browseable = yes
    read only = no
    valid users = @smbgroup
    create mask = 0660
    directory mask = 0770

# 创建Samba用户
sudo groupadd smbgroup
sudo usermod -aG smbgroup username
sudo smbpasswd -a username

# 测试配置
sudo testparm

# 客户端挂载
sudo mount -t cifs //server/share /mnt/smb -o username=user,password=pass

十一、分布式文件系统

方案特点适用场景
GlusterFS无元数据服务器,线性扩展中小规模集群
CephFS统一存储(对象/块/文件)大规模云存储
Lustre高性能并行文件系统HPC超算
MooseFS简单易用的分布式FS中小规模

十二、NFS高可用

# NFS + DRBD + Pacemaker 高可用方案
# DRBD: 磁盘复制(主从同步)
# Pacemaker: 集群资源管理

# DRBD配置 /etc/drbd.d/nfs.res
resource nfs {{
    protocol C;
    on nfs1 {{
        device /dev/drbd0;
        disk /dev/sdb1;
        address 192.168.1.10:7789;
    }}
    on nfs2 {{
        device /dev/drbd0;
        disk /dev/sdb1;
        address 192.168.1.11:7789;
    }}
}}

# Pacemaker资源
sudo pcs resource create nfs_fs Filesystem \
    device="/dev/drbd0" directory="/srv/nfs" fstype="ext4"
sudo pcs resource create nfs_daemon systemd:nfs-server
sudo pcs resource create nfs_ip IPaddr2 ip=192.168.1.100

# 资源约束
sudo pcs constraint colocation add nfs_fs nfs_daemon nfs_ip
sudo pcs constraint order nfs_fs then nfs_daemon then nfs_ip

十三、NFS最佳实践

📋 NFS生产部署检查清单

  1. 使用NFSv4,单一端口方便防火墙
  2. 指定客户端IP,避免使用通配符
  3. 使用root_squash(默认),防止root越权
  4. 使用sync模式确保数据一致性
  5. 配置AutoFS自动挂载/卸载
  6. 监控NFS延迟和错误率
  7. 定期备份导出配置
  8. 测试故障切换流程

十四、NFS性能监控

# NFS服务端统计
nfsstat -s
# 显示各版本、各操作的调用次数和延迟

# NFS客户端统计
nfsstat -c

# 实时监控NFS调用
nfsstat -c -z    # 重置计数器
# 等待一段时间
nfsstat -c       # 查看增量

# iostat监控NFS IO
nfsiostat        # 类似iostat但针对NFS挂载点

# 常见性能问题
# 1. 重传率高 → 网络问题或服务器过载
# 2. awrite/aread延迟高 → 磁盘IO瓶颈
# 3. rpc重传 → 网络丢包

十五、NFS与容器

# Docker使用NFS卷
docker volume create \
    --driver local \
    --opt type=nfs \
    --opt o=addr=nfs-server,rw \
    --opt device=:/share \
    nfs-volume

docker run -v nfs-volume:/data myapp

# Kubernetes NFS PV
# nfs-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  nfs:
    server: nfs-server
    path: /share

十六、NFS故障排查完整流程

#!/bin/bash
# nfs-diag.sh - NFS完整诊断

echo "===== NFS诊断 ====="

echo "--- 1. NFS服务端状态 ---"
sudo systemctl status nfs-server --no-pager -l 2>/dev/null || echo "NFS server not running"

echo "\n--- 2. RPC服务 ---"
rpcinfo -p localhost 2>/dev/null | head -10

echo "\n--- 3. 导出列表 ---"
sudo exportfs -v 2>/dev/null

echo "\n--- 4. 客户端可达性 ---"
showmount -e localhost 2>/dev/null || echo "showmount failed"

echo "\n--- 5. 挂载状态 ---"
mount | grep nfs

echo "\n--- 6. NFS统计 ---"
nfsstat -c 2>/dev/null | head -10

echo "\n--- 7. 连接测试 ---"
rpcinfo -u localhost nfs 2>/dev/null && echo "✅ NFS RPC OK" || echo "❌ NFS RPC failed"

echo "\n--- 8. 防火墙检查 ---"
sudo ufw status 2>/dev/null | grep 2049 || echo "2049端口未在ufw规则中"
sudo iptables -L -n 2>/dev/null | grep 2049 || echo "2049端口未在iptables规则中"

十七、iSCSI块级共享

# iSCSI提供块级存储共享,像本地磁盘一样使用
# 安装iSCSI initiator
sudo apt install open-iscsi

# 发现iSCSI目标
sudo iscsiadm -m discovery -t st -p 192.168.1.100

# 登录目标
sudo iscsiadm -m node -T iqn.2024-01.com.example:storage -p 192.168.1.100 --login

# 查看新磁盘
lsblk

# 格式化并挂载
sudo mkfs.ext4 /dev/sdb
sudo mount /dev/sdb /mnt/iscsi

十八、NFS版本迁移

# 从NFSv3迁移到NFSv4
# 优势:单端口(2049)、有状态、更好的安全

# 步骤1:检查当前NFS版本
nfsstat -s | grep "server rpc"  # 查看当前版本分布

# 步骤2:配置NFSv4
# /etc/default/nfs-kernel-server
RPCNFSDARGS="-N 2 -N 3"  # 禁用v2和v3

# 步骤3:配置idmapd(NFSv4用户映射)
# /etc/idmapd.conf
[General]
Verbosity = 0
Domain = example.com

[Mapping]
Nobody-User = nobody
Nobody-Group = nogroup

# 步骤4:更新导出配置
# NFSv4使用伪文件系统根
/fs4 *(rw,fsid=0,insecure,no_subtree_check)
/fs4/share *(rw,nohide,insecure,no_subtree_check)

# 步骤5:客户端使用nfs4挂载
mount -t nfs4 server:/share /mnt/nfs

十九、文件共享选型决策树

需要文件共享?
  │
  ├── 仅Linux环境?
  │     ├── 高性能?→ NFSv4
  │     ├── 需要快照?→ CephFS/Btrfs
  │     └── 简单共享?→ NFSv4 + AutoFS
  │
  ├── 混合Windows/Linux?
  │     └── Samba(SMB/CIFS)
  │
  ├── 需要块级访问?
  │     ├── 本地网络?→ iSCSI
  │     └── 跨网络?→ iSCSI + IPsec
  │
  └── 大规模分布式?
        ├── 对象存储?→ MinIO/S3
        └── 文件存储?→ CephFS/GlusterFS
中小企业最常见方案:NFSv4(内网Linux共享) + Samba(Windows兼容) + AutoFS(自动挂载)。大规模场景考虑CephFS或对象存储。