

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 將 Amazon EC2 Windows 執行個體上的非 NVMe 磁碟映射至磁碟區
<a name="windows-list-disks"></a>

對於從使用 AWS PV 或 Citrix PV 驅動程式的 Windows AMI 啟動的執行個體，您可以使用此頁面所述的關係，將 Windows 磁碟映射到您的執行個體存放區和 EBS 磁碟區。本主題會說明如何檢視執行個體上 Windows 作業系統可用的**非 NVMe 磁碟**。其也會顯示如何將這些非 NVMe 磁碟映射至基礎 Amazon EBS 磁碟區，以及為 Amazon EC2 使用的區塊型儲存設備映射指定的裝置名稱。

**注意**  
若您啟動執行個體，且如果 Windows AMI 使用 Red Hat PV 驅動程式，您可以更新執行個體來使用 Citrix 驅動程式。如需詳細資訊，請參閱[升級 EC2 Windows 執行個體上的 PV 驅動程式](Upgrading_PV_drivers.md)。

**Topics**
+ [列出非 NVMe 磁碟](#windows-disks)
+ [將非 NVMe 磁碟映射至磁碟區](#windows-volume-mapping)

## 列出非 NVMe 磁碟
<a name="windows-disks"></a>

您可以使用磁碟管理公用程式或 PowerShell，來尋找 Windows 執行個體上的磁碟。

------
#### [ Disk Management ]

**搜尋 Windows 執行個體上的磁碟**

1. 使用遠端桌面登入 Windows 執行個體。如需詳細資訊，請參閱 [使用 RDP 連線至您的 Windows 執行個體](connecting_to_windows_instance.md)。

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

   在工作列的 Windows 標誌上按一下滑鼠右鍵，然後選擇**磁碟管理**。

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

   下列的範例，會顯示當您使用執行個體存放磁碟區 (磁碟 2) 和其他的 EBS 磁碟區 (磁碟 1) 來啟動 `m3.medium` 執行個體時，可以使用的磁碟。  
![磁碟管理，包含根磁碟區、一個執行個體存放磁碟區和一個 EBS 磁碟區。](http://docs.aws.amazon.com/zh_tw/AWSEC2/latest/UserGuide/images/disk_management.png)

1. 在以灰色窗格標示的磁碟 1 上，按一下滑鼠右鍵，然後選取 **Properties (屬性)**。記下 **Location (位置)** 的值，然後在[將非 NVMe 磁碟映射至磁碟區](#windows-volume-mapping)的表格中查閱。例如，下列磁碟的位置為匯流排編號 0，目標 Id 9，LUN 0。根據 EBS 磁碟區的對應表，此位置的裝置名稱為 `xvdj`。  
![EBS 磁碟區的位置。](http://docs.aws.amazon.com/zh_tw/AWSEC2/latest/UserGuide/images/disk_1_location.png)

------
#### [ 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。

------

## 將非 NVMe 磁碟映射至磁碟區
<a name="windows-volume-mapping"></a>

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

**Topics**
+ [執行個體儲存體磁碟區](#instance-store-volume-map)
+ [EBS 磁碟區](#ebs-volume-map)

### 執行個體儲存體磁碟區
<a name="instance-store-volume-map"></a>

下表說明 Citrix PV 和 AWS PV 驅動程式如何將非 NVMe 執行個體存放區磁碟區映射至 Windows 磁碟區。可用執行個體存放磁碟區的數量，會取決於執行個體的類型。如需詳細資訊，請參閱 [EC2 執行個體的執行個體儲存體磁碟區限制](instance-store-volumes.md)。


| 位置 | 裝置名稱 | 
| --- | --- | 
| 匯流排編號 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 磁碟區
<a name="ebs-volume-map"></a>

下表說明 Citrix PV 和 AWS PV 驅動程式如何將非 NVMe EBS 磁碟區映射至 Windows 磁碟區。


| Location | 裝置名稱 | 
| --- | --- | 
| 匯流排編號 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 | 