使用网络文件系统 (NFS) 3.0 协议装载 Blob 存储

本文指示了如何使用网络文件系统 (NFS) 3.0 协议从基于 Linux 的 Azure 虚拟机 (VM) 或本地运行的 Linux 系统在 Azure Blob 存储中装载容器。 要详细了解 Blob 存储中的 NFS 3.0 协议支持,请参阅 Azure Blob 存储支持的网络文件系统 (NFS) 3.0 协议

步骤 1:创建 Azure 虚拟网络

存储帐户必须包含在虚拟网络中。 虚拟网络使客户端能够安全地连接到存储帐户。 要详细了解 Azure 虚拟网络以及如何创建虚拟网络,请参阅虚拟网络文档

注意

同一虚拟网络中的客户端可以在帐户中装载容器。 你还可以从本地网络中运行的客户端装载容器,但必须先将本地网络连接到虚拟网络。 请参阅受支持的网络连接

步骤 2:配置网络安全

目前,保护存储帐户中数据的唯一方法就是使用虚拟网络和其他网络安全设置。 请参阅 Blob 存储的网络安全建议

用于保护数据的任何其他工具(包括帐户密钥授权、Microsoft Entra 安全性和访问控制列表 (ACL))都无法用于授权 NFS 3.0 请求。 事实上,如果将命名用户或组的条目添加到 blob 或目录的 ACL,则非根用户在客户端上无法访问该文件。 必须移除该条目才能恢复对客户端上非根用户的访问。

重要

NFS 3.0 协议使用端口 111 和 2048。 如果要从本地网络进行连接,请确保客户端允许通过这些端口进行传出通信。 如果已授予对特定 VNet 的访问权限,请确保与这些 VNet 关联的网络安全组都不包含阻止通过这些端口进行传入通信的安全规则。

步骤 3:创建和配置存储帐户

要使用 NFS 3.0 装载容器,必须创建一个存储帐户。 不能启用现有帐户。

标准常规用途 v2 存储帐户和高级块 Blob 存储帐户支持 NFS 3.0 协议。 有关这些类型的存储帐户的详细信息,请参阅存储帐户概述

要配置帐户,请选择以下值:

设置 高级性能层 标准性能
位置 所有可用区域 所有可用区域
性能 高级 标准
帐户种类 BlockBlobStorage 常规用途 V2
复制 本地冗余存储 (LRS)、区域冗余存储 (ZRS) 本地冗余存储 (LRS)、区域冗余存储 (ZRS)
连接方法 公共终结点(选定网络)或专用终结点 公共终结点(选定网络)或专用终结点
分层命名空间 Enabled Enabled
NFS V3 Enabled Enabled

对于所有其他设置,可接受默认值。

步骤 4:创建容器

使用以下任意工具或 SDK 在存储帐户中创建容器:

工具 SDK
Azure 门户 .NET
AzCopy Java
PowerShell Python
Azure CLI JavaScript
REST

注意

默认情况下,新容器的根 Squash 选项为“无根 Squash”。 但是,你可以将其更改为“根 Squash”或“所以 Squash”。 有关这些 Squash 选项的信息,请参阅操作系统文档。

下图展示了在 Azure 门户中显示的 Squash 选项。

屏幕截图显示 Azure 门户中的 Squash 选项。

步骤 5:安装 AZNFS 装载帮助程序包

AZNFS 装载帮助程序包可帮助 Linux NFS 客户端可靠地访问 Azure Blob NFS 共享,即使终结点的 IP 地址发生更改也是如此。 此包运行名为 aznfswatchdog 的后台作业,以监视对装载式共享的终结点 IP 地址的更改。 如果检测到更改,此后台作业会更新目标网络地址转换 (DNAT) 规则。 若要了解详细信息,请参阅 AZNFS 装载帮助程序

  1. 确定是否在客户端上安装了 AZNFS 装载帮助程序包。

    systemctl is-active --quiet aznfswatchdog && echo -e "\nAZNFS mounthelper is installed! \n"
    

    如果已安装该包,则显示消息 AZNFS mounthelper is installed!

  2. 如果尚未安装该包,请使用以下命令进行安装。

    wget -O - -q https://github.com/Azure/AZNFS-mount/releases/latest/download/aznfs_install.sh | bash
    

    注意

    以下 Linux 分发版支持 AZNFS:

    • Ubuntu(18.04 LTS、20.04 LTS、22.04 LTS)
    • RedHat7、RedHat8、RedHat9
    • Rocky8、Rocky9
    • SUSE (SLES 15)

步骤 6:装载容器

在 Linux 系统中创建目录,然后将容器装载到存储帐户中。

  1. 在 Linux 系统中,创建目录:

    mkdir -p /nfsdata
    
  2. 使用下列方法之一装载容器。 在这两种方法中,请将 <storage-account-name> 占位符替换为存储帐户的名称,并将 <container-name> 替换为容器的名称。

    • 要在重新启动时自动装载共享,请执行以下操作:

      1. 通过添加以下行在 /etc/fstab 文件中创建一个条目:

        <storage-account-name>.blob.core.chinacloudapi.cn:/<storage-account-name>/<container-name>  /nfsdata    aznfs defaults,sec=sys,vers=3,nolock,proto=tcp,nofail,_netdev    0 0
        
      2. 运行以下命令以立即处理 /etc/fstab 条目并尝试装载前面的路径:

        mount /nfsdata
        
    • 对于在重新启动后不会持续存在的临时装载,请运行以下命令:

      mount -t aznfs -o sec=sys,vers=3,nolock,proto=tcp <storage-account-name>.blob.core.chinacloudapi.cn:/<storage-account-name>/<container-name>  /nfsdata
      

      提示

      通过使用 -t aznfs 装载选项,可确保即使终结点 IP 在装载后发生更改,NFS 客户端也始终正确连接到存储终结点。 如果该终结点的 IP 地址发生更改,则使用 -t nfs 装载选项装载的 NFS 共享可能与存储终结点断开连接。

      mount 命令提供其他可选参数。 这些参数主要影响客户端行为。 syssec 选项当前支持的唯一值。

      重要

      nconnect 装载选项仅适用于支持 Azure nconnect 的客户端。 在不受支持的客户端上使用 nconnect 选项会降低吞吐量,并导致命令超时或无法正常运行。 若要详细了解如何确保客户端支持 Azure nconnect,请参阅增加 TCP 连接数

解决常见错误

错误 原因/解决方法
Access denied by server while mounting 请确保客户端在支持的子网中运行。 请参阅支持的网络位置
No such file or directory 请确保直接在终端中输入(而不是复制和粘贴)装载命令及其参数。 如果你将该命令的任何部分从另一个应用程序复制并粘贴到终端,粘贴的信息中的隐藏字符可能会导致出现此错误。 如果没有为 NFS 3.0 启用帐户,也可能出现此错误。
Permission denied 新创建的 NFS 3.0 容器的默认模式为 0750。 非根用户无法访问卷。 如果需要从非根用户访问,则根用户必须将模式更改为 0755。 示例命令:sudo chmod 0755 /nfsdata
EINVAL ("Invalid argument" 当客户端尝试执行以下操作时,可能会出现此错误:
  • 写入从 blob 终结点创建的 blob。
  • 删除具有快照或位于具有活动 WORM(一次写入,多次读取)策略的容器中的 blob。
  • EROFS ("Read-only file system" 当客户端尝试执行以下操作时,可能会出现此错误:
  • 写入 blob 或删除具有活动租约的 blob。
  • 写入 Blob 或删除容器中具有活动 WORM 策略的 Blob。
  • NFS3ERR_IO/EIO ("Input/output error" 当客户端尝试读取、写入或设置存储在存档访问层中的 blob 的属性时,可能会出现此错误。
    OperationNotSupportedOnSymLink 个错误 在通过 Blob 存储或 Azure Data Lake Storage API 执行写入操作期间,可能会返回此错误。 不允许使用这些 API 写入或删除使用 NFS 3.0 创建的符号链接。 请确保使用 NFS 3.0 终结点处理符号链接。
    mount: /nfsdata: bad option; 使用 sudo apt install nfs-common 安装 NFS 帮助程序。
    Connection Timed Out 确保客户端允许通过端口 111 和 2048 进行传出通信。 NFS 3.0 协议使用这些端口。 确保使用 Blob 服务终结点而不是 Data Lake Storage 终结点来装载存储帐户。

    AZNFS 装载帮助程序的限制和故障排除

    请参阅 AZNFS 装载帮助程序

    另请参阅