次の方法で共有

排查 BlobFuse 中的问题

本文讨论在使用 BlobFuse 时可能会遇到的常见问题。

注释

若要更好地了解问题的根本原因,在尝试重现问题之前,请将日志级别设置为调试模式(log_debug)。 请参阅 配置 BlobFuse 的日志记录

常见装载问题

本部分列出了尝试装载容器时可能发生的常见问题。

错误: fusermount: 无法打开 /etc/fuse.conf: 权限被拒绝

只有属于 fuse 组的用户和根用户才能运行 fusermount 命令。 若要解决此问题,请使用以下命令将用户添加到 fuse 组:

sudo addgroup <user> fuse

错误:挂载命令成功,但日志显示“未能初始化FUSE”

如果使用配置 allow-other: true ,请确保 user_allow_other/etc/fuse.conf 文件中启用。 默认情况下, /etc/fuse.conf 此选项已禁用。 需要启用它并保存文件。

无法装载:无法对 Azure 存储的凭据进行身份验证

存储配置可能存在问题。 检查存储帐户名称、帐户密钥和 container/filesystem 名称。

此问题的可能原因包括以下问题:

  • 帐户或访问密钥无效。

  • 不存在的容器。 必须先创建容器,然后才能装载 BlobFuse。

  • Windows 行尾(CRLF) 若要解决此问题,请运行 dos2unix

  • 在存储帐户上启用“安全传输(HTTPS)”时使用 HTTP。

  • 已启用阻止 VM 连接到存储帐户的虚拟网络安全规则。 确保可以使用 AzCopy 或 Azure CLI 连接到存储帐户。

  • DNS 问题和超时。 若要绕过 DNS 查找,请将存储帐户解析添加到 /etc/hosts

  • 如果使用代理终结点,请确保使用正确的传输协议 HTTP 与 HTTPS。

对于托管服务标识(MSI)或服务主体(SPN)授权,响应中的 HTTP 状态代码为 403。 授权错误

  • 检查存储帐户访问角色。 请确保同时拥有 ContributorStorage Blob Contributor 这两个角色以供 MSI 或 SPN 标识使用。
  • 对于专用 AAD 终结点(专用 MSI 终结点),请确保已正确配置环境变量。

fusermount:装载失败:操作不允许(CentOS)

默认情况下,fusermount 是 CentOS 上的特权操作。 可以通过更改 fusermount 操作的权限来解决此问题。

chown root /usr/bin/fusermount
chmod u+s /usr/bin/fusermount

无法访问装载的目录

FUSE 支持在用户空间中装载文件系统。 装载的文件系统只能由装载它的用户访问。 例如,如果使用 root 装载文件系统,但尝试使用其他用户访问文件系统,则访问会失败。 若要解决此限制,请使用不安全的熔丝选项 --allow-other

sudo blobfuse2 mount /home/myuser/mount_dir/ --config-file=config.yaml --allow-other

fusermount: 命令未找到

尝试卸载 Blob 存储时,可能会发生此错误,但找不到建议的命令。 虽然 umount 可能正常工作,但建议使用 fusermount 方法,因此请安装 fuse 包。 以下示例在 Ubuntu 20+ 上安装 fuse 包:

sudo apt install fuse3

注释

Fuse 版本(2 或 3)取决于所使用的 Linux 分发版。 请参阅分发版的 fuse 版本。

BlobFuse 配置文件应将帐户名称指定为原始存储帐户名称,而不是专用链接存储帐户名称。 例如: myblobstorageaccount.blob.core.chinacloudapi.cn 正确,但 privatelink.myblobstorageaccount.blob.core.chinacloudapi.cn 不正确。

如果配置文件正确,请检查名称解析。 例如, dig +short myblobstorageaccount.blob.core.chinacloudapi.cn 应返回专用 IP 地址,例如 10.0.0.5

如果转换和名称解析失败,请验证虚拟网络设置,以确保 DNS 转换请求转发到 Azure 提供的 DNS 168.63.129.16。 如果将 BlobFuse 托管 VM 配置为转发到自定义 DNS 服务器,请验证自定义 DNS 设置,以确保将 DNS 请求转发到 Azure 提供的 DNS 168.63.129.16

若要解决将专用终结点与 Azure 专用 DNS 集成时出现的 DNS 问题,请验证专用终结点是否在专用 DNS 区域中具有正确的 DNS 记录。 如果删除并重新创建专用终结点,则可能存在新的 IP 或存在重复的记录,这可能导致客户端使用轮循机制并使连接不稳定。 还可以验证 Azure VM 的 DNS 设置是否具有正确的 DNS 服务器。 可以在虚拟网络级别和 NIC 级别定义 DNS 设置。 无法在来宾操作系统虚拟机的网卡内配置DNS设置。

对于自定义 DNS 服务器,请确保自定义 DNS 服务器将所有请求转发到 168.63.129.16。 如果这样做,则应能够正确使用 Azure 专用 DNS 区域。 如果没有,可能需要创建条件转发器到专用链接区或原始 PaaS 服务区。

如果自定义 DNS 仅命中根域,则最好将转发器配置为 168.63.129.16,这样可以提高性能,并且无需额外的条件转发设置。

如果自定义 DNS 向另一个 DNS 服务器(而不是 Azure 提供的 DNS)转发 DNS,则需要为原始 PaaS 域区域创建一个条件转发器(即,您应该将blob.core.chinacloudapi.cn条件转发器配置为168.63.129.16存储域)。 请记住,使用这种方法时,所有访问存储帐户的 DNS 请求,无论是否通过私有终结点,都会由 Azure 提供的 DNS 进行解析。 在 Azure 中拥有多个自定义 DNS 服务器有助于提高来自本地的请求的高可用性。

BlobFuse 被 OOM 杀死

“OOM 杀手”或“内存不足杀手”是 Linux 内核在内存严重不足时采用的进程。 根据算法,它会终止一个或多个进程以释放内存空间。 BlobFuse 可以是这样的进程。 若要调查 BlobFuse 是否由 OOM 杀手杀死,请运行以下命令:

dmesg -T | egrep -i 'killed process'

如果 BlobFuse 进程 ID(PID)出现在输出中,OOM 杀手会将 SIGKILL 信号发送到 BlobFuse。 如果 BlobFuse 未作为服务运行,则不会自动重启,必须再次手动装载。 如果这种情况持续发生,请监视系统并调查系统内存不足的原因。 如果预期内存使用率过高,可能需要升级 VM。

无法在专用终结点后面访问已启用 HNS 的存储帐户

对于已启用 HNS 的帐户,请始终在配置文件的type: adls部分中添加azstorage。 除非存储帐户位于专用终结点后面,否则请避免使用 endpoint 。 BlobFuse 同时使用 blob 和 DFS 终结点连接到存储帐户。 必须通过专用终结点公开这两个终结点,BlobFuse 才能正常运行。

若要在 Azure 门户中为 DFS 创建专用终结点,请转到存储帐户 -> 网络 -> 专用终结点连接。 选择 + Private endpoint,填写订阅、资源组、名称、网络接口名称和区域。 选择“下一步”,然后在“目标”子资源下选择 dfs。 选择虚拟网络,然后选择虚拟网络和子网。 选择 DNS。 选择“是”以与专用 DNS 集成。 选择专用链接 DNS 的订阅和资源组。 选择“下一步”、“下一步”,然后选择“创建”。

无法初始化新管道 [azstorage 中的配置错误 [未提供帐户名称]]

确保配置文件中包含 azstorage 节。

BlobFuse 基本配置文件包含所有设置的列表以及每个设置的简要说明。 使用 示例文件缓存配置文件示例块缓存配置文件 ,通过为每个方案使用一些基本设置快速开始。

无法在代理设置中挂载[proxyconnect tcp:dial tcp:lookup:无此主机]

请确保在环境变量 https_proxyhttp_proxy 中设置代理 URL,并且确保该 URL 对 BlobFuse 进程的访问是可用的。 如果使用专用终结点,请确保它 endpoint 指向配置中的 azstorage 节。或者,通过 DNS 解析让 account.blob.core.chinacloudapi.cn 解析回专用终结点。 对于 HNS 帐户,请确保为 blob 和 dfs 帐户配置专用终结点。

BlobFuse 与 blobfuse2.z13.web.core.chinacloudapi.cn 建立 HTTPS 通信

装载时,BlobFuse 会尝试检查是否有可用的升级。 它先与 blobfuse2.z13.web.core.chinacloudapi.cn 建立连接,然后获取最新版本的详细信息。 由于网络策略或防火墙,如果此调用失败,装载将继续。 如果新版本可用,则会打印 shell 上的消息,要求升级。 如果失败,只会记录日志消息,并且对于任何文件系统操作或挂载都是无害的。 如果不希望 BlobFuse 进行此类检查,请在装载命令中添加 --disable-version-check=true CLI 参数。

成功装载后的常见问题

本部分列出了成功装载容器后可能发生的常见问题。

Errno 24:无法打开文件缓存中的文件 /mnt/tmp/root/filex。 errno = 24 或文件打开错误过多

Errno 24 在 Linux 中,对应于“打开的文件过多”错误。 当应用程序打开的文件数超过系统允许的文件时,会出现此错误。 BlobFuse 通常允许的文件比在 Linux 中设置的 ulimit 值少 20 个。 通常,每个进程 Linux 限制为 1,024。 例如,BlobFuse 一次允许 1,004 个打开的文件描述符。 若要解决此问题,请在 Ubuntu 中编辑 /etc/security/limits.conf 并添加以下两行:

soft nofile 16384
hard nofile 16384

该值 16384 指允许打开的文件数。 编辑此文件后,您必须重新启动,才能使 BlobFuse 选取新的限制。 可以使用命令 ulimit -n 16834来增加限制。 但是,此命令在 Ubuntu 中不起作用。

输入/输出错误

如果您已成功挂载 Blob 容器,但未能创建目录或上传文件,可能是因为您挂载的是来自不支持块 Blob 的 Premium (Page)Blob 帐户的 Blob 容器。 BlobFuse 使用块 Blob 作为文件,需要支持块 Blob 的帐户。

mkdir: cannot create directory 'directoryname' : Input/output error

无法解释的高存储帐户列表使用成本

高存储帐户列表使用成本的最可能原因是,通过使用 Linux VM 部署的内置updatedb服务触发mlocate自动扫描。 mlocate 是充当搜索工具的内置服务。 该服务被添加到 /etc/cron.daily 下以安排每日运行, 并触发 updatedb 服务扫描服务器上的每个目录。 服务将重新生成数据库中的文件索引,以保持搜索结果最新。

若要解决此问题,请在 shell 提示符中键入以下命令: ls -l /etc/cron.daily/mlocate 如果mlocate存在于/etc/cron.daily中,请将 BlobFuse 添加到排除列表中,这样 updatedb 就不会扫描 BlobFuse 装载目录。 更新 updatedb.conf 文件。

  1. 若要更新该文件,请键入 cat /etc/updatedb.conf

    内容如下所示:

    PRUNE_BIND_MOUNTS="yes"
    
    PRUNENAMES=".git .bzr .hg .svn"
    
    PRUNEPATHS="/tmp /var/spool /media /var/lib/os-prober /var/lib/ceph /home/.ecryptfs /var/lib/schroot"
    
    PRUNEFS="NFS nfs nfs4 rpc_pipefs afs binfmt_misc proc smbfs autofs iso9660 ncpfs coda devpts ftpfs devfs devtmpfs fuse.mfs shfs sysfs cifs lustre tmpfs usbfs udf fuse.glusterfs fuse.sshfs curlftpfs ceph fuse.ceph fuse.rozofs ecryptfs fusesmb"
    
  2. 将 BlobFuse 装载路径(例如:/mnt)添加到 PRUNEPATHS

  3. 将“Blobfuse2”和“fuse”添加到PRUNEFS。 添加这两个值不会造成任何损害。

    若要在 Pod 创建时自动执行此配置,请在群集中创建一个新 configmap 配置,其中包含有关脚本的新配置。 然后,使用新的DaemonSet创建一个configmap,可以将配置更改应用到群集中的每个节点。

    Example:
    configmap file: (testcm.yaml)
    apiVersion: v1
    kind: ConfigMap
    metadata:
    name: testcm
    data:
    updatedb.conf: |
    PRUNE_BIND_MOUNTS="yes"
    PRUNEPATHS="/tmp /var/spool /media /var/lib/os-prober /var/lib/ceph /home/.ecryptfs /var/lib/schroot /mnt /var/lib/kubelet"
    PRUNEFS="NFS nfs nfs4 rpc_pipefs afs binfmt_misc proc smbfs autofs iso9660 ncpfs coda devpts ftpfs devfs devtmpfs fuse.mfs shfs sysfs cifs lustre tmpfs usbfs udf fuse.glusterfs use.sshfs curlftpfs ceph fuse.ceph fuse.rozofs ecryptfs fusesmb fuse Blobfuse2"
    DaemonSet file: (testcmds.yaml)
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
    name: testcmds
    labels:
    test: testcmds
    spec:
    selector:
    matchLabels:
    name: testcmds
    template:
    metadata:
    labels:
    name: testcmds
    spec:
    tolerations:
    - key: "kubernetes.azure.com/scalesetpriority"
    operator: "Equal"
    value: "spot"
    effect: "NoSchedule"
    containers:
    - name: mypod
    image: debian
    volumeMounts:
    - name: updatedbconf
    mountPath: "/tmp"
    - name: source
    mountPath: "/etc"
    command: ["/bin/bash","-c","cp /tmp/updatedb.conf /etc/updatedb.conf;while true; do sleep 30; done;"]
    restartPolicy: Always
    volumes:
    - name: updatedbconf
    configMap:
    name: testcm
    items:
    - key: "updatedb.conf"
    path: "updatedb.conf"
    - name: source
    hostPath:
    path: /etc
    type: Directory
    
    

文件内容与存储不同步

请参阅文件缓存组件设置 timeout-sec

无法卸载

当文件打开或用户或进程将目录更改为装载目录或其子目录时,卸载将失败。 确保未使用任何文件,然后再次尝试卸载命令。 umount -f 即使装载的文件或目录正在使用,也不起作用。 umount -l 执行延迟卸载,这意味着当装载的文件不再使用时,它会自动卸载。

BlobFuse 装载,但根本无法正常运行

反恶意软件和防病毒软件可以阻止 FUSE 功能。 在这种情况下,尽管装载命令成功且 BlobFuse 二进制文件正在运行,但 FUSE 功能不起作用。 确定此问题的一种方法是打开调试日志并装载 BlobFuse。 如果看不到来自 BlobFuse 的任何日志,则可能遇到了此问题。 停止防病毒软件,然后重试。 在这种情况下,通过 /etc/fstab 进行装载是有效的,因为它在反恶意软件启动之前执行装载命令。

文件缓存临时目录不为空

若要确保文件缓存临时目录中没有剩余文件,请卸载而不是停止 BlobFuse。 如果停止 BlobFuse 而不卸载,请在配置文件中为下次装载设置cleanup-on-start以清理临时目录。

无法修改现有文件(错误:无效参数)

默认情况下,writeback-cache 对 libfuse3 是启用的,这可能会导致追加和写入操作失败。 可以禁用写回缓存,这可能会降低性能,或者将 BlobFuse 配置为忽略用户提供的打开标志,以便它适用于写回缓存。

若要禁用写回缓存,请在配置文件的 libfuse 节下添加 disable-writeback-cache: true

若要使其适用于写回缓存,请在配置文件的 libfuse 节下添加 ignore-open-flags: true

无法列出平面命名空间帐户的文件和目录

对于非 HNS 帐户,BlobFuse 要求容器中存在特殊的目录标记文件来标识目录。 如果这些文件不存在,请在virtual-directory: true节中设置azstorage

文件大小和 LMT 更新,但文件内容不会刷新

BlobFuse 支持 fuse2 和 fuse3 兼容的 Linux 分发版。 在所有 Linux 分发版中,内核缓存其页面缓存中的文件内容。 只要缓存有效,系统就从缓存中提供读取和写入作。 调用不会到达文件系统驱动程序,在本例中为 BlobFuse。 当交换页面时,系统会使此页面缓存失效,用户通过 CLI 手动清除该缓存,或者文件系统驱动程序会请求它。

在 fuse2 兼容的分发版中,libfuse 不支持使页面缓存失效。 缓存后的内容将保留在内核中,直到用户手动清除页面缓存或内核决定将其交换出去。这意味着,即使文件大小或 LMT 已更改,BlobFuse 也决定通过重新加载文件来刷新内容,用户仍将在读取时获得过时的内容。

在 fuse3 兼容分发版中,BlobFuse 将 libfuse 配置为在文件大小或 LMT 更改时使页面缓存失效,因此不会发生此问题。

如果发现对文件的列表或状态调用显示了更新时间或大小,但内容没有反映更改,请先通过 BlobFuse 日志确认该文件确实是新下载的。 如果文件缓存超时尚未过期,则 BlobFuse 会继续使用临时缓存中保留的文件的当前版本,并且内容不会刷新。 如果 BlobFuse 下载了最新的文件,但仍观察到过时的内容,则使用 sysctl -w vm.drop_caches=3 命令手动清除内核页缓存。

如果工作流涉及直接在容器中更新文件(不使用 BlobFuse),并且想要获取 BlobFuse 装载上的最新内容,请执行以下步骤(仅适用于 fuse3 兼容 Linux 分发版):

  • 将 libfuse 节中的所有超时设置为 0(条目、属性、负)。

  • 在配置中删除管道部分的attr_cache。

  • 将文件缓存超时设置为 0。

  • 在配置文件的 libfuse 部分中,添加“disable-writeback-cache: true”。

BlobFuse 运行状况监视器

BlobFuse 功能之一是健康监视器。 它提供了更多见解,说明 BlobFuse 实例如何与计算机的其余部分交互。 访问 此处 以设置它。 此功能目前处于预览状态。

生成问题

请确保正确设置 Go 开发环境。 确保安装 fuse3 或 fuse2,例如:

sudo apt-get install fuse3 libfuse3-dev -y

启用分层命名空间的存储帐户中的专用端点问题

在专用终结点后面访问启用了分层命名空间的 Azure 存储帐户时,需要创建 两个单独的专用终结点 ,以确保连接正确:

  1. DFS 的专用终结点

    • 目标: privatelink.dfs.core.chinacloudapi.cn
      • 使用此终结点访问 Data Lake Storage Gen2 功能。
  2. Blob 的专用终结点

    • 目标: privatelink.blob.core.chinacloudapi.cn
    • 使用此端点访问 Blob 存储操作。

为什么需要这两个终结点

分层命名空间的存储帐户为 blob 和 DFS 使用单独的端点:

  • Data Lake Storage 终结点(dfs.core.chinacloudapi.cn)处理命名空间相关的操作,例如目录和文件管理。

  • Blob 存储终结点(blob.core.chinacloudapi.cn)处理诸如向 Blob 流式传输数据和从 Blob 流式传输数据等操作。

另请参阅