NFS 与挂载
NFS(Network File System,网络文件系统)允许不同主机之间通过网络共享目录和文件。它是 Linux/Unix 环境下最常用的网络存储共享协议之一,广泛应用于集群共享存储、开发环境协作、集中化日志存储等场景。
NFS 基本架构
Section titled “NFS 基本架构”NFS 服务端 NFS 客户端/data/shared ----网络导出----> /mnt/nfs_share(挂载点)192.168.1.10 192.168.1.20NFS 服务端配置
Section titled “NFS 服务端配置”安装 NFS 服务
Section titled “安装 NFS 服务”sudo dnf install nfs-utils -y启动并设置开机自启
Section titled “启动并设置开机自启”sudo systemctl enable --now nfs-server验证服务状态:
sudo systemctl status nfs-server创建共享目录
Section titled “创建共享目录”sudo mkdir -p /data/sharedsudo chown nobody:nobody /data/sharedsudo chmod 755 /data/shared配置 /etc/exports
Section titled “配置 /etc/exports”/etc/exports 是 NFS 的核心配置文件,定义了哪些目录共享给哪些客户端以及相关权限。
sudo vi /etc/exports添加导出配置:
/data/shared 192.168.1.0/24(rw,sync,no_root_squash,no_subtree_check)exports 配置详解
Section titled “exports 配置详解”基本格式:
共享目录 客户端地址(选项1,选项2,...)客户端地址格式:
| 格式 | 说明 | 示例 |
|---|---|---|
| 单个 IP | 只允许一个主机 | 192.168.1.20 |
| 子网 | 允许整个子网 | 192.168.1.0/24 |
| 主机名 | 指定主机名 | client.example.com |
| 通配符 | 匹配域名 | *.example.com |
| 全部 | 允许所有主机 | * |
常用选项:
| 选项 | 说明 |
|---|---|
rw | 读写权限 |
ro | 只读权限 |
sync | 同步写入,数据安全性高 |
async | 异步写入,性能更好但不安全 |
no_root_squash | 客户端 root 拥有服务端 root 权限 |
root_squash | 客户端 root 映射为 nobody(默认) |
all_squash | 所有用户映射为 nobody |
anonuid=N | 匿名用户映射为指定 UID |
anongid=N | 匿名用户映射为指定 GID |
no_subtree_check | 不检查子目录权限,提升性能 |
多目录导出示例
Section titled “多目录导出示例”# 读写共享,允许整个子网/data/shared 192.168.1.0/24(rw,sync,no_subtree_check)
# 只读共享,允许特定主机/data/public 192.168.1.0/24(ro,sync,no_subtree_check)
# 多客户端不同权限/data/project 192.168.1.20(rw,sync,no_root_squash) 192.168.1.30(ro,sync)
# 映射所有用户为指定 UID/GID/data/upload *(rw,sync,all_squash,anonuid=1000,anongid=1000)使导出配置生效
Section titled “使导出配置生效”修改 /etc/exports 后需要重新导出:
sudo exportfs -ra查看当前导出列表:
sudo exportfs -vexportfs 常用参数:
| 参数 | 说明 |
|---|---|
-a | 导出或取消导出所有目录 |
-r | 重新导出所有目录 |
-v | 详细输出 |
-s | 显示当前导出列表 |
NFS 防火墙配置
Section titled “NFS 防火墙配置”NFS 需要开放多个端口才能正常工作。使用 firewalld 的服务规则是最简单的方法。
开放 NFS 相关服务
Section titled “开放 NFS 相关服务”sudo firewall-cmd --permanent --add-service=nfssudo firewall-cmd --permanent --add-service=rpc-bindsudo firewall-cmd --permanent --add-service=mountdsudo firewall-cmd --reload验证防火墙规则
Section titled “验证防火墙规则”sudo firewall-cmd --list-allNFS 客户端挂载
Section titled “NFS 客户端挂载”安装客户端工具
Section titled “安装客户端工具”sudo dnf install nfs-utils -y查看服务端共享的目录
Section titled “查看服务端共享的目录”showmount -e 192.168.1.10sudo mkdir -p /mnt/nfs_sharesudo mount -t nfs 192.168.1.10:/data/shared /mnt/nfs_share验证挂载:
df -hT /mnt/nfs_sharemount | grep nfs指定 NFS 版本挂载
Section titled “指定 NFS 版本挂载”# 使用 NFS v4sudo mount -t nfs -o vers=4 192.168.1.10:/data/shared /mnt/nfs_share
# 使用 NFS v3sudo mount -t nfs -o vers=3 192.168.1.10:/data/shared /mnt/nfs_share卸载 NFS
Section titled “卸载 NFS”sudo umount /mnt/nfs_share通过 fstab 持久化挂载 NFS
Section titled “通过 fstab 持久化挂载 NFS”基本 fstab NFS 条目
Section titled “基本 fstab NFS 条目”编辑 /etc/fstab:
sudo vi /etc/fstab添加:
192.168.1.10:/data/shared /mnt/nfs_share nfs defaults,_netdev 0 0带详细选项的 fstab 条目
Section titled “带详细选项的 fstab 条目”192.168.1.10:/data/shared /mnt/nfs_share nfs rw,hard,timeo=600,retrans=2,_netdev 0 0常用 NFS 挂载选项
Section titled “常用 NFS 挂载选项”| 选项 | 说明 |
|---|---|
_netdev | 标记为网络设备,在网络就绪后才挂载 |
hard | 服务端无响应时持续重试(默认) |
soft | 服务端无响应时超时后返回错误 |
timeo=N | 超时时间(单位:0.1秒) |
retrans=N | 重试次数 |
rsize=N | 读缓冲区大小 |
wsize=N | 写缓冲区大小 |
vers=4 | 指定 NFS 版本 |
noatime | 不更新访问时间 |
nosuid | 禁止 SUID |
noexec | 禁止执行 |
验证 fstab 配置
Section titled “验证 fstab 配置”sudo mount -adf -hT /mnt/nfs_share使用 autofs 自动挂载
Section titled “使用 autofs 自动挂载”autofs 可以在访问目录时自动挂载 NFS 共享,不使用时自动卸载,减少资源占用。
安装 autofs
Section titled “安装 autofs”sudo dnf install autofs -y配置 autofs
Section titled “配置 autofs”-
编辑主配置文件
/etc/auto.master,添加自动挂载点:Terminal window sudo vi /etc/auto.master添加如下行:
/mnt/auto /etc/auto.nfs --timeout=300这表示
/mnt/auto下的子目录将根据/etc/auto.nfs中的规则自动挂载,300 秒无访问后自动卸载。 -
创建映射文件
/etc/auto.nfs:Terminal window sudo vi /etc/auto.nfs添加映射规则:
shared -rw,soft,timeo=300 192.168.1.10:/data/sharedpublic -ro,soft,timeo=300 192.168.1.10:/data/public这意味着访问
/mnt/auto/shared时会自动挂载192.168.1.10:/data/shared。 -
启动 autofs 服务:
Terminal window sudo systemctl enable --now autofs -
验证自动挂载:
Terminal window # 访问目录触发自动挂载ls /mnt/auto/shared# 查看挂载状态mount | grep auto
autofs 通配符挂载
Section titled “autofs 通配符挂载”如果需要自动挂载服务端的所有导出目录,可以使用通配符:
/mnt/auto /etc/auto.nfs --timeout=300
# /etc/auto.nfs* -rw,soft 192.168.1.10:/data/&& 会被替换为访问的子目录名。例如访问 /mnt/auto/shared 会自动挂载 192.168.1.10:/data/shared。
使用 autofs 挂载用户家目录
Section titled “使用 autofs 挂载用户家目录”NFS + autofs 常用于集中管理用户家目录:
/home /etc/auto.home --timeout=600
# /etc/auto.home* -rw,soft nfs-server:/home/&用户登录时,家目录 /home/username 会自动从 NFS 服务端挂载。
NFS 故障排查
Section titled “NFS 故障排查”客户端无法挂载
Section titled “客户端无法挂载”# 检查网络连通性ping 192.168.1.10
# 检查 NFS 服务是否运行sudo systemctl status nfs-server # 服务端执行
# 检查 RPC 服务rpcinfo -p 192.168.1.10
# 检查服务端导出列表showmount -e 192.168.1.10
# 检查防火墙sudo firewall-cmd --list-all # 服务端执行查看 NFS 统计信息
Section titled “查看 NFS 统计信息”# 服务端统计nfsstat -s
# 客户端统计nfsstat -c
# 查看已挂载的 NFS 信息nfsstat -m检查 NFS 版本
Section titled “检查 NFS 版本”# 查看服务端支持的 NFS 版本cat /proc/fs/nfsd/versions
# 查看客户端挂载使用的版本nfsstat -m完整实战:搭建 NFS 共享存储
Section titled “完整实战:搭建 NFS 共享存储”服务端配置(192.168.1.10)
Section titled “服务端配置(192.168.1.10)”-
安装并启动 NFS 服务:
Terminal window sudo dnf install nfs-utils -ysudo systemctl enable --now nfs-server -
创建共享目录:
Terminal window sudo mkdir -p /data/shared /data/readonlysudo chown nobody:nobody /data/sharedsudo chmod 755 /data/shared /data/readonly -
配置导出:
Terminal window cat <<EOF | sudo tee /etc/exports/data/shared 192.168.1.0/24(rw,sync,no_subtree_check)/data/readonly 192.168.1.0/24(ro,sync,no_subtree_check)EOFsudo exportfs -rasudo exportfs -v -
配置防火墙:
Terminal window sudo firewall-cmd --permanent --add-service=nfssudo firewall-cmd --permanent --add-service=rpc-bindsudo firewall-cmd --permanent --add-service=mountdsudo firewall-cmd --reload
客户端配置(192.168.1.20)
Section titled “客户端配置(192.168.1.20)”-
安装 NFS 工具:
Terminal window sudo dnf install nfs-utils autofs -y -
验证服务端导出:
Terminal window showmount -e 192.168.1.10 -
创建挂载点并通过 fstab 挂载:
Terminal window sudo mkdir -p /mnt/shared /mnt/readonlycat <<EOF | sudo tee -a /etc/fstab192.168.1.10:/data/shared /mnt/shared nfs rw,_netdev,hard 0 0192.168.1.10:/data/readonly /mnt/readonly nfs ro,_netdev,hard 0 0EOFsudo mount -adf -hT /mnt/shared /mnt/readonly -
测试读写:
Terminal window echo "NFS test" | sudo tee /mnt/shared/test.txtcat /mnt/shared/test.txt
NFS 是企业环境中简单高效的共享存储方案。合理配置权限、选项和防火墙规则,结合 autofs 实现按需挂载,可以构建灵活可靠的网络存储基础设施。