編輯

共用方式為


NVMe - 遠端 NVMe 磁碟常見問題

本文說明在 Azure 中建立之虛擬機上支持遠端 NVMe 磁碟的一些常見問題。

在 VM 上啟用遠端 NVMe 介面的必要條件為何?

已將一項功能新增至 VM 設定,稱為 DiskControllerType,可讓客戶選取其慣用的控制器類型作為 NVMe 或 SCSI。 如果客戶未指定 DiskControllerType 值,則平臺會自動根據 VM 大小設定選擇預設控制器。 如果 VM 大小設定為 SCSI 做為預設值並支援 NVMe,除非更新為 NVMe DiskControllerType,否則將會使用 SCSI。 若要啟用 NVMe 介面,必須符合下列必要條件:

  • 選擇支援 NVMe 的 VM 系列。
  • 選取標記 NVMe 支援的作業系統映像。
  • 在 Azure 入口網站或 ARM/CLI/PowerShell 範本中選取 NVMe 磁碟控制器類型,以選擇加入 NVMe。 如需逐步指示,請參閱這裡
  • 僅支援 Gen2 映像。 透過符合上述四個條件,您將能夠在支援的 VM 系列上隨時啟用 NVMe。 請遵循上述條件,使用 NVMe 成功建立或調整 VM 大小,就不會有任何複雜問題。

如何? 在 VM 系列上啟用遠端 NVMe 磁碟嗎?

若要啟用遠端磁碟的 NVMe,請確定符合下列五個條件:

  • 選擇支援 NVMe 的 VM 系列。 需要注意的是,在 Intel v5 世代 VM 中,只有 Ebsv5 和 Ebdsv5 VM 大小配備了 NVMe。 請務必選取其中一個系列,Ebsv5 或 Ebdsv5 VM。

  • 選取標記 NVMe 支援的作業系統映像。 選取支援的 VM 系列和 OS 映像之後,系統會提示您選取 NVMe 磁碟控制器類型。

    提示選取 NVMe 磁碟控制器類型的螢幕快照。

  • 在 Azure 入口網站或 ARM/CLI/PowerShell 範本中選取 NVMe 磁碟控制器類型,以選擇加入 NVMe。 如需逐步指示,請參閱這裡

  • 僅支援 Gen2 映像。

  • 選擇其中一個已啟用 NVMe 的 Azure 區域。 透過符合這五個條件,您就能夠在支援的 VM 系列上隨時啟用 NVMe。 使用 NVMe 建立和調整 VM 大小時,請遵循上述條件,以確保功能成功啟動。

我可以加密遠端 NVMe 磁碟嗎?

Azure 內沒有原生方式可加密這些磁碟。 歡迎在 OS 內加密它們,但在開機時掛接之後,您必須重新加密。

如何將 SCSI VM 大小調整為不同大小的遠端 NVMe 啟用 VM?

下列程式可用來:

`azure-nvme-VM-update.ps1 [-subscription_id] <String> [-resource_group_name] <String> [-vm_name] <String> [[-disk_controller_change_to] <String>] [-vm_size_change_to] <String> [[-start_vm_after_update] <Boolean>] [[-write_logfile] <Boolean>]`

如何檢查指定的映像是否已標記為 NVMe?

若要檢查指定的映像是否已標記為 NVMe,請使用下列命令:

az vm image show --urn URN_OF_IMAGE

如何?標記支援 NVMe 的遠端磁碟映像?

若要標記支援 NVMe 的映像,請遵循下列步驟:

  1. 將 NVMe 支援的 vhd 上傳至您的記憶體帳戶。 AzCopy 是一種快速的方式,但您也可以使用入口網站來上傳。
  • AzCopy 參考: [https://docs.microsoft.com/azure/storage/common/storage-use-azcopy-v10]
`azcopy copy <local path to your vhd> <container in your storage account>`
  1. 使用 powershell/portal/cli 建立映射庫:[https://docs.microsoft.com/azure/virtual-machines/create-gallery]
  2. 建立映像定義: [https://docs.microsoft.com/azure/virtual-machines/image-version] 請務必包含 --feature DiskControllerTypes=SCSI,NVMe

CLI 範例:

`az sig image-definition create --resource-group <resourceGroupName> --gallery-name <galleryName> --gallery-image-definition <imageName> --publisher <publisher> --offer <offerName> --sku <skuName> --os-type <osType> --os-state <osState> --feature DiskControllerTypes=SCSI,NVMe`
  1. 使用 NVMe 支援的 vhd,在 NVMe 標記資源庫下建立映射版本: [https://docs.microsoft.com/azure/virtual-machines/image-version]

CLI 範例:

`az sig image-version create --resource-group <resourceGroupName> --gallery-name <galleryName> --gallery-image-definition <imageName> --gallery-image-version <version> --target-regions <region1> <region2> --replica-count <replicaCount> --os-vhd-uri <NVMe-supported vhd uri> --os-vhd-storage-account <storageAccount>`

如何? 設定初始 VM 啟動的 ARM 範本嗎?

您可以搭配 Azure Resource Manager 範本使用 Azure 自定義腳本擴充功能。 這可讓您在 Azure 虛擬機上下載和執行腳本,並與 Windows 和 Linux 相容。 如需詳細指引,請參閱適用於 WindowsLinux 的 Azure 自定義腳本擴充功能檔。 您可以在這裡找到 Windows 的範例。

如果我想要使用另一個不支持遠端 NVMe 磁碟的 VM 系列,會發生什麼事?

如果您選取不支援的 VM 系列,您會收到錯誤訊息,指出:「選取的 VM 大小無法使用 DiskControllerType 開機。 檢查提供的磁碟控制器類型是否為 VM 大小的其中一個支援的磁碟控制器類型 Y 請查詢https://docs.microsoft.com/rest/api/compute/resource-skus/list [] 的 SKU API,以判斷 VM 大小資源 SKU - 列表 - REST API (Azure Compute)的支援磁碟控制器類型。 因此,請務必選取支援 NVMe 介面的 VM 系列。

哪些 Azure 磁碟記憶體選項與遠端 NVMe 磁碟相容?

NVMe 大小可以與進階 SSD v1、進階 SSD v2 和 Ultra 磁碟結合。 如需 Azure 磁碟供應專案的其他資訊,請參閱 Azure 受控磁碟

Azure 是否支援使用 NVMe VM 大小的磁碟即時重設大小?

#DF67E21B11B9440FEBA2BB29D37480C10 SSD v1 磁碟、標準 SSD 和標準 HDD 磁碟支援 NVMe 的即時重設大小。 您也可以新增 NVMe 磁碟,而不重新啟動 VM。 此外,#DC6E24CF037A54805885C0A48F63F0400 SSD v1、標準 SSD 和標準 HDD 磁碟也支援即時重設大小。

如何識別Linux VM上的遠端 NVMe 磁碟?

  1. 取得 nvme-cli 套件
`sudo apt install nvme-cli`
  1. 執行 NVMe list 命令以擷取 NVMe 磁碟詳細資料:
`sudo nvme list`

在Linux VM上識別NVMe磁碟的指示螢幕快照。

在Linux入口網站中選擇命名空間標識碼的指示螢幕快照。

以下是資料如何顯示以回應 Azure PowerShell 命令:

Azure PowerShell 命令回應範例的螢幕快照。

如何識別 Windows VM 上的 NVMe 磁碟?

啟動 PowerShell 並使用下列命令:wmic diskdrive get model,scsilogicalunit

在 Windows 上啟動 NVMe 之 Powershell 命令範例範例的螢幕快照。

ASAP 連結磁碟會顯示在客體中的型號字串 「Virtual_Disk NVME Premium」,而 SCSI 邏輯單元將可見連接埠值 LUN 識別碼遞增 1。 
以下是啟用 NVMe 的 Windows VM 中 NVMe 磁碟的顯示方式的快照集:

此圖顯示PowerShell命令範例,以識別 Windows VM 上的 NVMe 磁碟。

下列快照集顯示在連接到 LUN 0 和 LUN 4 (CRP) 的資料磁碟客體輸出中。 LUN 識別碼相當於命名空間識別碼。

此圖顯示 NVMe 磁碟在已啟用 NVMe 的 Windows VM 中如何看見的範例。

是否可以將 SCSI VM 轉換為啟用 NVMe,同時保留相同的 VM vCPU 大小與 NVMe 標記的 OS 映像?

此案例僅受Linux作業系統支援,Windows 作業系統不支援。

NVMe VM 是否支援遠端磁碟的共用磁碟?

進階版 SSD、進階版 SSD v2 和 Ultra 的磁碟支援共用磁碟功能。

我可以使用 Azure PowerShell / CLI 從已啟用 NVMe 的現有 BLOB 建立具有 OS 磁碟的 VM 嗎?

目前不可能。 不過,您可以改用以 REST API 為基礎的下列因應措施:

# This is the workaround using REST-API
# to create a VM with an OS disk from an existing BLOB with NVMe enabled 

$subscriptionID = '<Your Subscription ID>'
$resourceGroupName = '<Your Resource Group Name>'
$storageAccountName = '<Your Account Name>'
$storageAccountContainer = '<Your Account Container>'
$blobName = 'blob-nvme_OsDisk_1.vhd'

$diskName = 'test'
$diskSkuName = 'Standard_LRS'
$diskSizeGB = 30
$osType = 'Linux' 
$hyperVGeneration = 'V2'
$location = 'eastus'

$azContext = Get-AzContext
$azProfile = [Microsoft.Azure.Commands.Common.Authentication.Abstractions.AzureRmProfileProvider]::Instance.Profile
$profileClient = New-Object -TypeName Microsoft.Azure.Commands.ResourceManager.Common.RMProfileClient -ArgumentList ($azProfile)
$token = ($profileClient.AcquireAccessToken($azContext.Subscription.TenantId)).AccessToken

$body = @{
    location = $location
    sku = @{ name = $diskSkuName }
    properties = @{
        osType                  = $osType
        hyperVGeneration        = $hyperVGeneration
        supportedCapabilities   = @{diskControllerTypes = 'SCSI, NVMe'}
        diskSizeGB              = $diskSizeGB
        creationData = @{
            storageAccountId	= "/subscriptions/$subscriptionID/resourceGroups/$resourceGroupName/providers/Microsoft.Storage/storageAccounts/$storageAccountName"

            sourceUri           = "https://$storageAccountName.blob.core.windows.net/$storageAccountContainer/$blobName"
            createOption		= 'Import'
        }
    }
}

$apiVersion='2023-10-02'
$restUri = "https://management.azure.com/subscriptions/$subscriptionID/resourceGroups/$resourceGroupName/providers/Microsoft.Compute/disks/$diskName`?api-version=$apiVersion"
$authHeader = @{
    'Content-Type'='application/json'
    'Authorization'='Bearer ' + $token
}

Invoke-RestMethod `
    -Uri $restUri `
    -Method 'Put' `
    -Headers $authHeader `
    -Body ($body | ConvertTo-Json)