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 |