nfs介绍与使用

网络文件系统(NFS)是一种分布式文件系统协议,它允许用户通过网络访问远程服务器上的文件,就像操作本地文件一样。这项由 Sun 公司在 1984 年开发的技术,至今仍在 Linux、UNIX 乃至 Windows 环境中被广泛用于文件共享。

基本原理

  • C/S 架构:服务器(Server)“导出”(Export)目录;客户端(Client)“挂载”(Mount)该目录。
  • 依赖 RPC:NFS 本身不负责数据传输,而是基于 RPC(远程过程调用) 协议实现跨主机通信。
    • NFSv3:依赖 rpcbind(端口 111)动态分配端口。
    • NFSv4:简化为固定 TCP 2049 端口,无需 rpcbind,更易穿越防火墙。

如何使用 NFS?

下面以 CentOS/RHEL 系统为例,演示如何快速搭建一个 NFS 服务。

1. 服务端配置

  1. 安装 NFS 服务软件包
    在选定的服务器上执行以下命令:

    sudo yum install -y nfs-utils rpcbind
    
  2. 创建共享目录
    创建一个用于共享的目录,并设置相应权限。

    sudo mkdir -p /data/nfs
    sudo chmod 755 /data/nfs
    
  3. 配置共享规则
    编辑 /etc/exports 文件,定义哪些客户端可以访问以及访问权限。

    sudo vim /etc/exports
    

    添加如下一行,表示允许 10.0.0.0/24 网段的所有客户端对 /data/nfs 目录进行读写操作:

    /data/nfs 10.0.0.0/24(rw,sync,no_root_squash)
    
    • rw: 读写权限。
    • sync: 同步写入,保证数据一致性。
    • no_root_squash: 允许客户端的 root 用户拥有服务端对应目录的 root 权限(生产环境请谨慎使用)。
  4. 启动并启用服务
    启动 NFS 和 rpcbind 服务,并设置为开机自启。

    sudo systemctl start rpcbind
    sudo systemctl start nfs-server
    sudo systemctl enable rpcbind
    sudo systemctl enable nfs-server
    
  5. 验证配置
    使用 showmount 命令检查共享目录是否已成功导出。

    [root@nfs network-scripts]#showmount -e localhost
    Export list for localhost:
    /data/nfs 10.0.0.0/24

2. 客户端配置

  1. 安装 NFS 客户端工具
    在所有需要访问共享的客户端上执行:

    sudo yum install -y nfs-utils
    
  2. 查看可用共享
    查询 NFS 服务器上有哪些共享目录。

    # 将 server_ip 替换为 NFS 服务器的实际 IP[root@worker232 ~]#showmount -e 10.0.0.31
    Export list for 10.0.0.31:
    /data/nfs 10.0.0.0/24
  3. 挂载共享目录
    创建一个本地目录作为挂载点,然后将远程共享挂载到该点。

    sudo mkdir -p /mnt/nfs
    # 将 server_ip 替换为 NFS 服务器的实际 IP
    sudo mount -t nfs 10.0.0.31:/data/nfs /mnt/nfs
    

    挂载成功后,在 /mnt/nfs 目录下的所有操作都会直接反映在服务端的 /data/nfs 目录中。

  4. 设置开机自动挂载 (可选)
    为了实现开机自动挂载,需要编辑 /etc/fstab 文件。

    sudo vim /etc/fstab
    

    在文件末尾添加一行:

    10.0.0.31:/data/nfs /mnt/nfs nfs defaults,_netdev 0 0
    
    • _netdev 参数非常关键,它告诉系统这是一个网络设备,需要等待网络就绪后再尝试挂载,避免开机时因网络未启动而卡住。

  1. 测试验证

    [root@worker233 nginx-test]#mount | grep nfs
    10.0.0.31:/data/nfs on /mnt/nfs type nfs4 (rw,relatime,vers=4.1,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.0.0.233,local_lock=none,addr=10.0.0.31)[root@worker233 nginx-test]#df -h | grep nfs
    10.0.0.31:/data/nfs   18G  1.6G   16G    9% /mnt/nfs
  2. 验证读写权限

    创建测试文件:尝试在挂载点目录下创建一个新文件。

    touch /mnt/nfs/test_file.txt
    

    写入数据:尝试向文件中写入一些内容。

    echo "NFS test successful" > /mnt/nfs/test_file.txt
    

    检查文件:在其他客户端查看文件是否存在以及内容是否正确。

    cat /mnt/nfs/test_file.txt
    

安全性管理

  • 访问控制:通过服务端的 /etc/exports 文件,可以精确限制允许访问的客户端 IP 地址或网段,以及其读写权限。
  • 用户身份映射:NFS 通过用户 ID (UID) 和组 ID (GID) 来管理文件权限。为确保权限正确,客户端和服务端最好保持相同的用户和组 ID。root_squash 选项(与 no_root_squash 相对)可以将客户端的 root 用户映射为服务端的匿名用户(通常是 nobody),这是一种重要的安全措施。
  • 网络防火墙:务必在服务器上配置防火墙,只允许受信任的 IP 地址访问 NFS 服务端口(NFSv4 主要使用 TCP 2049 端口),以抵御网络攻击。