You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
obsidian-sync/work常用/linux/windows 配置NFS客户端并连接.md

7.9 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

这个问题分为两个部分:

  1. Linux 端:如何正确地安装、配置并启动 NFS 服务。
  2. Windows 端:如何解决“无法创建映射网络驱动器”的常见问题。

我们将先确保 Linux 服务端配置无误,然后再排查 Windows 客户端的问题。


第一部分:在 Linux 上开启和配置 NFS 服务

本教程以 CentOS/RHEL 和 Debian/Ubuntu 这两大主流 Linux 发行版为例。

步骤 1安装 NFS 服务器软件包

  • 在 CentOS / RHEL / Fedora 上:

    sudo yum install -y nfs-utils
    
  • 在 Debian / Ubuntu 上:

    sudo apt-get update
    sudo apt-get install -y nfs-kernel-server
    

步骤 2创建要共享的目录

假设我们要共享 /data/nfs-share 这个目录。

  1. 创建目录:

    sudo mkdir -p /data/nfs-share
    
  2. 设置正确的权限。这是一个关键步骤。为了让 Windows 客户端能够读写,我们需要确保 NFS 服务有权限操作这个目录。最简单的方式是将其所有权交给 nfsnobody 用户和组,这是一个专门为 NFS 匿名访问设计的用户。

    sudo chown -R nfsnobody:nfsnobody /data/nfs-share
    # 也可以设置宽松的权限,但这在生产环境中需谨慎
    sudo chmod 777 /data/nfs-share
    

步骤 3配置 NFS 共享

NFS 的共享配置在 /etc/exports 文件中。

  1. 编辑该文件:

    sudo vim /etc/exports
    
  2. 在文件末尾添加一行来定义共享规则。格式为: 要共享的目录 客户端IP或网段(选项1,选项2,...)

    示例配置:

    • 允许特定 IP (例如 192.168.1.100) 的 Windows 客户端读写:

      /data/nfs-share 192.168.1.100(rw,sync,no_root_squash)
      
    • 允许整个 192.168.1.0/24 网段的客户端读写(更常用):

      /data/nfs-share 192.168.1.0/24(rw,sync,no_root_squash)
      

    常用选项解释:

    • rw: (Read/Write) 允许读写。如果是只读,用 ro
    • sync: 数据同步写入磁盘。更安全,但性能稍低。async 是异步写入。
    • no_root_squash: 这是连接 Windows 客户端时非常重要的一个选项。它允许客户端以 root 用户身份写入文件时,在服务端也保留 root 身份。如果不加这个选项,客户端的 root 会被映射成服务端的匿名用户(nfsnobody),可能导致权限问题。
    • all_squash: 将所有客户端用户都映射为匿名用户。
    • anonuidanongid: 与 all_squash 配合,指定映射到的匿名用户的 UID 和 GID。

步骤 4启动并设置开机自启 NFS 服务

  • 在 CentOS / RHEL / Fedora 上: NFS 依赖 rpcbind (或 portmap) 服务,需要先启动它。

    sudo systemctl enable rpcbind
    sudo systemctl enable nfs-server
    sudo systemctl start rpcbind
    sudo systemctl start nfs-server
    
  • 在 Debian / Ubuntu 上: 服务通常命名为 nfs-kernel-server

    sudo systemctl enable nfs-kernel-server
    sudo systemctl start nfs-kernel-server
    

步骤 5使配置生效并检查防火墙

  1. 使 /etc/exports 的配置生效:

    sudo exportfs -a
    # 检查当前共享状态
    sudo exportfs -v
    
  2. 配置防火墙。NFS 服务需要开放 nfs (2049端口), mountd, 和 rpc-bind 端口。

    • 使用 firewalld (CentOS/RHEL 默认)
      sudo firewall-cmd --permanent --add-service=nfs
      sudo firewall-cmd --permanent --add-service=mountd
      sudo firewall-cmd --permanent --add-service=rpc-bind
      sudo firewall-cmd --reload
      
    • 使用 ufw (Ubuntu 默认)
      # 允许特定 IP 或网段访问
      sudo ufw allow from 192.168.1.0/24 to any port nfs
      sudo ufw enable
      

至此,您的 Linux NFS 服务器已经配置完毕并运行。


第二部分:在 Windows 上排查“无法创建映射网络驱动器”问题

在 Windows 上连接 NFS 失败,通常有以下几个原因:

1. Windows NFS 客户端功能未安装

这是最常见的原因。Windows 默认不安装 NFS 客户端。

  • 操作方法
    1. 打开 “控制面板” -> “程序” -> “启用或关闭 Windows 功能”。
    2. 在列表中找到并展开 “NFS 服务”
    3. 勾选 “NFS 客户端”
    4. 点击“确定”进行安装,可能需要重启电脑。

2. 网络连接或防火墙问题

  • 确认网络连通性:在 Windows 的命令提示符(cmd)中,ping <Linux服务器IP>,确保可以 ping 通。
  • Linux 防火墙:请再次确认您已按照第一部分步骤 5正确开放了 NFS 相关服务的端口。
  • Windows 防火墙:尝试暂时关闭 Windows 防火墙,看是否能连接成功。如果可以,说明需要为 NFS 连接在 Windows 防火墙中添加入站/出站规则。

3. 权限和用户映射问题

这是最棘手的问题。Windows 的用户体系 (SID) 和 Linux 的用户体系 (UID/GID) 完全不同。

  • 匿名访问认证:当 Windows 以普通用户身份连接时NFS 服务端通常会将其视为匿名用户。
    • 解决方案
      1. 确保您在 Linux 端的 /etc/exports 配置中使用了 all_squash,并将权限赋予了匿名用户。
      2. 修改 Windows 注册表以匹配匿名 UID/GID。这是解决权限问题的关键。 a. 按 Win + R,输入 regedit 打开注册表编辑器。 b. 导航到 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Default。 c. 在右侧窗格中,右键新建两个 DWORD (32 位) 值 * AnonymousUid * AnonymousGid d. 双击这两个新建的值,将它们的基数改为十进制,然后输入 Linux 端 nfsnobody 用户的 UID 和 GID。 * 如何查找 nfsnobody 的 UID/GID 在 Linux 上执行: bash id nfsnobody 输出可能像这样: uid=65534(nfsnobody) gid=65534(nfsnobody) ... * 那么就在 Windows 注册表中将 AnonymousUidAnonymousGid 的值都设置为 65534。 e. 重启 Windows 电脑重启 NFS 客户端服务(在“服务”中找到 Client for NFS 右键重启)。

4. 映射驱动器时的语法错误

  • 正确语法:在“映射网络驱动器”窗口中,路径格式应为: \\<Linux服务器IP>\<Linux共享目录的绝对路径> 注意:路径中的斜杠是反斜杠 \

  • 示例 \\192.168.1.50\/data/nfs-share

  • 使用命令行 mount 打开管理员权限的命令提示符或 PowerShell。

    mount \\<Linux服务器IP>\<Linux共享目录> <盘符>:
    

    示例:

    mount \\192.168.1.50\data\nfs-share Z:
    

    使用命令行通常能看到更详细的错误提示,例如 Network Error - 53 (找不到网络路径) 或 Network Error - 67 (找不到网络名) 等,有助于进一步排查。

排查流程总结

  1. 先搞定 Linux 端:安装 -> 创建目录 -> 设置权限 -> 配置 /etc/exports -> 启动服务 -> 配置防火墙。
  2. 再处理 Windows 端
    • 确认 NFS 客户端已安装。
    • 确认网络可达 (ping)。
    • 关键:修改注册表中的 AnonymousUidAnonymousGid,使其与 Linux 端的 nfsnobody 用户匹配。
    • 重启 Windows 的 NFS 客户端服务或电脑。
    • 使用正确的语法 (\\IP\path) 进行映射。

遵循这个流程,绝大多数 Windows 连接 Linux NFS 的问题都可以得到解决。