排查 NFS Azure 文件共享问题

注意

本文中引用的 CentOS 是 Linux 发行版, (EOL) 将达到生命周期结束。 相应地考虑使用和计划。 有关详细信息,请参阅 CentOS 生命周期终止指南

本文列出了与 NFS Azure 文件共享相关的常见问题,并提供了潜在的原因和解决方法。

重要

本文的内容仅适用于 NFS 共享。 若要排查 Linux 中的 SMB 问题,请参阅排查 Linux (SMB) 中的Azure 文件存储问题。 Windows 不支持 NFS Azure 文件共享。

适用对象

文件共享类型 SMB Nfs
标准文件共享 (GPv2) 、LRS/ZRS
标准文件共享 (GPv2) 、GRS/GZRS
高级文件共享 (FileStorage) 、LRS/ZRS

chgrp“filename”失败:参数 (22) 无效

原因 1:未禁用 idmapping

由于Azure 文件存储不允许字母数字 UID/GID,因此必须禁用 idmapping。

原因 2:idmapping 已禁用,但在遇到错误的文件/dir 名称后重新启用

即使正确禁用了 idmapping,在某些情况下也可以自动重新启用它。 例如,当Azure 文件存储遇到错误的文件名时,它会发送回错误。 看到此错误代码后,NFS 4.1 Linux 客户端决定重新启用 idmapping,并使用字母数字 UID/GID 发送将来的请求。 有关Azure 文件存储上不支持的字符的列表,请参阅此文。 冒号是不支持的字符之一。

解决方法

请确保已禁用 idmapping,并且没有任何内容正在重新启用它。 然后执行以下步骤:

  1. 卸载共享。

  2. 禁用 idmapping::

    sudo echo Y > /sys/module/nfs/parameters/nfs4_disable_idmapping
    
  3. 将共享装载回。

  4. 如果运行 rsync,请从没有错误目录或文件名的目录中使用 —numeric-ids 参数运行 rsync。

无法创建 NFS 共享

原因:存储帐户设置不受支持

NFS 仅适用于具有以下配置的存储帐户:

解决方案

按照 如何创建 NFS 共享中的说明进行操作。

无法连接到或装载 NFS Azure 文件共享

原因 1:请求源自不受信任的网络/不受信任的 IP 中的客户端

与 SMB 不同,NFS 没有基于用户的身份验证。 共享的身份验证基于网络安全规则配置。 若要确保客户端仅与 NFS 共享建立安全连接,必须使用服务终结点或专用终结点。 若要从本地访问共享以及专用终结点,必须设置 VPN 或 ExpressRoute 连接。 将忽略添加到存储帐户的防火墙允许列表的 IP。 必须使用以下方法之一来设置对 NFS 共享的访问权限:

  • 服务终结点

    • 由公共终结点访问。

    • 仅在同一区域中可用。

    • 不能使用 VNet 对等互连进行共享访问。

    • 必须将每个虚拟网络或子网单独添加到允许列表中。

    • 对于本地访问,可以将服务终结点与 ExpressRoute、点到站点和站点到站点 VPN 配合使用。 建议使用专用终结点,因为它更安全。

      下图描述了使用公共终结点的连接:

      公共终结点连接示意图。

  • 专用终结点

    • 访问比服务终结点更安全。

    • 可以通过专用链接访问 NFS 共享,可从存储帐户的 Azure 区域内外访问, (跨区域、本地) 。

    • 具有托管在专用终结点中的虚拟网络的虚拟网络对等互连使 NFS 共享可以访问对等互连虚拟网络中的客户端。

    • 可以将专用终结点与 ExpressRoute、点到站点 VPN 和站点到站点 VPN 配合使用。

      专用终结点连接示意图。

原因 2:启用了“需要安全传输”

NFS Azure 文件共享当前不支持双重加密。 Azure 使用 MACSec 为 Azure 数据中心之间传输的所有数据提供加密层。 只能从受信任的虚拟网络和 VPN 隧道访问 NFS 共享。 NFS 共享上没有额外的传输层加密可用。

解决方案

在存储帐户的配置边栏选项卡中禁用 “需要安全传输 ”。

显示存储帐户配置边栏选项卡的屏幕截图,其中禁用了需要安全传输。

原因 3:未安装 nfs-utils、nfs-client 或 nfs-common 包

在运行 mount 命令之前,请安装 nfs-utils、nfs-client 或 nfs-common 包。

若要检查是否安装了 NFS 包,请运行:

本节中的相同命令适用于 CentOS 和 Oracle Linux。

sudo rpm -qa | grep nfs-utils

解决方案

如果未安装包,请使用特定于发行版的命令安装包。

本节中的相同命令适用于 CentOS 和 Oracle Linux。

OS 版本 7.X

sudo yum install nfs-utils

OS 版本 8.X 或 9.X

sudo dnf install nfs-utils

原因 4:防火墙阻止端口 2049

NFS 协议通过端口 2049 与其服务器通信。 确保此端口对存储帐户打开, (NFS 服务器) 。

解决方案

运行以下命令,验证端口 2049 是否已在客户端上打开。 如果端口未打开,请将其打开。

sudo nc -zv <storageaccountnamehere>.file.core.windows.net 2049

原因 5:存储帐户已删除

如果由于 错误:连接超时而无法装载文件共享,则包含文件共享的存储帐户可能会意外删除。

解决方案

恢复存储帐户。 然后,删除并重新创建专用终结点,使其与新的存储帐户资源 ID 相关联。

对于某些内核上的大型目录枚举,ls 挂起

原因:Linux 内核 v5.11 中引入了 bug,已在 v5.12.5 中修复

某些内核版本存在一个 bug,导致目录列表导致无休止的 READDIR 序列。 可在一次调用中传送所有条目的小目录没有此问题。 该 bug 已在 Linux 内核 v5.11 中引入,并在 v5.12.5 中修复。 因此,介于两者之间的任何内容都有 bug。 RHEL 8.4 具有此内核版本。

解决方法:降级或升级内核

将内核降级或升级到受影响内核以外的任何内容应可解决此问题。

系统命令失败并出现“找不到文件”错误

原因

由于 NFS 服务生成的 64 位 inode 编号的格式设置,依赖于 inode 编号的 Linux 32 位应用程序可能无法在 Azure 文件存储 中正常工作。

解决方案

若要解决此问题,请使用以下某种方法:

  • 使用 nfs.enable_ino64=0 内核启动选项将 64 位 inode 数压缩为 32 位。

  • 通过将 添加到 options nfs enable_ino64=0/etc/modprobe.d/nfs.conf 文件并重新启动 VM 来设置模块参数。

还可以在 grub.conf 文件中保留此内核启动选项。 有关详细信息,请参阅 Linux 分发版的文档。

需要帮助?

如果仍需要帮助, 请联系支持人员 以快速解决问题。

另请参阅

联系我们寻求帮助

如果你有任何疑问或需要帮助,请创建支持请求联系 Azure 社区支持。 还可以向 Azure 反馈社区提交产品反馈。