排查 Linux (SMB) 中的Azure 文件存储问题

本文列出了将 SMB Azure 文件共享与 Linux 客户端配合使用时可能发生的常见问题。 它还提供了这些问题的可能原因和解决方法。

可以使用 AzFileDiagnostics 自动执行症状检测,并确保 Linux 客户端具有正确的先决条件。 它有助于设置环境以获得最佳性能。 还可以在 Azure 文件共享疑难解答中找到此信息。

重要

本文仅适用于 SMB 共享。 有关 NFS 共享的详细信息,请参阅 排查 NFS Azure 文件共享问题。

适用对象

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

复制文件时时间戳丢失

在 Linux/Unix 平台上,如果不同用户拥有文件 1 和文件 2, cp -p 命令将失败。

原因

COPYFILE 中的强制标志 f 导致在 Unix 上执行 cp -p -f 。 此命令也无法保留你不拥有的文件的时间戳。

解决方法

使用存储帐户用户复制文件:

  • str_acc_name=[storage account name]
  • sudo useradd $str_acc_name
  • sudo passwd $str_acc_name
  • su $str_acc_name
  • cp -p filename.txt /share

ls: 无法访问“path>”<:输入/输出错误

尝试使用 ls 命令列出 Azure 文件共享中的文件时,该命令在列出文件时会挂起。 出现以下错误:

ls: 无法访问“path>”<: 输入/输出错误

解决方案

将 Linux 内核升级到以下版本,以便解决此问题:

  • 4.4.87+
  • 4.9.48+
  • 4.12.11+
  • 大于或等于 4.13 的所有版本

原因

默认情况下,使用 SMB 在 Linux 上装载 Azure 文件共享不支持符号链接 (符号链接) 。 你可能会看到如下错误:

sudo ln -s linked -n t
ln: failed to create symbolic link 't': Operation not supported

解决方案

Linux SMB 客户端不支持通过 SMB 2 或 3 协议创建 Windows 样式的符号链接。 目前,Linux 客户端支持另一种样式的符号链接,称为 “明霍尔+法语符号链接” ,用于创建和跟踪操作。 需要符号链接的客户可以使用“mfsymlinks”装载选项。 建议使用“mfsymlinks”,因为它也是 Mac 使用的格式。

若要使用符号链接,请将以下内容添加到 SMB 装载命令的末尾:

,mfsymlinks

因此,该命令如下所示:

sudo mount -t cifs //<storage-account-name>.file.core.windows.net/<share-name> <mount-point> -o vers=<smb-version>,username=<storage-account-name>,password=<storage-account-key>,dir_mode=0777,file_mode=0777,serverino,mfsymlinks

然后,可以按 Wiki 上的建议创建符号链接。

无法访问名称末尾有空格或点的文件夹或文件

在 Linux 上装载时,无法访问 Azure 文件共享中的文件夹或文件。 du 和 ls 和/或第三方应用程序等命令在访问共享时可能会失败并出现“没有此类文件或目录”错误;但是,可以通过Azure 门户将文件上传到这些文件夹。

原因

文件夹或文件是从将名称末尾的字符编码为其他字符的系统上传的。 从 Macintosh 计算机上传的文件可能具有“0xF028”或“0xF029”字符,而不是0x20 (空格) 或0X2E (点) 。

解决方案

在 Linux 上装载共享时,请使用共享上的 mapchars 选项:

而不是:

sudo mount -t cifs $smbPath $mntPath -o vers=3.0,username=$storageAccountName,password=$storageAccountKey,serverino

请使用:

sudo mount -t cifs $smbPath $mntPath -o vers=3.0,username=$storageAccountName,password=$storageAccountKey,serverino,mapchars

Azure 存储帐户实时迁移的 DNS 问题

装载的文件系统上的文件 I/O 开始出现“主机已关闭”或“权限被拒绝”错误。 客户端上的 Linux dmesg 日志显示重复错误,例如:

Status code returned 0xc000006d STATUS_LOGON_FAILURE
cifs_setup_session: 2 callbacks suppressed
CIFS VFS: \\contoso.file.core.windows.net Send error in SessSetup = -13

你还将看到服务器 FQDN 现在解析为与其当前连接的 IP 地址不同的 IP 地址。

原因

出于容量负载均衡的目的,存储帐户有时会从一个存储群集实时迁移到另一个存储群集。 帐户迁移触发Azure 文件存储流量,方法是将 DNS 映射更新为指向目标群集,从而从源群集重定向到目标群集。 这会阻止从该帐户流向源群集的所有流量。 预计 SMB 客户端会选取 DNS 更新,并将更多流量重定向到目标群集。 但是,由于 Linux SMB 内核客户端中的 bug,此重定向不会生效。 因此,数据流量会一直流向源群集,该群集在迁移后已停止为此帐户提供服务。

解决方法

可以通过重新启动客户端 OS 来缓解此问题,但如果不将客户端 OS 升级到具有帐户迁移支持的 Linux 发行版,则可能再次遇到此问题。 请注意,共享的 umount 和重新装载似乎暂时修复了问题。

若要更好地解决此问题,请清除内核 DNS 解析程序缓存:

  1. 通过运行以下命令显示内核 dns_resolver 模块的状态:

    grep '.dns_resolver' /proc/keys
    

    应会看到命令输出,如以下示例所示:

    132b6bbf I------     1 perm 1f030000     0     0 keyring   .dns_resolver: 1
    
  2. 运行以下命令,清除内核 DNS 解析程序缓存:

    sudo keyctl clear $((16#$(grep '.dns_resolver' /proc/keys | cut -f1 -d\ ) ))
    
  3. 再次显示内核 dns_resolver 模块的状态:

    grep '.dns_resolver' /proc/keys
    

    应会看到类似于以下示例的命令输出,指示缓存现在为空:

    132b6bbf I------     1 perm 1f030000     0     0 keyring   .dns_resolver: empty
    

解决方案

对于永久修复,请将客户端 OS 升级到具有帐户迁移支持的 Linux 发行版。 Linux SMB 内核客户端的多个修补程序已提交到主线 Linux 内核。 内核版本 5.15+ 和 Keyutils-1.6.2+ 具有修补程序。 某些发行版已向后移植这些修补程序,如果正在使用的发行版版本中存在以下修补程序,则可以检查:

启用 FIPS 时无法装载 SMB 文件共享

在 Linux VM 中启用 联邦信息处理标准 (FIPS) 时,无法装载 SMB 文件共享。 客户端上的 Linux dmesg 日志显示错误,例如:

kernel: CIFS: VFS: Could not allocate crypto hmac(md5)
kernel: CIFS: VFS: Error -2 during NTLMSSP authentication
kernel: CIFS: VFS: \\contoso.file.core.windows.net Send error in SessSetup = -2
kernel: CIFS: VFS: cifs_mount failed w/return code = -2

重要

FIPS 是美国政府用来确保计算机系统的安全性和完整性的一组标准。 当系统处于 FIPS 模式时,它遵循这些标准概述的特定加密要求。

原因

SMB 文件共享的客户端使用 NTLMSSP 身份验证,这需要 MD5 哈希算法。 但是,在 FIPS 模式下,MD5 算法受到限制,因为它不符合 FIPS。 MD5 是一个广泛使用的哈希函数,可生成 128 位哈希值。 但是,出于加密目的,MD5 被视为不安全。

如果启用了 FIPS 模式,如何检查

若要验证是否已在客户端上启用 FIPS 模式,请运行以下命令。 如果该值设置为 1,则启用 FIPS。

sudo cat /proc/sys/crypto/fips_enabled

解决方案

若要解决此问题,请为 SMB 文件共享启用 Kerberos 身份验证。 如果无意中启用了 FIPS,请参阅 option2 以禁用它。

选项 1:为 SMB 文件共享启用 Kerberos 身份验证

若要在启用了 FIPS 的 Linux VM 上装载 SMB 文件共享,请使用 Kerberos/Azure AD 身份验证。 有关详细信息,请参阅为访问Azure 文件存储的 Linux 客户端启用通过 SMB 的 Active Directory 身份验证

选项 2:禁用 FIPS 以装载 Samba 共享

  1. 将 中的 sysctl 值 crypto.fips_enabled 更改为 0 /etc/sysctl.conf

  2. GRUB_CMDLINE_LINUX_DEFAULT修改 文件中的 /etc/default/grub 并删除参数 fips=1

  3. 使用以下命令重新生成 grub2 配置文件:

    sudo grub2-mkconfig -o /boot/grub2/grub.cfg
    
  4. 使用以下命令重新生成 initramfs 映像:

    sudo dracut -fv
    
  5. 重新启动 VM。

有关详细信息,请参阅 Linux 分发版的以下文档:

需要帮助?

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

另请参阅

联系我们寻求帮助

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