跳转到内容

NFS 与挂载

NFS(Network File System,网络文件系统)允许不同主机之间通过网络共享目录和文件。它是 Linux/Unix 环境下最常用的网络存储共享协议之一,广泛应用于集群共享存储、开发环境协作、集中化日志存储等场景。

NFS 服务端 NFS 客户端
/data/shared ----网络导出----> /mnt/nfs_share(挂载点)
192.168.1.10 192.168.1.20
Terminal window
sudo dnf install nfs-utils -y
Terminal window
sudo systemctl enable --now nfs-server

验证服务状态:

Terminal window
sudo systemctl status nfs-server
Terminal window
sudo mkdir -p /data/shared
sudo chown nobody:nobody /data/shared
sudo chmod 755 /data/shared

/etc/exports 是 NFS 的核心配置文件,定义了哪些目录共享给哪些客户端以及相关权限。

Terminal window
sudo vi /etc/exports

添加导出配置:

/data/shared 192.168.1.0/24(rw,sync,no_root_squash,no_subtree_check)

基本格式:

共享目录 客户端地址(选项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不检查子目录权限,提升性能
# 读写共享,允许整个子网
/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)

修改 /etc/exports 后需要重新导出:

Terminal window
sudo exportfs -ra

查看当前导出列表:

Terminal window
sudo exportfs -v

exportfs 常用参数:

参数说明
-a导出或取消导出所有目录
-r重新导出所有目录
-v详细输出
-s显示当前导出列表

NFS 需要开放多个端口才能正常工作。使用 firewalld 的服务规则是最简单的方法。

Terminal window
sudo firewall-cmd --permanent --add-service=nfs
sudo firewall-cmd --permanent --add-service=rpc-bind
sudo firewall-cmd --permanent --add-service=mountd
sudo firewall-cmd --reload
Terminal window
sudo firewall-cmd --list-all
Terminal window
sudo dnf install nfs-utils -y
Terminal window
showmount -e 192.168.1.10
Terminal window
sudo mkdir -p /mnt/nfs_share
sudo mount -t nfs 192.168.1.10:/data/shared /mnt/nfs_share

验证挂载:

Terminal window
df -hT /mnt/nfs_share
mount | grep nfs
Terminal window
# 使用 NFS v4
sudo mount -t nfs -o vers=4 192.168.1.10:/data/shared /mnt/nfs_share
# 使用 NFS v3
sudo mount -t nfs -o vers=3 192.168.1.10:/data/shared /mnt/nfs_share
Terminal window
sudo umount /mnt/nfs_share

编辑 /etc/fstab

Terminal window
sudo vi /etc/fstab

添加:

192.168.1.10:/data/shared /mnt/nfs_share nfs defaults,_netdev 0 0
192.168.1.10:/data/shared /mnt/nfs_share nfs rw,hard,timeo=600,retrans=2,_netdev 0 0
选项说明
_netdev标记为网络设备,在网络就绪后才挂载
hard服务端无响应时持续重试(默认)
soft服务端无响应时超时后返回错误
timeo=N超时时间(单位:0.1秒)
retrans=N重试次数
rsize=N读缓冲区大小
wsize=N写缓冲区大小
vers=4指定 NFS 版本
noatime不更新访问时间
nosuid禁止 SUID
noexec禁止执行
Terminal window
sudo mount -a
df -hT /mnt/nfs_share

autofs 可以在访问目录时自动挂载 NFS 共享,不使用时自动卸载,减少资源占用。

Terminal window
sudo dnf install autofs -y
  1. 编辑主配置文件 /etc/auto.master,添加自动挂载点:

    Terminal window
    sudo vi /etc/auto.master

    添加如下行:

    /mnt/auto /etc/auto.nfs --timeout=300

    这表示 /mnt/auto 下的子目录将根据 /etc/auto.nfs 中的规则自动挂载,300 秒无访问后自动卸载。

  2. 创建映射文件 /etc/auto.nfs

    Terminal window
    sudo vi /etc/auto.nfs

    添加映射规则:

    shared -rw,soft,timeo=300 192.168.1.10:/data/shared
    public -ro,soft,timeo=300 192.168.1.10:/data/public

    这意味着访问 /mnt/auto/shared 时会自动挂载 192.168.1.10:/data/shared

  3. 启动 autofs 服务:

    Terminal window
    sudo systemctl enable --now autofs
  4. 验证自动挂载:

    Terminal window
    # 访问目录触发自动挂载
    ls /mnt/auto/shared
    # 查看挂载状态
    mount | grep auto

如果需要自动挂载服务端的所有导出目录,可以使用通配符:

/etc/auto.master
/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

NFS + autofs 常用于集中管理用户家目录:

/etc/auto.master
/home /etc/auto.home --timeout=600
# /etc/auto.home
* -rw,soft nfs-server:/home/&

用户登录时,家目录 /home/username 会自动从 NFS 服务端挂载。

Terminal window
# 检查网络连通性
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 # 服务端执行
Terminal window
# 服务端统计
nfsstat -s
# 客户端统计
nfsstat -c
# 查看已挂载的 NFS 信息
nfsstat -m
Terminal window
# 查看服务端支持的 NFS 版本
cat /proc/fs/nfsd/versions
# 查看客户端挂载使用的版本
nfsstat -m
  1. 安装并启动 NFS 服务:

    Terminal window
    sudo dnf install nfs-utils -y
    sudo systemctl enable --now nfs-server
  2. 创建共享目录:

    Terminal window
    sudo mkdir -p /data/shared /data/readonly
    sudo chown nobody:nobody /data/shared
    sudo chmod 755 /data/shared /data/readonly
  3. 配置导出:

    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)
    EOF
    sudo exportfs -ra
    sudo exportfs -v
  4. 配置防火墙:

    Terminal window
    sudo firewall-cmd --permanent --add-service=nfs
    sudo firewall-cmd --permanent --add-service=rpc-bind
    sudo firewall-cmd --permanent --add-service=mountd
    sudo firewall-cmd --reload
  1. 安装 NFS 工具:

    Terminal window
    sudo dnf install nfs-utils autofs -y
  2. 验证服务端导出:

    Terminal window
    showmount -e 192.168.1.10
  3. 创建挂载点并通过 fstab 挂载:

    Terminal window
    sudo mkdir -p /mnt/shared /mnt/readonly
    cat <<EOF | sudo tee -a /etc/fstab
    192.168.1.10:/data/shared /mnt/shared nfs rw,_netdev,hard 0 0
    192.168.1.10:/data/readonly /mnt/readonly nfs ro,_netdev,hard 0 0
    EOF
    sudo mount -a
    df -hT /mnt/shared /mnt/readonly
  4. 测试读写:

    Terminal window
    echo "NFS test" | sudo tee /mnt/shared/test.txt
    cat /mnt/shared/test.txt

NFS 是企业环境中简单高效的共享存储方案。合理配置权限、选项和防火墙规则,结合 autofs 实现按需挂载,可以构建灵活可靠的网络存储基础设施。