この記事では、Azure で作成された仮想マシン (VM) での一時的な非揮発性メモリ Express (NVMe) ディスクのサポートに関する一般的な質問について説明します。 この記事では、"一時ディスク" という用語は、ローカル SSD で作成される一時ディスクを指しています。
VM に NVMe インターフェイスを使用する一時ディスクを作成するための前提条件は何ですか?
ローカル一時ディスクの NVMe サポートは、仮想マシン (VM) ファミリ レベルで異なります。 ローカル ディスクを備えた新しい v6 VM はすべて NVMe 一時ディスクをサポートしていますが、v5 VM 以前のバージョンでは NVMe ローカル一時ディスクがサポートされない場合があります。これらのサイズのローカル ディスクのほとんどは SCSI インターフェイス上にあります。 L シリーズなどの一部の VM ファミリでは、Lsv2 世代 VM から NVMe SSD がローカルに接続されています。 NVMe 一時ディスクがサポートされているかどうかを判断するには、VM ファミリの概要を参照してください。 また、最新の OS リリースのほとんどが既定で備えているローカル NVMe を使用するには、ゲスト OS で NVMe ドライバーのサポートが必要であることに注意してください。
Dl/D/E_v6 VM の一時 NVMe ディスクはリモート NVMe ディスクとどのように異なりますか?
主な違いは、一時 NVMe ディスクは一時的なものであり、VM 上のデータが消える可能性がありますが、リモート NVMe ディスク上のデータは残るということです。 VM のストレージ オプションを選ぶときは、この違いに留意する必要があります。
以前の D/E シリーズ VM とは異なり、新しい v6 VM には手が加えられていない未フォーマットの NVMe ディスクが付属しています。 お客様は、VM の起動後に、ディスクを初期化して好みのファイル システムにフォーマットする必要があります。
Dl/D/E v6 シリーズの VM は、VM に直接アタッチされているノードでは、以前に使われていたローカル Small Computer System Interface (SCSI) ディスクではなく、ローカル一時 NVMe ディスクを使うように最適化されています。 この方法を使用すると、1 秒あたりの入出力操作が増え、ワークロードのスループットが高くなります。
一時 NVMe ディスクを使用して VM を構成する場合、どのような変更を準備する必要がありますか?
VM の起動後にディスクを初期化してフォーマットする必要があります。 ユーザーが開始した停止、割り当て解除、計画メンテナンス、および Azure で開始された自動復旧イベントの後、VM は生の一時 NVMe ディスクのみで起動します。 NVMe ディスクが初期化され、フォーマットされるまで、一時 NVMe ディスクはアプリケーションに表示されません。
VM の起動後、必要に応じて個別の NVMe ドライブを 1 つにスパンすることができます。
Windows ページ ファイルは永続 OS ディスクに配置されますが (エフェメラル OS 機能を使用している場合を除く)、VM の起動後に必要に応じて一時 NVMe ディスクに移動できます。
エフェメラル OS 機能が使われている場合、v5 以前の VM の場合と同様に、(VM とイメージのサイズに応じて) 1 つまたは複数の NVMe ディスクが、低速の SCSI/VHD ベースのディスクに変換されます。 VM のサイズが大きい場合、残りのドライブは未フォーマットの生 NVMe のままになります。
REST API のリソースの Stock Keeping Units (SKU) の一覧には、仮想マシンのいくつかの機能が公開されています。 VM サイズの次のイテレーションでは、前の VM サイズで使われていた SCSI プロトコルではなく、より高速で効率的な NVMe プロトコルがローカル ストレージに使われます。
Azure 仮想マシンの場合、SCSI ベースのローカル ストレージは一時リソース ディスクであり、
MaxResourceVolumeMB
値がこのディスクのサイズを指定します。 これに対し、NVMeDiskSizeInMiB
の値は、NVMe ベースのローカル ストレージのサイズを指定します。
一時 NVMe ディスクに対して Azure によって提供される最小暗号化は何ですか?
Azure 仮想マシン (VM) 上のすべてのローカル NVMe ディスクでは、データ保護のために既定で組み込みの暗号化が有効になっています。 一時 NVMe ディスクは、保存データ暗号化機能をサポートしています。 一意のデータ暗号化キー (DEK) は、VM に割り当てられた一時 NVMe ディスクごとにデータを暗号化します。 キー暗号化キー (KEK) は、DEK の保護に役立ちます。 VM を削除すると、その一時 NVMe ディスク上のデータは暗号化によって消去されます。 2024 年以降に導入されるすべての v6 VM では、プラットフォーム マネージド キーを使用したハードウェア ベースの暗号化を使用して、ローカル NVMe ドライブが既定で暗号化されます。
- データは XTS-AES-256、AES-256-GCM、またはより強力な暗号を使用して暗号化されます。
- デバイスは、VM 内のディスクごとに一意のメディア暗号化キー (MEK) を生成します。
- MEK は次のとおりです。
- 生成され、デバイス ハードウェア内に完全に格納されます。
- ホスト、VM、またはオペレーターや Azure システムを含む外部コンポーネントに公開されることはありません。
- すべての暗号化および復号化操作は、MEK を使用してデバイス内で行われます。
- VM を削除すると MEK が破棄され、後でどのコンポーネントもデータにアクセスできなくなります。
保存時の拡張暗号化とは
保存時の暗号化の強化は、TCG-OPAL 標準のサポートを通じて Azure V6 シリーズおよび Lsv4 シリーズの VM で利用できるもう 1 つの保護レイヤーです。 この機能に対して何らかのアクションを実行する必要はありません。これは、これらの VM の種類の既定値です。
- PIN 値が生成され、MEK ごとに Azure インフラストラクチャによって安全に格納されます。
- PIN は、キー暗号化キー (KEK) を生成するために、ストレージ デバイス内のキー派生関数 (KDF) を介して渡されます。 PIN はプラットフォーム管理キー (PMK) として機能します。
- MEK は KEK を使用して暗号化され、ストレージ デバイス内に内部的に格納されます。
- KEK はどこにも格納されず、PIN を使用して正常に認証されると、ストレージ デバイスによって動的に生成されます。 この PIN がないと、物理的にアクセスされた場合でも、デバイスは独自に保存されているデータの暗号化を解除できません。
- ストレージ デバイスは、VM の起動時に認証され、VM が停止したときにロックされるため、VM の実行中にのみデータへのアクセスが可能になります。
一時ディスクを含む v5 以前の VM のサイズを v6 に変更するにはどうすればよいですか?
ローカル一時ディスクのない Azure VM のサイズについてのよくあるご質問を参照してください。
一時 NVMe ディスクを識別するにはどうすればよいですか?
Windows では、次のコマンドを実行できます。
Get-PhysicalDisk | where { $_.FriendlyName.contains("NVMe Direct Disk")}
Linux では、次のコマンドを実行できます。
sudo nvme id-ns /dev/nvme0n1 -b | dd bs=1 skip=384 status=none | sed 's/\x00*$//'
VM を作成するとき、Windows で一時 NVMe ディスクをどのようにフォーマットして初期化すればよいですか?
GUI または Azure PowerShell を使用できます。.
GUI(グラフィカルユーザインターフェース)
ヒント
次の GUI の例は、あくまでも説明のためのものです。 運用環境のデプロイでは、スクリプトを作成してこのワークフローを自動化することをお勧めします。
Windows ロゴ キーを押しながら R キーを押して、[ファイル名を指定して実行] ダイアログを開きます。 「diskmgmt.msc」と入力し、Enter キーを押します。
パーティション スタイル (MBR または GPT) と初期化するディスクを選んで、[OK] をクリックします。.
パーティション分割するディスクを右クリックしてから、[新しいシンプル ボリューム] を選びます。
ボリューム サイズ、ドライブ文字、ファイル システム、ボリューム ラベルなどの項目を指定するには、新しいシンプル ボリューム ウィザードに従います。 [次へ] ボタンを選択してウィザードを進めます。
パーティション分割とフォーマットを完了するには、設定を確認してから、[完了] を選択します。
この例の [新しいボリューム (E:)] と同様に、フォーマットおよび初期化された NVMe ディスクが Windows ディスク管理ツールに表示されることを確認します。
Azure PowerShell スクリプト
ヒント
次のスクリプトによって、初期化、フォーマット、ドライブ文字の割り当てが行われます。 ただし、ディスク上のすべてのデータが消去されます。 運用環境にデプロイする前に、自分の VM で十分にテストする必要があります。
# Select the raw NVMe disks to partition and format
$RawNvmeDisks = Get-PhysicalDisk -CanPool $True | where { $_.FriendlyName.contains("NVMe Direct Disk")}
# Create a pool of the existing disks
New-StoragePool -FriendlyName NVMePool -StorageSubsystemFriendlyName "Windows Storage*" -PhysicalDisks $RawNvmeDisks -ResiliencySettingNameDefault Simple
#Create a new disk, initialize, partition, and format
$Disk = New-VirtualDisk -FriendlyName NVMeTemporary -StoragePoolFriendlyName NVMePool -NumberOfColumns @($RawNvmeDisks).count -PhysicalDiskRedundancy 0 -ResiliencySettingName "Simple" -UseMaximumSize
$Disk | Initialize-Disk
#Create a partition and format. Ignore the pop-up.
New-Partition -DiskId $Disk.UniqueId -AssignDriveLetter -UseMaximumSize | Format-Volume
Linux では、一時 NVMe ディスクをどのようにフォーマットして初期化すればよいですか?
次に示すのは、Linux で一時 NVMe ディスクを初期化するスクリプトの例です。 このスクリプトは、VM 上のすべての一時 NVMe ディスクを列挙し、ディスクを 1 つの RAID 0 アレイに結合して、指定されたファイル システムのフォーマット済みパーティションを作成します。
一時 NVMe ディスクはモデル番号で区別され、ゲスト OS には Microsoft NVMe Direct Disk
と表示されます。 このスクリプトでは、nvme-cli id-ctrl
コマンドを使って、各 NVMe デバイスのモデル番号を照会しています。
スクリプトではまず、既に作成されている一時 NVMe ディスク ボリューム (filesystem
ラベルによって識別される) をチェックします。 アレイが存在しているように見える場合、スクリプトはアレイの整合性を検証し、必要に応じて初期化プロセスを繰り返します。 アレイは、次の場合に再初期化されます。
- 1 つ以上のアレイ一時ディスクがない。
- まだアレイに組み込まれていない一時ディスクがある。
- それ以外で、ディスク アレイが無効または不明な状態である。
- 関連付けられている構成ファイルが見つからないか無効である。
#!/bin/bash
# Script requirements:
# nvme-cli
# mdadm
# gdisk
readonly USAGE="Usage: $(basename "$0") <filesystem> <filesystem mount point (optional)>"
# Label used to identify the NVMe array file system and associated disks
# Can't exceed 16 characters
readonly RAID0_FILESYSTEM_LABEL="azure_nvme_temp"
# Device path used for the RAID 0 NVMe array
# Choose any unoccupied device path of format /dev/mdX (X = 0 to 99)
readonly RAID0_DEVICE_PATH="/dev/md0"
# Formatted RAID 0 partition is mounted here
readonly DEFAULT_MOUNT_POINT="/mnt/${RAID0_FILESYSTEM_LABEL}"
filesystem="$1"
if [ ! "$filesystem" ]; then
printf "No filesystem specified. Usage: $USAGE\n"
exit 1
fi
if ! [ -x "$(command -v mkfs.$filesystem)" ]; then
printf "Filesystem \"$filesystem\" not supported by mkfs\n$USAGE\n"
exit 1
fi
mount_point="$2"
if [ ! "$mount_point" ]; then
printf "No mount point specified. Using default: $DEFAULT_MOUNT_POINT\n"
mount_point=$DEFAULT_MOUNT_POINT
fi
# Make sure mdadm.conf is present
mdadm_conf_path=""
if [ -e "/etc/mdadm/mdadm.conf" ]; then
mdadm_conf_path="/etc/mdadm/mdadm.conf"
elif [ -e "/etc/mdadm.conf" ]; then
mdadm_conf_path="/etc/mdadm.conf"
else
print "Couldn't find mdadm.conf file"
exit 1
fi
# Enumerate unmounted NVMe direct disks
devices=$(lsblk -p -o NAME,TYPE,MOUNTPOINT | grep "nvme" | awk '$2 == "disk" && $3 == "" {print $1}')
nvme_direct_disks=()
for device in $devices
do
if nvme id-ctrl "$device" | grep -q "Microsoft NVMe Direct Disk"; then
nvme_direct_disks+=("$device")
fi
done
nvme_direct_disk_count=${#nvme_direct_disks[@]}
printf "Found $nvme_direct_disk_count NVMe Direct Disks\n"
# Check if there's already an NVMe Direct Disk RAID 0 disk (or remnant data)
if grep "$RAID0_FILESYSTEM_LABEL" /etc/fstab > /dev/null; then
fstab_entry_present=true
fi
if grep "$RAID0_FILESYSTEM_LABEL" $mdadm_conf_path > /dev/null; then
mdadm_conf_entry_present=true
fi
if [ -e $RAID0_DEVICE_PATH ]; then
nvme_raid0_present=true
fi
if [ "$fstab_entry_present" = true ] || [ "$mdadm_conf_entry_present" = true ] || [ "$nvme_raid0_present" = true ]; then
# Check if the RAID 0 volume and associated configurations are still intact or need to be reinitialized
#
# If reinitialization is needed, clear the old RAID 0 information and associated files
reinit_raid0=false
if [ "$fstab_entry_present" = true ] && [ "$mdadm_conf_entry_present" = true ] && [ "$nvme_raid0_present" = true ]; then
# Check RAID 0 device status
if ! mdadm --detail --test $RAID0_DEVICE_PATH &> /dev/null; then
reinit_raid0=true
# Test the NVMe direct disks for valid mdadm superblocks
else
for device in "${nvme_direct_disks[@]}"
do
if ! mdadm --examine $device &> /dev/null; then
reinit_raid0=true
break
fi
done
fi
else
reinit_raid0=true
fi
if [ "$reinit_raid0" = true ]; then
echo "Errors found in NVMe RAID 0 temp array device or configuration. Reinitializing."
# Remove the file system and partition table, and stop the RAID 0 array
if [ "$nvme_raid0_present" = true ]; then
if [ -e ${RAID0_DEVICE_PATH}p1 ]; then
umount ${RAID0_DEVICE_PATH}p1
wipefs -a -f ${RAID0_DEVICE_PATH}p1
fi
sgdisk -o $RAID0_DEVICE_PATH &> /dev/null
mdadm --stop $RAID0_DEVICE_PATH
fi
# Remove any mdadm metadata from all NVMe Direct Disks
for device in "${nvme_direct_disks[@]}"
do
printf "Clearing mdadm superblock from $device\n"
mdadm --zero-superblock $device &> /dev/null
done
# Remove any associated entries in fstab and mdadm.conf
sed -i.bak "/$RAID0_FILESYSTEM_LABEL/d" /etc/fstab
sed -i.bak "/$RAID0_FILESYSTEM_LABEL/d" $mdadm_conf_path
else
printf "Valid NVMe RAID 0 array present and no additional Direct Disks found. Skipping\n"
exit 0
fi
fi
if [ "$nvme_direct_disk_count" -eq 0 ]; then
printf "No NVMe Direct Disks found\n"
exit 1
elif [ "$nvme_direct_disk_count" -eq 1 ]; then
additional_mdadm_params="--force"
fi
# Initialize enumerated disks as RAID 0
printf "Creating RAID 0 array from:\n"
printf "${nvme_direct_disks[*]}\n\n"
if ! mdadm --create $RAID0_DEVICE_PATH --verbose $additional_mdadm_params --name=$RAID0_FILESYSTEM_LABEL --level=0 --raid-devices=$nvme_direct_disk_count ${nvme_direct_disks[*]}; then
printf "Failed to create RAID 0 array\n"
exit 1
fi
# Create a GPT partition entry
readonly GPT_PARTITION_TYPE_GUID="0FC63DAF-8483-4772-8E79-3D69D8477DE4"
printf "\nCreating GPT on $RAID0_DEVICE_PATH..\n"
sgdisk -o $RAID0_DEVICE_PATH &> /dev/null
if ! sgdisk --new 1::0 --typecode 1:$GPT_PARTITION_TYPE_GUID $RAID0_DEVICE_PATH &> /dev/null; then
printf "Failed to create partition on $RAID0_DEVICE_PATH\n"
exit 1
fi
# Format the partition
partition_path="${RAID0_DEVICE_PATH}p1"
printf "\nCreating $filesystem filesystem..\n"
if ! mkfs.$filesystem -q -L $RAID0_FILESYSTEM_LABEL $partition_path; then
printf "Failed to create $filesystem filesystem\n"
exit 1
fi
printf "The operation has completed successfully.\n"
# Add the partition to /etc/fstab
echo "LABEL=$RAID0_FILESYSTEM_LABEL $mount_point $filesystem defaults,nofail 0 0" >> /etc/fstab
# Add RAID 0 array to mdadm.conf
mdadm --detail --scan >> $mdadm_conf_path
update-initramfs -u
# Mount the partition
printf "\nMounting filesystem to $mount_point..\n"
mkdir $mount_point &> /dev/null
if ! mount -a; then
printf "Failed to automount partition\n"
exit 1
fi
printf "The operation has completed successfully.\n"
exit 0
Windows ページ ファイルを OS ディスクから一時 NVMe ディスクに移動するにはどうすればよいですか?
GUI または Azure PowerShell を使用できます。.
GUI(グラフィカルユーザインターフェース)
ヒント
次の GUI の例は、あくまでも説明のためのものです。 運用環境のデプロイでは、スクリプトを作成してこのワークフローを自動化することをお勧めします。
Windows ロゴ キーを押しながら R キーを押して、[ファイル名を指定して実行] ダイアログを開きます。 「sysdm.cpl」と入力し、Enter キーを押します。
[詳細設定] タブを選択してから、[パフォーマンス] セクションの [設定] ボタンを選択します。
[パフォーマンス オプション] ダイアログの [詳細設定] タブを選択してから、[仮想メモリ] セクションの [変更] ボタンを選択します。
[すべてのドライブのページング ファイルのサイズを自動的に管理する] チェック ボックスをオフにします。 ページ ファイルが OS ディスクに設定されている場合は、OS ディスクを選択し、[ページング ファイルなし] オプションを選択してから、[設定] ボタンを選択します。 ローカル一時 NVMe ドライブを選択し、[システム管理サイズ] オプションを選択してから、[設定] ボタンを選択します。 [OK] を選択して、すべてのダイアログを閉じます。
これらの変更を有効にするには、VM の再起動が必要になる場合があります。
Azure PowerShell スクリプト
$OsDisk = "C:"
# This value can vary, depending on which drive letter is assigned to the disk
$NVMeDisk = "E:"
# Disable automatic pagefile management
$Computer = Get-WmiObject Win32_computersystem -EnableAllPrivileges
$Computer.AutomaticManagedPagefile = $false
$Computer.Put()
# Delete the pagefile on the OS disk
$PageFile = Get-WmiObject -Query "select * from Win32_PageFileSetting where name='$OsDisk\\pagefile.sys'"
$PageFile.Delete()
# Create a new pagefile on the NVMe drive with system-managed size
Set-WMIInstance -Class Win32_PageFileSetting -Arguments @{name="$NVMeDisk\\pagefile.sys"; InitialSize=0; MaximumSize=0} -EnableAllPrivileges
これらの変更を有効にするには、VM の再起動が必要になる場合があります。
Linux スワップ ファイルを OS ディスクから一時 NVMe ディスクに移動するにはどうすればよいですか?
スワップ領域に使用する NVMe ディスクを選びます。
root@D2adsv6:/ # lsblk -p NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT /dev/nvme1n1 259:0 0 30G 0 disk ├─/dev/nvme1n1p1 259:1 0 29.9G 0 part / └─/dev/nvme1n1p15 259:3 0 106M 0 part /boot/efi /dev/nvme0n1 259:4 0 75G 0 disk
ディスクにスワップ領域を作成します。
root@D2adsv6:/ # mkswap /dev/nvme0n1 Setting up swapspace version 1, size = 75 GiB (80530632704 bytes) no label, UUID=064bdcfb-86ae-49f3-bf9d-b956493e2a1d
スワップ領域を有効にします。
root@D2adsv6:/ # swapon /dev/nvme0n1
スワップ領域が正しく設定されていることを確認します。
root@D2adsv6:/ # swapon -s Filename Type Size Used Priority /dev/nvme0n1 partition 78643196 0 -2
/etc/fstab
にスワップ領域を追加して、再起動が行われても維持されるようにします。root@D2adsv6:/ # echo '/dev/nvme0n1 swap swap defaults 0 0' >> /etc/fstab
メンテナンス イベント、VM の再デプロイ、VM の再起動に関して、どのような考慮事項に注意する必要がありますか?
V6 VM にアタッチされている一時 NVMe ディスクはエフェメラルであり、他の VM シリーズでの一時ドライブと同様です。 つまり、再デプロイの後、またはメンテナンス イベントの間に、VM 上のすべてのデータが失われます。 メンテナンス イベントとダウンタイムの詳細については、「VM の再起動について - メンテナンスとダウンタイム」を参照してください。
VM が新しいハードウェアに移動した場合、これらのドライブはマウント解除され、新しくマウント解除されたディスクがオペレーティング システムに表示されます。 VM でハードウェアが変更されていない場合、一時 NVMe ディスクがまだ存在する可能性があります。 ドライブをマウントするための上記のスクリプトでは、マウントを試みる前に、マウントされていないドライブがチェックされます。
VM が起動するたびにマウント スクリプトを自動的に実行し、マウント スクリプトの実行が完了するまで、ドライブを必要とする他のブート スクリプトを遅延するのが、ベスト プラクティスです。