リモート NVMe ディスクに関する FAQ

この記事では、Azure で作成された仮想マシン (VM) のリモート NVM Express (NVMe) ディスクのサポートに関する一般的な質問について説明します。

VM でリモート NVMe インターフェイスを有効にするための前提条件は何ですか?

VM の構成中に DiskControllerType を使用して、NVMe または Small Computer System Interface (SCSI) を任意のコントローラー タイプとして選択できます。 DiskControllerType 値を指定しない場合、プラットフォームにより、VM サイズの構成に基づいて既定のコントローラーが自動的に選択されます。 VM サイズが既定値として SCSI 用に構成され、NVMe をサポートしている場合、DiskControllerType 値を NVMe に更新しない限り、VM は SCSI を使用します。

VM で NVMe インターフェイスを有効にするには、次の前提条件を満たす必要があります。

  • NVMe をサポートする VM ファミリを選択します。 Intel v5 世代 VM では、Ebsv5 と Ebdsv5 の VM サイズにのみ NVMe が搭載されています。

  • NVMe サポートでタグ付けされているオペレーティング システム イメージを選択します。 サポートされている VM ファミリと OS イメージの値を選択すると、NVMe ディスク コントローラーの種類を選択するように求められます。

    ディスク コントローラーの種類を選択するように求めるプロンプトのスクリーンショット。

  • Azure portal、Azure Resource Manager、Azure CLI、または Azure PowerShell テンプレートで NVMe ディスク コントローラーの種類を選択して、NVMe にオプトインします。 詳しい手順については、NVMe に関する一般的な FAQ を参照してください。

  • NVMe では第 2 世代イメージのみがサポートされているため、第 2 世代 VM を使用していることを確認してください。

  • NVMe が有効になっている Azure リージョンのいずれかを選択します。

リモート NVMe ディスクは暗号化できますか?

Azure には、これらのディスクを暗号化するネイティブな方法はありません。 これらを OS 内で暗号化することはできますが、起動時にマウントした後に再暗号化する必要があります。

SCSI ベースの VM のサイズを、異なるサイズのリモート NVMe 対応 VM にサイズ変更するにはどうすればよいですか?

次のプロセスを使用して、次のいずれかを実行できます。

  • VM 構成を再作成せず、イメージにタグ付けせずに、タグなしイメージを使用して作成された SCSI ベースの VM のサイズを別のサイズの NVMe 対応 VM にサイズ変更します。
  • VM 構成を再作成せずに、SCSI ベースの VM のサイズを異なるサイズの NVMe 対応 VM にサイズ変更します。

ソース VM は次のいずれにすることができます。

  • NVMe をサポートするタグなし OS イメージ。
  • NVMe でタグ付けされた OS イメージ。

VM のサイズを変更するには、次のコマンドを使用して、VM の対象の discontrollertype 値を NVMe として設定する Azure PowerShell スクリプト を実行します。

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 copy <local path to your VHD> <container in your storage account>
    
  2. Azure PowerShell、ポータル、または Azure CLI を使用して イメージ ギャラリーを作成します。

  3. イメージの定義を作成します--feature DiskControllerTypes=SCSI,NVMe を必ず含めてください。

    Azure 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
    
  4. NVMe がサポートする VHD を使用して、NVMe タグ付きギャラリーの下にイメージ バージョンを作成します。

    Azure 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 カスタム スクリプト拡張機能は、Azure Resource Manager のテンプレート (ARM テンプレート) と組み合わせて使用できます。 このソリューションにより、Azure 仮想マシン上でスクリプトをダウンロードおよび実行でき、Windows と Linux の両方に互換性があります。 詳細なガイダンスについては、Windows および Linux 用の Azure カスタム スクリプト拡張機能のドキュメントを参照してください。

リモート NVMe ディスクをサポートしていない別の VM ファミリを使用する必要がある場合はどうなりますか?

サポートされていない VM ファミリを選択すると、次のようなエラー メッセージが表示されます: "選択した VM サイズは、DiskControllerType では起動できません。 提供されているディスク コントローラーの種類が、VM サイズに対してサポートされているディスク コントローラーの種類の 1 つであることを確認してください。"

NVMe インターフェイスをサポートする VM ファミリを選択してください。 VM サイズでサポートされているディスク コントローラーの種類を確認するには、REST API のリソース SKU のリストを参照してください。

リモート NVMe ディスクと互換性のある Azure ディスク ストレージ オプションはどれですか?

NVMe サイズは、Azure Premium SSD v1、Premium SSD v2、Ultra Disk Storage と組み合わせることができます。 Azure ディスク オファリングの詳細については、「Azure マネージド ディスクの種類」を参照してください。

Azure では、NVMe VM サイズを使用したディスクでのライブ サイズ変更をサポートしていますか?

NVMe のライブ サイズ変更は、Azure Premium SSD v1 ディスク、Standard SSD ディスク、Standard HDD ディスクでサポートされています。 VM を再起動せずに NVMe ディスクを追加することもできます。

Linux VM 上のリモート NVMe ディスクを識別するにはどうすればよいですか?

  1. nvme-cli パッケージを入手します。

    sudo apt install nvme-cli
    
  2. NVMe list コマンドを実行して、NVMe ディスクの詳細をフェッチします。

    sudo nvme list
    

    Linux 仮想マシンで NVMe ディスクを識別する命令のスクリーンショット。

    Linux ポータルで名前空間 ID を選択する命令のスクリーンショット。

    Azure PowerShell コマンドに応答してデータがどのように表示されるかを次に示します。

    Azure PowerShell コマンドへの応答例のスクリーンショット。

Windows VM 上の NVMe ディスクを識別するにはどうすればよいですか?

Azure PowerShell を起動し、次のコマンドを実行します。

wmic diskdrive get model,scsilogicalunit

Windows で NVMe を使用する PowerShell コマンド例のスクリーンショット。

ASAP 接続ディスクが、モデル文字列 Virtual_Disk NVME Premiumと共にゲストに表示されます。 SCSI 論理ユニットには、ポータルに表示される LUN ID の値が 1 ずつインクリメントされます。

NVMe 対応 Windows VM で NVMe ディスクがどのように表示されるかのスナップショットを次に示します。

Windows VM 上の NVMe ディスクを識別する Azure PowerShell コマンドの例を示すスクリーンショット。

次のスナップショットは、LUN 0 および LUN 4 (CRP) で接続されたデータ ディスクのゲスト出力に表示されます。 LUN ID は名前空間 ID と同じです。

NVMe 対応 Windows VM での NVMe ディスクの表示例を示すスクリーンショット。

NVMe タグ付き OS イメージで同じ VM vCPU サイズを保持しながら、SCSI ベースの VM を NVMe 対応に変換できますか?

このシナリオは Linux オペレーティング システムでのみサポートされており、Windows オペレーティング システムではサポートされていません。

リモート ディスク内の共有ディスクは NVMe 対応 VM でサポートされていますか?

共有ディスク機能は、Premium SSD、Premium SSD v2、Ultra Disk Storage ディスクでサポートされています。

Azure PowerShell または Azure CLI を使用して、NVMe が有効な既存の BLOB から OS ディスク付きの VM を作成できますか?

現時点では、これはできません。 代わりに、REST API による次の回避策を使用して、NVMe が有効になっている既存の BLOB から OS ディスク付きの VM を作成できます。

$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)