

# 볼륨에 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` 인스턴스를 시작할 경우 사용 가능한 디스크를 보여줍니다.  
![\[루트 볼륨 1개, 인스턴스 스토어 볼륨 1개 및 EBS 볼륨 1개가 있는 디스크 관리\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/images/disk_management.png)

1. 회색 창으로 표시된 디스크 1을 마우스 오른쪽 단추로 클릭한 후 **속성**을 선택합니다. **위치**의 값을 [볼륨에 비 NVMe 디스크 매핑](#windows-volume-mapping)의 표를 확인합니다. 예를 들어, 다음 디스크에는 버스 번호 0, 타겟 ID 9, LUN 0 위치가 있습니다. EBS 볼륨 테이블에 따르면 이 위치에 있는 디바이스 이름은 `xvdj`입니다.  
![\[EBS 볼륨의 위치\]](http://docs.aws.amazon.com/ko_kr/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 볼륨에 매핑하는 방법을 설명합니다.


| 위치 | 디바이스 이름 | 
| --- | --- | 
| 버스 번호 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 | 