分享方式:


在 Batch 集區上掛接虛擬檔案系統

Azure Batch 支援在 Batch 集區中的 Windows 或 Linux 計算節點上掛接雲端儲存空間或外部檔案系統。 當計算節點加入集區時,就會掛接虛擬檔案系統並在該節點上用作本機磁碟機。 在本文將向您展示如何藉由使用適用於 .NET 的 Batch 管理程式庫,在計算節點的集區上掛接虛擬檔案系統。

將文件系統掛接至集區,可讓存取資料比要求工作從大型共用資料集取得自己的資料更容易且更有效率。 請設想有多個工作需要存取一組常用資料的情況,例如呈現一部電影。 每個工作都會從場景檔案一次呈現一個或多個畫面格數。 藉由掛接包含場景檔案的磁碟機,每個計算節點就能更輕鬆地存取共用資料。

此外,您也可以選擇基礎檔案系統,以符合效能、整個和每秒輸入/輸出作業 (IOPS) 需求。 您可以根據同時存取資料的計算節點數目,單獨調整檔案系統。

例如,您可以使用 Avere vFXT 分散式記憶體內部快取,透過數千個同時呈現節點來支援大規模的動畫呈現,以存取位於內部部署環境的來源資料。 或者,對於已位於雲端式 Blob 儲存體的資料,您可以使用 BlobFuse 來將此資料掛接為本機檔案系統。 Azure 檔案儲存體可提供類似於 BlobFuse 的工作流程,並同時適用於 Windows 和 Linux。

支援的設定

您可以掛接下列型別的檔案系統:

  • Azure 檔案
  • Azure Blob 儲存體
  • 網路檔案系統 (NFS),包括 Avere vFXT 快取
  • Common Internet File System (CIFS)

Batch 針對為其個別發行者和供應項目產生的節點代理程式,支援下列虛擬檔案系統類型。

OS 類型 Azure 檔案共用 Azure Blob 容器 NFS 掛接 CIFS 掛接
Linux ✔️ ✔️ ✔️ ✔️
Windows ✔️

注意

2019 年 8 月 8 日之前建立的 Batch 集區並不支援掛接虛擬檔案系統。

網路需求

搭配虛擬網路中的 Batch 集區使用虛擬檔案掛接時,請謹記下列需求,並確保不會封鎖任何必要的流量。 如需詳細資訊,請參閱虛擬網路中的 Batch 集區

  • Azure 檔案儲存體需要開啟 TCP 通訊埠 445,以允許 storage 服務標籤的往返流量。 如需詳細資訊,請參閱搭配 Windows 使用 Azure 檔案共用

  • Azure Blob 容器需要開啟 TCP 通訊埠 443,以允許 storage 服務標籤的往返流量。 虛擬機器 (VM) 必須具有 https://packages.microsoft.com 的存取權,以下載 blobfusegpg 套件。 根據您的設定,您可能需要其他 URL 的存取權。

  • 網路檔案系統 (NFS) 預設需要存取連接埠 2049。 您的設定可能會有其他需求。 VM 必須能夠存取適當的套件管理員,才能下載 nfs-common (for Debian 或 Ubuntu) 套件。 該 URL 可能會根據您的 OS 版本而有所不同。 根據您的設定,您可能也需要其他 URL 的存取權。

    透過 NFS 掛接 Azure Blob 或 Azure 檔案儲存體可能會有更多網路需求。 例如,您的計算節電可能需要與儲存體帳戶使用相同虛擬網路子網路。

  • 常見網際網路檔案系統 (CIFS) 需要存取 TCP 通訊埠 445。 VM 必須具有適當套件管理員的存取權,以下載 cifs-utils 套件。 該 URL 可能會根據您的 OS 版本而有所不同。

掛接組態和實作

在集區上掛接虛擬檔案系統,會讓檔案系統可供集區中的每個計算節點使用。 當計算節點加入集區、重新啟動或重新安裝映像時,就會設定檔案系統。

若要在集區上掛接檔案系統,您可以建立符合虛擬檔案系統的 MountConfiguration 物件:AzureBlobFileSystemConfigurationAzureFileShareConfigurationNfsMountConfigurationCifsMountConfiguration

所有掛接設定物件都需要下列基礎參數。 某些掛接組態具有特定檔案系統的具體參數,程式碼範例將會更詳細說明這一點。

  • 儲存體帳戶的帳戶名稱或來源

  • 相對掛接路徑或來源:要掛接於計算節點上的檔案系統所在位置 (相對於透過 AZ_BATCH_NODE_MOUNTS_DIR 來存取的標準 \fsmounts 目錄)。

    確切 \fsmounts 目錄位置會根據節點 OS 而有所不同。 例如,Ubuntu 節點上的位置會對應至 mnt\batch\tasks\fsmounts

  • 掛接選項或 BlobFuse 選項會說明用來掛接檔案系統的具體參數。

在您建立集區和 MountConfiguration 物件之後,請將該物件指派至 MountConfigurationList 屬性。 當節點加入集區、重新啟動或重新安裝映像時,就會掛接檔案系統。

Batch 代理程式會在 Windows 和 Linux 上以不同方式實作掛接。

  • 在 Linux 上,Batch 會安裝套件 cifs-utils。 然後,Batch 會發出掛接命令。

  • 在 Windows 上,Batch 會使用 cmdkey 新增您的 Batch 帳戶認證。 然後,Batch 會透過 net use 發出掛接命令。 例如:

    net use S: \\<storage-account-name>.file.core.windows.net\<fileshare> /u:AZURE\<storage-account-name> <storage-account-key>
    

掛接檔系統會建立環境變數 AZ_BATCH_NODE_MOUNTS_DIR,並指向已掛接檔系統和記錄檔的位置。 您可以使用記錄檔進行疑難排解和偵錯。

使用 PowerShell 掛接 Azure 檔案儲存體共用

您可以使用 Azure PowerShell 在 Windows 或 Linux Batch 集區上掛接 Azure 檔案儲存體共用。 下列程序會逐步引導您在 Batch 集區上設定和掛接 Azure 檔案共用檔案系統。

重要

集區上所掛接的檔案系統數目上限為 10 個。 如需詳細資訊和其他限制,請參閱 Batch 服務配額和限制

必要條件

  • 具有有效訂用帳戶的 Azure 帳戶。
  • 已安裝 Azure PowerShell 或使用 Azure Cloud Shell,並為介面選取 PowerShell
  • 現有 Batch 帳戶,並且已連結至具有檔案共用的 Azure 儲存體帳戶。
  1. 登入您的 Azure 訂用帳戶,將預留位置取代為您的訂用帳戶標別碼。

    Connect-AzAccount -Subscription "<subscription-ID>"
    
  2. 取得您的 Batch 帳戶內容。 將 <batch-account-name> 預留位置取代為您的儲存體帳戶名稱。

    $context = Get-AzBatchAccount -AccountName <batch-account-name>
    
  3. 使用下列設定建立 Batch 集區。 將 <storage-account-name><storage-account-key><file-share-name> 預留位置取代為已連結至您 Batch 帳戶中儲存體帳戶的值。 將 <pool-name> 預留位置取代為您想要使用的集區名稱。

    下列指令碼會建立具有一個 Windows Server 2016 Datacenter 的集區、Standard_D2_V2 大小節點,並且將 Azure 檔案共用掛接至節點的 S 磁碟機。

    $fileShareConfig = New-Object -TypeName "Microsoft.Azure.Commands.Batch.Models.PSAzureFileShareConfiguration" -ArgumentList @("<storage-account-name>", "https://<storage-account-name>.file.core.windows.net/batchfileshare1", "S", "<storage-account-key>")
    
    $mountConfig = New-Object -TypeName "Microsoft.Azure.Commands.Batch.Models.PSMountConfiguration" -ArgumentList @($fileShareConfig)
    
    $imageReference = New-Object -TypeName "Microsoft.Azure.Commands.Batch.Models.PSImageReference" -ArgumentList @("WindowsServer", "MicrosoftWindowsServer", "2016-Datacenter", "latest")
    
    $configuration = New-Object -TypeName "Microsoft.Azure.Commands.Batch.Models.PSVirtualMachineConfiguration" -ArgumentList @($imageReference, "batch.node.windows amd64")
    
    New-AzBatchPool -Id "<pool-name>" -VirtualMachineSize "STANDARD_D2_V2" -VirtualMachineConfiguration $configuration -TargetDedicatedComputeNodes 1 -MountConfiguration @($mountConfig) -BatchContext $context
    
  4. 連線到節點並檢查輸出檔案是否正確。

存取已掛接的檔案

Azure Batch 工作可以使用磁碟機的直接路徑來存取已掛接的檔案,例如:

cmd /c "more S:\folder1\out.txt & timeout /t 90 > NULL"

Azure Batch 代理程式只會授與 Azure Batch 工作的存取權。 如果您使用遠端桌面通訊協定 (RDP) 連線到節點,您的使用者帳戶將不會自動取得掛接磁碟機的存取權。 當您透過 RDP 連線到節點時,您必須新增儲存體帳戶的認證,才能直接存取 S 磁碟機。

使用 cmdkey 來新增認證。 將 <storage-account-name><storage-account-key> 預留位置取代為您自己的資訊。

cmdkey /add:"<storage-account-name>.file.core.windows.net" /user:"Azure\<storage-account-name>" /pass:"<storage-account-key>"

針對掛接問題進行疑難排解

如果掛接設定失敗則計算節點就會失敗,而節點狀態將會設為「無法使用」。 若要診斷掛接設定失敗,請檢查 ComputeNodeError 屬性,以取得錯誤的詳細資料。

若要取得用於偵錯的記錄檔,您可以使用 OutputFiles API 來上傳 *.log 檔案。 *.log 檔案包含 AZ_BATCH_NODE_MOUNTS_DIR 位置的檔案系統掛接相關資訊。 掛接記錄檔的格式:每個掛接為 <型別>-<掛接目錄或磁碟機>.log。 例如,在掛接目錄上名為 test 的 CIFS 掛接,其掛接記錄檔名稱會是:cifs-test.log

調查掛接錯誤

您可以透過 RDP 或 SSH 連線到節點,以檢查與檔案系統掛接相關的記錄檔。 當您嘗試將 Azure 檔案共用掛接至 Batch 節點時,可能會發生下列範例錯誤訊息:

Mount Configuration Error | An error was encountered while configuring specified mount(s)
Message: System error (out of memory, cannot fork, no more loop devices)
MountConfigurationPath: S

如果您收到此錯誤,請透過 RDP 或 SSH 連線到節點,以檢查相關記錄檔。 Batch 代理程式會在 Windows 和 Linux 上以不同方式為 Azure 檔案供用實作掛接。 在 Linux 上,Batch 會安裝套件 cifs-utils。 然後,Batch 會發出掛接命令。 在 Windows 上,Batch 會使用 cmdkey 新增您的 Batch 帳戶認證。 然後,Batch 會透過 net use 發出掛接命令。 例如:

net use S: \\<storage-account-name>.file.core.windows.net\<fileshare> /u:AZURE\<storage-account-name> <storage-account-key>
  1. 透過 RDP 連線到節點。

  2. 開啟 fshare-S.log 記錄檔,位於 D:\batch\tasks\fsmounts

  3. 檢閱錯誤訊息,例如:

    CMDKEY: Credential added successfully.
    System error 86 has occurred.
    
    The specified network password is not correct.
    
  4. 使用 Azure 檔案共用疑難排解員進行疑難排解。

如果您無法使用 RDP 或 SSH 來檢查節點上的記錄檔,您可以將記錄上傳至 Azure 儲存體帳戶。 此方法同時適用於 Windows 和 Linux 記錄。

  1. Azure 入口網站中,搜尋並選取具有您集區的 Batch 帳戶。

  2. 在 Batch 帳戶頁面上,從左側導覽中選取 [集區]

  3. 在「集區」頁面上,選取集區的名稱。

  4. 在集區的頁面上,從左側導覽中選取 [節點]

  5. 在「節點」頁面上,選取節點的名稱。

  6. 在節點的頁面上,選取 [上傳批次記錄]

  7. 在「上傳批次記錄」窗格中,選取 [挑選儲存體容器]

  8. 在「儲存體帳戶」頁面上,選取儲存體帳戶。

  9. 在「容器」頁面上,選取或建立要上傳檔案的容器,然後選取 [選取]

  10. 選取 [開始上傳]

  11. 上傳完成時,請下載檔案並開啟 agent-debug.log

  12. 檢閱錯誤訊息,例如:

    ..20210322T113107.448Z.00000000-0000-0000-0000-000000000000.ERROR.agent.mount.filesystems.basefilesystem.basefilesystem.py.run_cmd_persist_output_async.59.2912.MainThread.3580.Mount command failed with exit code: 2, output:
    
    CMDKEY: Credential added successfully.
    
    System error 86 has occurred.
    
    The specified network password is not correct.
    
  13. 使用 Azure 檔案共用疑難排解員進行疑難排解。

使用 PowerShell 手動掛接檔案共用

如果您無法診斷或修正掛接錯誤,您可以改為使用 PowerShell 手動掛接檔案共用。

  1. 建立沒有掛接設定的集區。 例如:

    $imageReference = New-Object -TypeName "Microsoft.Azure.Commands.Batch.Models.PSImageReference" -ArgumentList @("WindowsServer", "MicrosoftWindowsServer", "2016-Datacenter", "latest")
    
    $configuration = New-Object -TypeName "Microsoft.Azure.Commands.Batch.Models.PSVirtualMachineConfiguration" -ArgumentList @($imageReference, "batch.node.windows amd64")
    
    New-AzBatchPool -Id "<pool-name>" -VirtualMachineSize "STANDARD_D2_V2" -VirtualMachineConfiguration $configuration -TargetDedicatedComputeNodes 1  -BatchContext $Context
    
  2. 等候節點處於 [閒置] 狀態。

  3. Azure 入口網站中,搜尋並選取具有您檔案共用的儲存體帳戶。

  4. 在儲存體帳戶的選單上,從左側導覽選取 [檔案共用]

  5. 在「檔案共用」頁面上,選取您想要掛接的檔案共用。

  6. 在檔案共用的頁面上,選取 [連線]

  7. 在 [連線] 窗格中,選取 [Windows] 索引標籤。

  8. 針對 [磁碟機代號],輸入您想要使用的磁碟機。 預設值為 Z

  9. 針對 [驗證方法],選取您想要連線到檔案共用的方式。

  10. 選取 [顯示指令碼],然後複製PowerShell 指令碼來掛接檔案共用。

  11. 透過 RDP 連線到節點。

  12. 執行您複製的命令以掛接檔案共用。

  13. 注意輸出中的任何錯誤訊息。 使用此資訊來針對任何網路相關問題進行疑難排解。

範例掛接組態

下列程式碼範例組態會示範如何將各種檔案共用系統掛接至計算節點的集區。

Azure 檔案共用

Azure 檔案儲存體是標準的 Azure 雲端檔案系統供應項目。 下列組態會將名為 <file-share-name> 的 Azure 檔案儲存體共用掛接至 S 磁碟機。 如需範例中參數的相關資訊,請參閱在 Windows 上掛接 SMB Azure 檔案共用使用 Azure 入口網站建立 NFS Azure 檔案共用,並將其掛接在 Linux VM 上

new PoolAddParameter
{
    Id = poolId,
    MountConfiguration = new[]
    {
        new MountConfiguration
        {
            AzureFileShareConfiguration = new AzureFileShareConfiguration
            {
                AccountName = "<storage-account-name>",
                AzureFileUrl = "https://<storage-account-name>.file.core.windows.net/<file-share-name>",
                AccountKey = "<storage-account-key>",
                RelativeMountPath = "S",
                MountOptions = "-o vers=3.0,dir_mode=0777,file_mode=0777,sec=ntlmssp"
            },
        }
    }
}

Azure Blob 容器

另一個選項是透過 BlobFuse 使用 Azure Blob 儲存體。 掛接 Blob 檔案系統需要帳戶金鑰、共用存取簽章 (SAS) 金鑰,或具有儲存體帳戶存取權的受控識別。

如需取得這些金鑰或身分識別的資訊,請參閱下列文章:

下列組態會使用 BlobFuse 選項掛接 Blob 檔案系統。 為了說明目的,此範例會顯示 AccountKeySasKeyIdentityReference,但實際上您只能指定其中一個方法。

new PoolAddParameter
{
    Id = poolId,
    MountConfiguration = new[]
    {
        new MountConfiguration
        {
            AzureBlobFileSystemConfiguration = new AzureBlobFileSystemConfiguration
            {
                AccountName = "<storage-account-name>",
                ContainerName = "<container-name>",
                // Use only one of the following three lines:
                AccountKey = "<storage-account-key>",
                SasKey = "<sas-key>",
                IdentityReference = new ComputeNodeIdentityReference("/subscriptions/<subscription>/resourceGroups/<resource-group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<identity-name>"),
                RelativeMountPath = "<relative-mount-path>",
                BlobfuseOptions = "-o attr_timeout=240 -o entry_timeout=240 -o negative_timeout=120 "
            },
        }
    }
}

若要取得 BlobFuse 掛接目錄的預設存取權,請以系統管理員身分執行工作。 BlobFuse 會在使用者空間掛接目錄,並在建立集區時將目錄掛接為根目錄。 在 Linux 中,所有系統管理員工作都是根目錄。 FUSE 參考頁面將說明 FUSE 模組的所有選項。

如需使用 BlobFuse 的詳細資訊和秘訣,請參閱下列參考文章:

NFS

您可以將 NFS 共用掛接至集區節點,以允許 Batch 存取傳統檔案系統。 該設定可以是部署在雲端中的單一 NFS 伺服器,也可以是透過虛擬網路存取的內部部署 NFS 伺服器。 NFS 掛接支援 Avere vFXT,這是用於資料密集的效能運算 (HPC) 工作的分散式記憶體內部快取。 NFS 掛接也支援其他標準 NFS 相容介面,例如適用於 Azure Blob 的 NFS,以及適用於 Azure 檔案儲存體的 NFS

下列範例將顯示 NFS 檔案系統掛接的組態:

new PoolAddParameter
{
    Id = poolId,
    MountConfiguration = new[]
    {
        new MountConfiguration
        {
            NfsMountConfiguration = new NFSMountConfiguration
            {
                Source = "<source>",
                RelativeMountPath = "<relative-mount-path>",
                MountOptions = "options ver=3.0"
            },
        }
    }
}

CIFS

CIFS 掛接至集區節點,是讓您存取傳統檔案系統的另一種方式。 CIFS 是一個檔案共用通訊協定,可提供開放且跨平台的機制來要求網路伺服器檔案和服務。 CIFS 是以 SMB 通訊協定的增強版本為基礎,適用於網際網路和內部網路檔案共用。

下列範例會顯示 CIFS 檔案掛接的組態。

new PoolAddParameter
{
    Id = poolId,
    MountConfiguration = new[]
    {
        new MountConfiguration
        {
            CifsMountConfiguration = new CIFSMountConfiguration
            {
                Username = "<storage-account-name>",
                RelativeMountPath = "<relative-mount-path>",
                Source = "<source>",
                Password = "<storage-account-key>",
                MountOptions = "-o vers=3.0,dir_mode=0777,file_mode=0777,serverino,domain=<domain-name>"
            },
        }
    }
}

注意

正在尋找使用 PowerShell 而非 C# 的範例嗎? 您可以在此處找到另一個絕佳範例:將 Azure 檔案掛接至 Azure Batch 集區

下一步