將磁碟映射至 Windows 執行個體上的磁碟區 - Amazon Elastic Compute Cloud

將磁碟映射至 Windows 執行個體上的磁碟區

Windows 執行個體隨附 EBS 磁碟區,此磁碟區可做為根磁碟區使用。如果 Windows 執行個體使用 AWS PV 或 Citrix PV 驅動程式,您可以選擇性地新增最多 25 個磁碟區,變成總共 26 個磁碟區。如需詳細資訊,請參閱 執行個體磁碟區限制

取決於執行個體的類型,執行個體將可使用 0 到 24 個可能的執行個體存放磁碟區。若要使用執行個體可用的任何執行個體存放磁碟區,您必須在建立 AMI 或啟動執行個體時指定這些磁碟區。您也可以在建立 AMI 或啟動執行個體時新增 EBS 磁碟區,或是在執行個體執行時連結這些磁碟區。如需詳細資訊,請參閱 使 Amazon EBS 磁碟區可在 Windows 上使用

將磁碟區新增到執行個體時,您會指定 Amazon EC2 所使用的裝置名稱。如需詳細資訊,請參閱 Windows 執行個體上的設備名稱。AWSWindows Amazon Machine Image (AMI) 包含一組 Amazon EC2 會使用的驅動程式,可用來將執行個體存放區和 EBS 磁碟區對應到 Windows 磁碟和磁碟編號。如果從使用 AWS PV 或 Citrix PV 驅動程式的 Windows AMI 啟動執行個體,您可以利用本頁面中所說明的關係,來將 Windows 磁碟對應到執行個體存放區和 EBS 磁碟區。如果 Windows AMI 使用 Red Hat PV 驅動程式,您可以更新執行個體來使用 Citrix 驅動程式。如需詳細資訊,請參閱 升級 Windows 執行個體上的 PV 驅動程式

列出 NVMe 磁碟區

您可以使用磁碟管理公用程式或 Powershell,來搜尋 Windows 執行個體上的磁碟。

使用磁碟管理列出 NVMe 磁碟

您可以使用磁碟管理公用程式,來搜尋 Windows 執行個體上的磁碟。

搜尋 Windows 執行個體上的磁碟

  1. 使用遠端桌面登入 Windows 執行個體。如需詳細資訊,請參閱 連接至 Windows 執行個體

  2. 啟動磁碟管理公用程式。

  3. 檢閱磁碟。根磁碟區是掛載為 C:\ 的 EBS 磁碟區。如果沒有顯示其他的磁碟,表示當您建立 AMI 或啟動執行個體時,並未指定其他的磁碟區。

    下列範例顯示當您啟動具有兩個額外 EBS 磁碟區的 r5d.4xlarge 執行個體時,可以使用的磁碟。

    
                            磁碟管理,包含根磁碟區、兩個執行個體存放區磁碟區和兩個 EBS 磁碟區。

使用 PowerShell 列出 NVMe 磁碟

下列的 PowerShell 指令碼,會列出每個磁碟及其對應的裝置名稱和磁碟區。此指令碼適用於在使用 NVMe EBS 和執行個體存放區磁碟區的 Nitro 系統上所構建的實例一起使用。

連線到您的 Windows 執行個體並執行下列命令,讓 PowerShell 指令碼可執行。

Set-ExecutionPolicy RemoteSigned

複製下列指令碼,並在您的 Windows 執行個體上將其儲存為 mapping.ps1

# List the disks for NVMe volumes function Get-EC2InstanceMetadata { param([string]$Path) (Invoke-WebRequest -Uri "http://169.254.169.254/latest/$Path").Content } function GetEBSVolumeId { param($Path) $SerialNumber = (Get-Disk -Path $Path).SerialNumber if($SerialNumber -clike 'vol*'){ $EbsVolumeId = $SerialNumber.Substring(0,20).Replace("vol","vol-") } else { $EbsVolumeId = $SerialNumber.Substring(0,20).Replace("AWS","AWS-") } return $EbsVolumeId } function GetDeviceName{ param($EbsVolumeId) if($EbsVolumeId -clike 'vol*'){ $Device = ((Get-EC2Volume -VolumeId $EbsVolumeId ).Attachment).Device $VolumeName = "" } else { $Device = "Ephemeral" $VolumeName = "Temporary Storage" } Return $Device,$VolumeName } function GetDriveLetter{ param($Path) $DiskNumber = (Get-Disk -Path $Path).Number if($DiskNumber -eq 0){ $VirtualDevice = "root" $DriveLetter = "C" $PartitionNumber = (Get-Partition -DriveLetter C).PartitionNumber } else { $VirtualDevice = "N/A" $DriveLetter = (Get-Partition -DiskNumber $DiskNumber).DriveLetter if(!$DriveLetter) { $DriveLetter = ((Get-Partition -DiskId $Path).AccessPaths).Split(",")[0] } $PartitionNumber = (Get-Partition -DiskId $Path).PartitionNumber } return $DriveLetter,$VirtualDevice,$PartitionNumber } $Report = @() foreach($Path in (Get-Disk).Path) { $Disk_ID = ( Get-Partition -DiskId $Path).DiskId $Disk = ( Get-Disk -Path $Path).Number $EbsVolumeId = GetEBSVolumeId($Path) $Size =(Get-Disk -Path $Path).Size $DriveLetter,$VirtualDevice, $Partition = (GetDriveLetter($Path)) $Device,$VolumeName = GetDeviceName($EbsVolumeId) $Disk = New-Object PSObject -Property @{ Disk = $Disk Partitions = $Partition DriveLetter = $DriveLetter EbsVolumeId = $EbsVolumeId Device = $Device VirtualDevice = $VirtualDevice VolumeName= $VolumeName } $Report += $Disk } $Report | Sort-Object Disk | Format-Table -AutoSize -Property Disk, Partitions, DriveLetter, EbsVolumeId, Device, VirtualDevice, VolumeName

執行指令碼,如下所示:

PS C:\> .\mapping.ps1

以下是具有根磁碟區、兩個 EBS 磁碟區和兩個執行個體存放區磁碟區之執行個體的範例輸出。

Disk Partitions DriveLetter EbsVolumeId Device VirtualDevice VolumeName ---- ---------- ----------- ----------- ------ ------------- ---------- 0 1 C vol-03683f1d861744bc7 /dev/sda1 root 1 1 D vol-082b07051043174b9 xvdb N/A 2 1 E vol-0a4064b39e5f534a2 xvdc N/A 3 1 F AWS-6AAD8C2AEEE1193F0 Ephemeral N/A Temporary Storage 4 1 G AWS-13E7299C2BD031A28 Ephemeral N/A Temporary Storage

如果您未在 Windows 執行個體上提供登入資料,則指令碼無法取得 EBS 磁碟區 ID,並會在 EbsVolumeId 欄中使用 N/A。

映射 NVMe EBS 磁碟區

對於建置在 Nitro 系統上的執行個體,EBS 磁碟區會公開為 NVMe 裝置。您可以使用 Get-Disk 命令,將 Windows 磁碟編號映射到 EBS 磁碟區 ID。如需詳細資訊,請參閱 識別 EBS 裝置

PS C:\> Get-Disk Number Friendly Name Serial Number HealthStatus OperationalStatus Total Size Partition Style ------ ------------- ------------- ------------ ----------------- ---------- ---------- 3 NVMe Amazo... AWS6AAD8C2AEEE1193F0_00000001. Healthy Online 279.4 GB MBR 4 NVMe Amazo... AWS13E7299C2BD031A28_00000001. Healthy Online 279.4 GB MBR 2 NVMe Amazo... vol0a4064b39e5f534a2_00000001. Healthy Online 8 GB MBR 0 NVMe Amazo... vol03683f1d861744bc7_00000001. Healthy Online 30 GB MBR 1 NVMe Amazo... vol082b07051043174b9_00000001. Healthy Online 8 GB MBR

您也可以執行 ebsnvme-id 命令,將 NVMe 磁碟編號映射至 EBS 磁碟區 ID 和裝置名稱。

PS C:\> C:\PROGRAMDATA\Amazon\Tools\ebsnvme-id.exe Disk Number: 0 Volume ID: vol-03683f1d861744bc7 Device Name: sda1 Disk Number: 1 Volume ID: vol-082b07051043174b9 Device Name: xvdb Disk Number: 2 Volume ID: vol-0a4064b39e5f534a2 Device Name: xvdc

列出磁碟區

您可以使用磁碟管理公用程式或 Powershell,來搜尋 Windows 執行個體上的磁碟。

使用磁碟管理列出磁碟

您可以使用磁碟管理公用程式,來搜尋 Windows 執行個體上的磁碟。

搜尋 Windows 執行個體上的磁碟

  1. 使用遠端桌面登入 Windows 執行個體。如需詳細資訊,請參閱 連接至 Windows 執行個體

  2. 啟動磁碟管理公用程式。

    在 Windows Server 2012 和更新版本中,在工作列的 Windows 標誌上按一下滑鼠右鍵,然後選擇 Disk Management (磁碟管理)。在 Windows Server 2008 上,依序選擇 Start (開始)Administrative Tools (管理工具)Computer Management (電腦管理)Disk Management (磁碟管理)

  3. 檢閱磁碟。根磁碟區是掛載為 C:\ 的 EBS 磁碟區。如果沒有顯示其他的磁碟,表示當您建立 AMI 或啟動執行個體時,並未指定其他的磁碟區。

    下列的範例,會顯示當您使用執行個體存放磁碟區 (磁碟 2) 和其他的 EBS 磁碟區 (磁碟 1) 來啟動 m3.medium 執行個體時,可以使用的磁碟。

    
                            磁碟管理,包含根磁碟區、一個執行個體存放磁碟區和一個 EBS 磁碟區。
  4. 在以灰色窗格標示的磁碟 1 上,按一下滑鼠右鍵,然後選擇 Properties (屬性)。記下 Location (位置) 的值,然後在將磁碟裝置映射至裝置名稱的表格中查閱。例如,下列磁碟的位置為匯流排編號 0,目標 Id 9,LUN 0。根據 EBS 磁碟區的對應表,此位置的裝置名稱為 xvdj

    
                            EBS 磁碟區的位置。

將磁碟裝置映射至裝置名稱

執行個體的區塊型儲存設備驅動程式,會在掛載磁碟區時指派實際的磁碟區名稱。

執行個體存放區磁碟區

下表說明 Citrix PV 和 AWS PV 驅動程式如何將非 NVMe 執行個體存放區對應到 Windows 磁碟區。可用執行個體存放磁碟區的數量,會取決於執行個體的類型。如需詳細資訊,請參閱 執行個體存放區磁碟區

位置 裝置名稱

匯流排編號 0,目標 ID 78,LUN 0

xvdca

匯流排編號 0,目標 ID 79,LUN 0

xvdcb

匯流排編號 0,目標 ID 80,LUN 0

xvdcc

匯流排編號 0,目標 ID 81,LUN 0

xvdcd

匯流排編號 0,目標 ID 82,LUN 0

xvdce

匯流排編號 0,目標 ID 83,LUN 0

xvdcf

匯流排編號 0,目標 ID 84,LUN 0

xvdcg

匯流排編號 0,目標 ID 85,LUN 0

xvdch

匯流排編號 0,目標 ID 86,LUN 0

xvdci

匯流排編號 0,目標 ID 87,LUN 0

xvdcj

匯流排編號 0,目標 ID 88,LUN 0

xvdck

匯流排編號 0,目標 ID 89,LUN 0

xvdcl

EBS 磁碟區

下表說明 Citrix PV 和 AWS PV 驅動程式如何將非 NVME EBS 磁碟區對應到 Windows 磁碟區。

位置 裝置名稱

匯流排編號 0,目標 ID 0,LUN 0

/dev/sda1

匯流排編號 0,目標 ID 1,LUN 0

xvdb

匯流排編號 0,目標 ID 2,LUN 0

xvdc

匯流排編號 0,目標 ID 3,LUN 0

xvdd

匯流排編號 0,目標 ID 4,LUN 0

xvde

匯流排編號 0,目標 ID 5,LUN 0

xvdf

匯流排編號 0,目標 ID 6,LUN 0

xvdg

匯流排編號 0,目標 ID 7,LUN 0

xvdh

匯流排編號 0,目標 ID 8,LUN 0

xvdi

匯流排編號 0,目標 ID 9,LUN 0

xvdj

匯流排編號 0,目標 ID 10,LUN 0

xvdk

匯流排編號 0,目標 ID 11,LUN 0

xvdl

匯流排編號 0,目標 ID 12,LUN 0

xvdm

匯流排編號 0,目標 ID 13,LUN 0

xvdn

匯流排編號 0,目標 ID 14,LUN 0

xvdo

匯流排編號 0,目標 ID 15,LUN 0

xvdp

匯流排編號 0,目標 ID 16,LUN 0

xvdq

匯流排編號 0,目標 ID 17,LUN 0

xvdr

匯流排編號 0,目標 ID 18,LUN 0

xvds

匯流排編號 0,目標 ID 19,LUN 0

xvdt

匯流排編號 0,目標 ID 20,LUN 0

xvdu

匯流排編號 0,目標 ID 21,LUN 0

xvdv

匯流排編號 0,目標 ID 22,LUN 0

xvdw

匯流排編號 0,目標 ID 23,LUN 0

xvdx

匯流排編號 0,目標 ID 24,LUN 0

xvdy

匯流排編號 0,目標 ID 25,LUN 0

xvdz

使用 PowerShell 列出磁碟

下列的 PowerShell 指令碼,會列出每個磁碟及其對應的裝置名稱和磁碟區。

要求與限制

  • 需要 Windows Server 2012 或更新版本。

  • 需要登入資料才能取得 EBS 磁碟區 ID。您可以使用 Tools for PowerShell 或將 IAM 角色連接到執行個體來設定描述檔。

  • 不支援 NVMe 磁碟區。

  • 不支援動態磁碟。

連線到您的 Windows 執行個體並執行下列命令,讓 PowerShell 指令碼可執行。

Set-ExecutionPolicy RemoteSigned

複製下列指令碼,並在您的 Windows 執行個體上將其儲存為 mapping.ps1

# List the disks function Convert-SCSITargetIdToDeviceName { param([int]$SCSITargetId) If ($SCSITargetId -eq 0) { return "sda1" } $deviceName = "xvd" If ($SCSITargetId -gt 25) { $deviceName += [char](0x60 + [int]($SCSITargetId / 26)) } $deviceName += [char](0x61 + $SCSITargetId % 26) return $deviceName } [string[]]$array1 = @() [string[]]$array2 = @() [string[]]$array3 = @() [string[]]$array4 = @() Get-WmiObject Win32_Volume | Select-Object Name, DeviceID | ForEach-Object { $array1 += $_.Name $array2 += $_.DeviceID } $i = 0 While ($i -ne ($array2.Count)) { $array3 += ((Get-Volume -Path $array2[$i] | Get-Partition | Get-Disk).SerialNumber) -replace "_[^ ]*$" -replace "vol", "vol-" $array4 += ((Get-Volume -Path $array2[$i] | Get-Partition | Get-Disk).FriendlyName) $i ++ } [array[]]$array = $array1, $array2, $array3, $array4 Try { $InstanceId = Get-EC2InstanceMetadata -Category "InstanceId" $Region = Get-EC2InstanceMetadata -Category "Region" | Select-Object -ExpandProperty SystemName } Catch { Write-Host "Could not access the instance Metadata using AWS Get-EC2InstanceMetadata CMDLet. Verify you have AWSPowershell SDK version '3.1.73.0' or greater installed and Metadata is enabled for this instance." -ForegroundColor Yellow } Try { $BlockDeviceMappings = (Get-EC2Instance -Region $Region -Instance $InstanceId).Instances.BlockDeviceMappings $VirtualDeviceMap = (Get-EC2InstanceMetadata -Category "BlockDeviceMapping").GetEnumerator() | Where-Object { $_.Key -ne "ami" } } Catch { Write-Host "Could not access the AWS API, therefore, VolumeId is not available. Verify that you provided your access keys or assigned an IAM role with adequate permissions." -ForegroundColor Yellow } Get-disk | ForEach-Object { $DriveLetter = $null $VolumeName = $null $VirtualDevice = $null $DeviceName = $_.FriendlyName $DiskDrive = $_ $Disk = $_.Number $Partitions = $_.NumberOfPartitions $EbsVolumeID = $_.SerialNumber -replace "_[^ ]*$" -replace "vol", "vol-" if ($Partitions -ge 1) { $PartitionsData = Get-Partition -DiskId $_.Path $DriveLetter = $PartitionsData.DriveLetter | Where-object { $_ -notin @("", $null) } $VolumeName = (Get-PSDrive | Where-Object { $_.Name -in @($DriveLetter) }).Description | Where-object { $_ -notin @("", $null) } } If ($DiskDrive.path -like "*PROD_PVDISK*") { $BlockDeviceName = Convert-SCSITargetIdToDeviceName((Get-WmiObject -Class Win32_Diskdrive | Where-Object { $_.DeviceID -eq ("\\.\PHYSICALDRIVE" + $DiskDrive.Number) }).SCSITargetId) $BlockDeviceName = "/dev/" + $BlockDeviceName $BlockDevice = $BlockDeviceMappings | Where-Object { $BlockDeviceName -like "*" + $_.DeviceName + "*" } $EbsVolumeID = $BlockDevice.Ebs.VolumeId $VirtualDevice = ($VirtualDeviceMap.GetEnumerator() | Where-Object { $_.Value -eq $BlockDeviceName }).Key | Select-Object -First 1 } ElseIf ($DiskDrive.path -like "*PROD_AMAZON_EC2_NVME*") { $BlockDeviceName = (Get-EC2InstanceMetadata -Category "BlockDeviceMapping").ephemeral((Get-WmiObject -Class Win32_Diskdrive | Where-Object { $_.DeviceID -eq ("\\.\PHYSICALDRIVE" + $DiskDrive.Number) }).SCSIPort - 2) $BlockDevice = $null $VirtualDevice = ($VirtualDeviceMap.GetEnumerator() | Where-Object { $_.Value -eq $BlockDeviceName }).Key | Select-Object -First 1 } ElseIf ($DiskDrive.path -like "*PROD_AMAZON*") { if ($DriveLetter -match '[^a-zA-Z0-9]') { $i = 0 While ($i -ne ($array3.Count)) { if ($array[2][$i] -eq $EbsVolumeID) { $DriveLetter = $array[0][$i] $DeviceName = $array[3][$i] } $i ++ } } $BlockDevice = "" $BlockDeviceName = ($BlockDeviceMappings | Where-Object { $_.ebs.VolumeId -eq $EbsVolumeID }).DeviceName } ElseIf ($DiskDrive.path -like "*NETAPP*") { if ($DriveLetter -match '[^a-zA-Z0-9]') { $i = 0 While ($i -ne ($array3.Count)) { if ($array[2][$i] -eq $EbsVolumeID) { $DriveLetter = $array[0][$i] $DeviceName = $array[3][$i] } $i ++ } } $EbsVolumeID = "FSxN Volume" $BlockDevice = "" $BlockDeviceName = ($BlockDeviceMappings | Where-Object { $_.ebs.VolumeId -eq $EbsVolumeID }).DeviceName } Else { $BlockDeviceName = $null $BlockDevice = $null } New-Object PSObject -Property @{ Disk = $Disk; Partitions = $Partitions; DriveLetter = If ($DriveLetter -eq $null) { "N/A" } Else { $DriveLetter }; EbsVolumeId = If ($EbsVolumeID -eq $null) { "N/A" } Else { $EbsVolumeID }; Device = If ($BlockDeviceName -eq $null) { "N/A" } Else { $BlockDeviceName }; VirtualDevice = If ($VirtualDevice -eq $null) { "N/A" } Else { $VirtualDevice }; VolumeName = If ($VolumeName -eq $null) { "N/A" } Else { $VolumeName }; DeviceName = If ($DeviceName -eq $null) { "N/A" } Else { $DeviceName }; } } | Sort-Object Disk | Format-Table -AutoSize -Property Disk, Partitions, DriveLetter, EbsVolumeId, Device, VirtualDevice, DeviceName, VolumeName

執行指令碼,如下所示:

PS C:\> .\mapping.ps1

下列為範例輸出。

Disk Partitions DriveLetter EbsVolumeId Device VirtualDevice DeviceName VolumeName ---- ---------- ----------- ----------- ------ ------------- ---------- ---------- 0 1 C vol-0561f1783298efedd /dev/sda1 N/A NVMe Amazon Elastic B N/A 1 1 D vol-002a9488504c5e35a xvdb N/A NVMe Amazon Elastic B N/A 2 1 E vol-0de9d46fcc907925d xvdc N/A NVMe Amazon Elastic B N/A

如果您未在 Windows 執行個體上提供登入資料,則指令碼無法取得 EBS 磁碟區 ID,並會在 EbsVolumeId 欄中使用 N/A。