NFS(Network File System) 是一种分布式文件系统协议,允许用户通过网络在不同主机间共享文件和目录。它适用于局域网环境,常用于服务器集群、数据共享等场景。本文详细介绍NFS服务端与客户端的安装、配置及挂载流程。

  1. 安装NFS服务
    根据 Linux 发行版选择命令:

    Ubuntu/Debian

    sudo apt update && sudo apt install nfs-kernel-server
  2. 创建共享目录

    sudo mkdir -p /mnt/nfs_share
    sudo chown nobody:nogroup /mnt/nfs_share  # 设置权限(根据需要调整)
  3. 配置NFS导出规则

    # 语法:<共享目录> <客户端IP/网段>(权限选项)
    /mnt/nfs_share 192.168.1.0/24(rw,sync,no_subtree_check)

    常用权限选项:

    • rw:读写权限。

    • ro:只读权限。

    • sync:同步写入磁盘(数据安全性高)。

    • async:异步写入(性能更好,但可能丢失数据)。

    • no_root_squash:允许客户端root用户保留权限(谨慎使用)。

      eg

      /mnt/nfs_share  *(rw,sync,no_root_squash)
  4. 生效配置并启动服务

    sudo exportfs -a  # 重新加载 exports 配置
    sudo systemctl start nfs-server  # 启动服务
    sudo systemctl enable nfs-server  # 设置开机自启
  5. 防火墙配置
    开放 NFS 相关端口(NFSv4 默认使用 TCP 2049)

    sudo ufw allow 2049/tcp  # Ubuntu
    sudo firewall-cmd --permanent --add-service=nfs && firewall-cmd --reload  # CentOS

常见问题解决

  • 权限被拒绝(Permission Denied)
  • 检查服务端 /etc/exports 的权限配置。
  • 确保客户端用户对挂载点有访问权限。
  • 连接超时或无法访问
  • 确认防火墙已放行NFS端口(尤其是NFSv3需要额外开放 rpcbind 端口)。
  • 使用 rpcinfo -p <服务端IP> 检查RPC服务状态。
  • 挂载后文件属主显示为nobody
  • 在服务端配置 no_all_squash 或指定 anonuid/anongid。

可能遇到的问题及解决方法

  1. 挂载失败
    原因:可能是网络问题、权限问题或NFS服务未启动。
    解决方法:

     //检查NFS服务是否启动
     sudo systemctl status nfs-server
    
     //检查网络连接
     ping <服务器IP>
    
     //使用正确的权限挂载
     sudo mount -t nfs <服务器IP>:<远程目录> <本地目录>
  2. 读写权限问题
    原因:可能是NFS共享目录的权限设置不正确。
    解决方法:

     # 在服务器端设置正确的权限
     sudo chmod -R 755 /path/to/shared/directory
     sudo chown -R nobody:nogroup /path/to/shared/directory
    
     # 在客户端重新挂载并指定权限
     sudo mount -t nfs -o rw <服务器IP>:<远程目录> <本地目录>
  3. 性能问题
    原因:可能是网络延迟或NFS配置不当。
    解决方法:

     # 调整NFS挂载选项以提高性能
     sudo mount -t nfs -o rsize=8192,wsize=8192 <服务器IP>:<远程目录> <本地目录>
    
     # 使用异步模式
     sudo mount -t nfs -o async <服务器IP>:<远程目录> <本地目录>
  4. 数据一致性问题
    原因:NFS的缓存机制可能导致数据不一致。
    解决方法:

     # 使用noac选项禁用客户端缓存
     sudo mount -t nfs -o noac <服务器IP>:<远程目录> <本地目录>

示例代码
以下是一个简单的NFS挂载示例:

服务器端配置:

# 编辑/etc/exports文件,添加共享目录
/path/to/shared/directory *(rw,sync,no_subtree_check)

# 重启NFS服务
sudo systemctl restart nfs-server

客户端挂载:

# 创建本地挂载点
sudo mkdir /mnt/nfs

# 挂载远程目录
sudo mount -t nfs <服务器IP>:/path/to/shared/directory /mnt/nfs