Amazon EC2 Windows 인스턴스의 비-NVMe 디스크를 볼륨에 매핑하기

Amazon EC2 Windows 인스턴스의 비-NVMe 디스크를 볼륨에 매핑하기

AWS PV 또는 Citrix PV 드라이버를 사용하는 Windows AMI에서 시작한 인스턴스의 경우, 이 페이지에서 설명하는 관계를 사용해 Windows 디스크를 인스턴스 스토어와 EBS 볼륨에 매핑할 수 있어요. 이 주제에서 비-NVMe 디스크를 나열하고 매핑하는 방법을 살펴볼게요.

출처: 문서

본문

AWS PV 또는 Citrix PV 드라이버를 사용하는 Windows AMI에서 시작한 인스턴스의 경우, 이 페이지에서 설명하는 관계를 사용해 Windows 디스크를 인스턴스 스토어와 EBS 볼륨에 매핑할 수 있어요. 이 주제는 인스턴스의 Windows 운영 체제에서 사용할 수 있는 비-NVMe 디스크를 보는 방법을 설명해요. 또한 비-NVMe 디스크를 기본 Amazon EBS 볼륨과 Amazon EC2가 사용하는 블록 디바이스 매핑에 지정된 장치 이름으로 매핑하는 방법도 보여줘요.

참고

Windows AMI가 Red Hat PV 드라이버를 사용한다면 인스턴스를 Citrix 드라이버로 업데이트할 수 있어요. 자세한 내용은 Upgrade PV drivers on EC2 Windows instances를 참고하세요.

관련 주제

비-NVMe 디스크 나열

Disk Management나 PowerShell로 Windows 인스턴스의 디스크를 찾을 수 있어요.

Disk Management —

Windows 인스턴스의 디스크를 찾으려면
  • Remote Desktop으로 Windows 인스턴스에 로그인합니다. 자세한 내용은 Connect to your Windows instance using RDP를 참고하세요.
  • Disk Management 유틸리티를 시작합니다. 작업 표시줄에서 Windows 로고의 컨텍스트(오른쪽 클릭) 메뉴를 열고 Disk Management를 선택합니다.
  • 디스크를 검토합니다. 루트 볼륨은 C:\로 마운트된 EBS 볼륨이에요. 다른 디스크가 표시되지 않으면 AMI를 만들거나 인스턴스를 시작할 때 추가 볼륨을 지정하지 않은 거예요.

다음 예시는 인스턴스 스토어 볼륨(Disk 2)과 추가 EBS 볼륨(Disk 1)이 있는 m3.medium 인스턴스를 시작할 때 사용할 수 있는 디스크를 보여줘요.

  • Disk 1이라는 회색 창의 컨텍스트(오른쪽 클릭) 메뉴를 열고 Properties를 선택합니다. Location 값을 확인하고 비-NVMe 디스크를 볼륨에 매핑의 표에서 조회합니다. 예를 들어 다음 디스크는 Bus Number 0, Target Id 9, LUN 0의 위치를 가져요. EBS 볼륨 표에 따르면 이 위치의 장치 이름은 xvdj예요.

PowerShell —

다음 PowerShell 스크립트는 각 디스크와 해당 장치 이름, 볼륨을 나열해요.

요구 사항과 제한 사항
  • Windows Server 2012 이상 필요.
  • EBS 볼륨 ID를 얻으려면 자격 증명이 필요. Tools for PowerShell로 프로필을 구성하거나 인스턴스에 IAM 역할을 연결할 수 있어요.
  • NVMe 볼륨을 지원하지 않아요.
  • 동적 디스크(dynamic disks)를 지원하지 않아요.

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 디스크를 볼륨에 매핑

인스턴스의 블록 디바이스 드라이버가 볼륨을 마운트할 때 실제 볼륨 이름을 할당해요.

매핑

인스턴스 스토어 볼륨

다음 표는 Citrix PV와 AWS PV 드라이버가 비-NVMe 인스턴스 스토어 볼륨을 Windows 볼륨으로 매핑하는 방법을 설명해요. 사용 가능한 인스턴스 스토어 볼륨의 수는 인스턴스 유형에 따라 결정돼요. 자세한 내용은 Instance store volume limits for EC2 instances를 참고하세요.

위치 디바이스 이름
Bus Number 0, Target ID 78, LUN 0 xvdca
Bus Number 0, Target ID 79, LUN 0 xvdcb
Bus Number 0, Target ID 80, LUN 0 xvdcc
Bus Number 0, Target ID 81, LUN 0 xvdcd
Bus Number 0, Target ID 82, LUN 0 xvdce
Bus Number 0, Target ID 83, LUN 0 xvdcf
Bus Number 0, Target ID 84, LUN 0 xvdcg
Bus Number 0, Target ID 85, LUN 0 xvdch
Bus Number 0, Target ID 86, LUN 0 xvdci
Bus Number 0, Target ID 87, LUN 0 xvdcj
Bus Number 0, Target ID 88, LUN 0 xvdck
Bus Number 0, Target ID 89, LUN 0 xvdcl

EBS 볼륨

다음 표는 Citrix PV와 AWS PV 드라이버가 비-NVMe EBS 볼륨을 Windows 볼륨으로 매핑하는 방법을 설명해요.

위치 디바이스 이름
Bus Number 0, Target ID 0, LUN 0 /dev/sda1
Bus Number 0, Target ID 1, LUN 0 xvdb
Bus Number 0, Target ID 2, LUN 0 xvdc
Bus Number 0, Target ID 3, LUN 0 xvdd
Bus Number 0, Target ID 4, LUN 0 xvde
Bus Number 0, Target ID 5, LUN 0 xvdf
Bus Number 0, Target ID 6, LUN 0 xvdg
Bus Number 0, Target ID 7, LUN 0 xvdh
Bus Number 0, Target ID 8, LUN 0 xvdi
Bus Number 0, Target ID 9, LUN 0 xvdj
Bus Number 0, Target ID 10, LUN 0 xvdk
Bus Number 0, Target ID 11, LUN 0 xvdl
Bus Number 0, Target ID 12, LUN 0 xvdm
Bus Number 0, Target ID 13, LUN 0 xvdn
Bus Number 0, Target ID 14, LUN 0 xvdo
Bus Number 0, Target ID 15, LUN 0 xvdp
Bus Number 0, Target ID 16, LUN 0 xvdq
Bus Number 0, Target ID 17, LUN 0 xvdr
Bus Number 0, Target ID 18, LUN 0 xvds
Bus Number 0, Target ID 19, LUN 0 xvdt
Bus Number 0, Target ID 20, LUN 0 xvdu
Bus Number 0, Target ID 21, LUN 0 xvdv
Bus Number 0, Target ID 22, LUN 0 xvdw
Bus Number 0, Target ID 23, LUN 0 xvdx
Bus Number 0, Target ID 24, LUN 0 xvdy
Bus Number 0, Target ID 25, LUN 0 xvdz

더 알아보기