排查 NFS Azure文件共享问题

适用于:✔️ NFS Azure文件共享

备注

本文中引用的 CentOS 是 Linux 分发版,将达到生命周期结束(EOL)。 请考虑您的使用方式,并据此进行规划。 有关详细信息,请参阅 CentOS 生命周期指南

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

重要

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

使用 Always-On 诊断工具

可以使用 Always-On 诊断(AOD)工具来收集 NFSv4 和 SMB Linux 客户端上的日志。 守护程序作为系统服务在后台运行,可配置为检测各种源(例如 dmesg 日志、调试数据、错误指标和延迟指标)中的异常。 它可以从 tcpdump、nfsstat、mountstsat 和其他源捕获数据,以及系统的 CPU 和内存使用情况。 该工具可用于收集有关难以复现的现场问题的调试信息。

Always-On 诊断工具目前与运行 SUSE Linux Enterprise Server 15(SLES 15)和 Red Hat Enterprise Linux 8(RHEL 8)的系统兼容。 按照与操作系统对应的安装步骤操作:

重要

Always-On 诊断不支持启用传输中加密的 NFS 卷。 若要对受影响的 NFS 共享启用日志收集,必须在没有 EiT 的情况下装载共享。

在 RHEL 8 中,按照以下说明安装 Always-On 诊断工具:

  1. 下载存储库配置包。

    curl -ssl -O https://packages.microsoft.com/config/rhel/8/packages-microsoft-prod.rpm
    
  2. 安装存储库配置包。

    sudo rpm -i packages-microsoft-prod.rpm
    
  3. 安装并更新包索引文件后,删除存储库配置包。

    rm packages-microsoft-prod.rpm
    sudo dnf update
    
  4. 安装此包。

    sudo dnf install aod
    

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

原因 1:“idmapping” 功能未禁用

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

原因 2:遇到错误的文件或目录名称后,禁用的 idmapping 将重新启用

即使禁用 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 只能在具有以下配置的存储帐户上使用:

  • 层级: 高级
  • 帐户类型:FileStorage

解决方案

请按照创建 NFS 文件共享中的说明进行操作。

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

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

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

  • 服务终结点

    • 由公共终结点访问。

    • 仅在同一区域中可用。

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

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

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

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

      公共终结点连接的关系图。

  • 专用终结点

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

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

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

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

      专用终结点连接的关系图。

原因 2:未安装 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

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

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

解决方案

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

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

原因 4:存储帐户已删除

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

解决方案

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

原因 5:尝试使用 NFS 客户端挂载(而不是 AZNFS 挂载助手)挂载共享,并且存储帐户上启用了传输中的 安全传输 和/或 要求在传输中加密 NFS 设置。

强制安全传输设置对存储帐户中的所有文件共享执行传输加密,除非启用了要求 NFS 在传输中加密设置,在这种情况下,强制安全传输仅适用于 REST/HTTPS 流量。 对于 NFS 文件共享,在传输过程中使用加密需要使用 AZNFS 装载帮助程序来装载共享。该客户端实用工具包简化了为 NFSv4.1 流量建立安全隧道的复杂性。

解决方案

在存储帐户上禁用 强制安全传输 设置和 要求 NFS 传输中加密 设置,或使用 AZNFS 装载帮助程序装载共享。 有关详细信息,请参阅 NFS Azure 文件共享的传输加密

ls 在某些内核上挂起以进行大型目录枚举

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

某些内核版本存在 bug,该 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 文件中并重启虚拟机来设置模块参数。

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

无法更改文件和目录的所有权

原因

客户端 OS 对 NFS 文件共享(而不是 Azure 文件存储 服务)强制实施权限。 如果在 NFS 文件共享上启用 根 Squash 设置,则客户端系统上的根用户将成为匿名(非特权)用户,以便进行访问控制。 此限制意味着,即使以根身份登录客户端系统,也不能使用 chown 命令更改你不拥有的文件和目录的所有权。

解决方案

在Azure门户中,转到文件共享并选择“属性”。 将Root Squash设置更改为No Root Squash。 有关详细信息,请参阅 为 Azure 文件存储 配置根权限压缩

启用 无根 Squash 时,客户端系统上的根用户与服务器系统上的根用户具有相同的权限。 现在可以使用 chown 更改共享中的任何文件或目录的所有权,而不受当前所有者的限制。 进行更改后,可以根据需要重新启用Root Squash

需要帮助?

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

另请参阅

第三方信息免责声明

本文讨论的第三方产品由独立于Microsoft的公司制造。 Microsoft对这些产品的性能或可靠性不作任何默示或其他保证。