| 版本 | 特点 | 端口 |
|---|---|---|
| NFSv3 | 无状态,UDP/TCP | 2049(mountd随机) |
| NFSv4 | 有状态,防火墙友好 | 2049(仅一个端口) |
| NFSv4.1 | pNFS并行 | 2049 |
# 安装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
| 选项 | 说明 |
|---|---|
| rw/ro | 读写/只读 |
| sync/async | 同步/异步写入 |
| no_subtree_check | 不检查子树(推荐) |
| root_squash | root映射为nobody(默认) |
| no_root_squash | 保留root权限(危险!) |
| all_squash | 所有用户映射为nobody |
| anonuid/anongid | 指定匿名用户UID/GID |
# 安装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
| 选项 | 说明 |
|---|---|
| hard/soft | 硬挂载(默认)/软挂载 |
| intr | 允许中断硬挂载的IO |
| rsize/wsize | 读写块大小(默认1MB) |
| timeo=n | 超时时间(0.1秒单位) |
| retrans=n | 重试次数 |
| _netdev | 网络就绪后才挂载 |
| noatime | 不更新访问时间 |
# 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
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秒无访问自动卸载
# 增大读写块大小
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 选项
# 检查服务端
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 | Linux | 高 | IP/主机名 | Linux集群 |
| SMB/CIFS | 跨平台 | 中 | 用户名密码 | Windows/Linux混合 |
| iSCSI | 块级 | 高 | CHAP | SAN存储 |
| GlusterFS | 分布式 | 中 | 多种 | 集群存储 |
# 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故障排查
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 + 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服务端统计
nfsstat -s
# 显示各版本、各操作的调用次数和延迟
# NFS客户端统计
nfsstat -c
# 实时监控NFS调用
nfsstat -c -z # 重置计数器
# 等待一段时间
nfsstat -c # 查看增量
# iostat监控NFS IO
nfsiostat # 类似iostat但针对NFS挂载点
# 常见性能问题
# 1. 重传率高 → 网络问题或服务器过载
# 2. awrite/aread延迟高 → 磁盘IO瓶颈
# 3. rpc重传 → 网络丢包
# 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
#!/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 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
# 从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