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

警告

這篇文章參考 CentOS,這是接近生命週期結束 (EOL) 狀態的 Linux 發行版本。 請據以考慮您的使用方式和規劃。 如需詳細資訊,請參閱 CentOS 生命週期結束指引

Azure Batch 支援在 Batch 集區中的 Windows 或 Linux 計算節點上掛接雲端記憶體或外部文件系統。 當計算節點加入集區時,虛擬文件系統會掛接並做為該節點上的本機磁碟驅動器。 本文說明如何使用適用於 .NETBatch 管理連結庫,在計算節點集區上掛接虛擬文件系統。

將文件系統掛接至集區可讓存取數據比要求工作從大型共用數據集取得自己的數據更容易且更有效率。 假設有多個工作需要存取一組常見的數據,例如轉譯電影。 每個工作都會一次從場景檔案轉譯一或多個畫面格。 藉由掛接包含場景檔案的磁碟驅動器,每個計算節點都能更輕鬆地存取共享數據。

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

例如,您可以使用 Avere vFXT 分散式記憶體內部快取來支援具有數千個並行轉譯節點存取內部部署源數據的大型電影規模轉譯。 或者,對於已經在雲端式 Blob 記憶體中的數據,您可以使用 BlobFuse 將數據掛接為本機文件系統。 Azure 檔案儲存體 提供與 BlobFuse 類似的工作流程,而且可在 Windows 和 Linux 上使用。

支援的設定

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

  • Azure 檔案儲存體
  • Azure Blob 儲存體
  • 網路文件系統 (NFS),包括 Avere vFXT 快取
  • 通用因特網檔案系統 (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 [Debian 或 Ubuntu] 或 nfs-utils [CentOS] 套件。 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。 在 CentOS 節點上,位置會對應至 mnt\resources\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 作為介面。
  • 具有具有檔案共享之連結 Azure 儲存體 帳戶的現有 Batch 帳戶。
  1. 登入您的 Azure 訂用帳戶,將佔位元元取代為您的訂用帳戶標識碼。

    Connect-AzAccount -Subscription "<subscription-ID>"
    
  2. 取得 Batch 帳戶的內容。 將 <batch-account-name> 佔位元取代為您的 Batch 帳戶名稱。

    $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文件系統掛接的相關信息。 掛接記錄檔的格式為:<type-mountDirOrDrive>><.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 代理程式會在適用於 Azure 檔案共用的 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>
  1. 連線 透過 RDP 連線到節點。

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

  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 檔案共用或建立 NFS Azure 檔案共用,並使用 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 集區

下一步