本文說明在 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 磁碟控制器類型。
在 Azure 入口網站或 ARM/CLI/PowerShell 範本中選取 NVMe 磁碟控制器類型,以選擇加入 NVMe。 如需逐步指示,請參閱這裡。
僅支援 Gen2 映像。
選擇其中一個已啟用 NVMe 的 Azure 區域。 透過符合這五個條件,您就能夠在支援的 VM 系列上隨時啟用 NVMe。 使用 NVMe 建立和調整 VM 大小時,請遵循上述條件,以確保功能成功啟動。
我可以加密遠端 NVMe 磁碟嗎?
Azure 內沒有原生方式可加密這些磁碟。 歡迎在 OS 內加密它們,但在開機時掛接之後,您必須重新加密。
如何將 SCSI VM 大小調整為不同大小的遠端 NVMe 啟用 VM?
下列程式可用來:
- 將使用未標記映射所建立的 SCSI VM 調整為不同大小的 NVMe 啟用 VM,而不重新建立 VM 組態,而不標記映像。
- 將 SCSI VM 調整為不同大小的 NVMe 啟用 VM,而不需重新建立 VM 組態。 來源 VM 可以是:
- 支援 NVMe 的未標記 OS 映像
- NVMe 標記的 OS 映射 若要調整 VM 的大小:
- 將 VM 的目的地 不註冊類型 設定為 NVMe。
- 使用下列 PowerShell 腳本來執行此動作: SAP-on-Azure-Scripts-and-Utilities/NVMe-Preflight-Check at main ·Azure/SAP-on-Azure-Scripts-and-Utilities •GitHub
`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 的映像,請遵循下列步驟:
- 將 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>`
- 使用 powershell/portal/cli 建立映射庫:[https://docs.microsoft.com/azure/virtual-machines/create-gallery]
- 建立映像定義: [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`
- 使用 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 相容。 如需詳細指引,請參閱適用於 Windows 和 Linux 的 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 磁碟?
- 取得 nvme-cli 套件
`sudo apt install nvme-cli`
- 執行 NVMe list 命令以擷取 NVMe 磁碟詳細資料:
`sudo nvme list`
以下是資料如何顯示以回應 Azure PowerShell 命令:
如何識別 Windows VM 上的 NVMe 磁碟?
啟動 PowerShell 並使用下列命令:wmic diskdrive get model,scsilogicalunit
ASAP 連結磁碟會顯示在客體中的型號字串 「Virtual_Disk NVME Premium」,而 SCSI 邏輯單元將可見連接埠值 LUN 識別碼遞增 1。
以下是啟用 NVMe 的 Windows VM 中 NVMe 磁碟的顯示方式的快照集:
下列快照集顯示在連接到 LUN 0 和 LUN 4 (CRP) 的資料磁碟客體輸出中。 LUN 識別碼相當於命名空間識別碼。
是否可以將 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)