Windows 인스턴스의 볼륨에 디스크 매핑 - Amazon Elastic Compute Cloud

Windows 인스턴스의 볼륨에 디스크 매핑

참고

이 주제는 Windows 인스턴스에만 적용됩니다.

Windows 인스턴스는 루트 볼륨의 기능을 하는 EBS 볼륨과 함께 제공됩니다. Windows 인스턴스가 AWS PV 또는 Citrix PV 드라이버를 사용하는 경우 최대 25개의 볼륨을 선택적으로 추가할 수 있으므로 총 볼륨은 26개가 됩니다. 자세한 내용은 인스턴스 볼륨 제한 섹션을 참조하세요.

인스턴스의 인스턴스 유형에 따라 인스턴스는 0~24개의 인스턴스 스토어 볼륨을 가질 수 있습니다. 인스턴스에서 사용 가능한 인스턴스 스토어 볼륨을 사용하려면 AMI 생성 시 또는 인스턴스 시작 시에 인스턴스 스토어 볼륨을 지정해야 합니다. 또한 AMI를 생성하거나 인스턴스를 시작할 때 EBS 볼륨을 추가하거나, 인스턴스가 실행 중인 상태에서 해당 볼륨을 연결할 수 있습니다.

인스턴스에 볼륨을 추가할 때 Amazon EC2에서 사용하는 디바이스 이름을 지정합니다. 자세한 내용은 Amazon EC2 인스턴스의 디바이스 이름 섹션을 참조하세요. AWS Windows 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 볼륨 2개가 포함된 r5d.4xlarge 인스턴스를 시작하는 경우 사용 가능한 디스크를 보여줍니다.

    루트 볼륨 1개, 인스턴스 스토어 볼륨 2개 및 EBS 볼륨 2개가 있는 디스크 관리

PowerShell을 사용하여 NVMe 디스크 나열

다음 PowerShell 스크립트는 각 디스크 및 해당 디바이스 이름과 볼륨을 목록으로 표시합니다. NVMe EBS 및 인스턴스 스토어 볼륨을 사용하는 AWS 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

다음은 루트 볼륨 1개, EBS 볼륨 2개 및 인스턴스 스토어 볼륨 2개가 있는 인스턴스의 예제 출력입니다.

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 인스턴스에서 Windows PowerShell용 도구에 대한 자격 증명을 구성하지 않은 경우 스크립트는 EBS 볼륨 ID를 가져올 수 없으며 EbsVolumeId 열에 N/A를 사용합니다.

NVMe EBS 볼륨 매핑

AWS Nitro 시스템에 구축된 인스턴스에서는 EBS 볼륨이 NVMe 디바이스로 표시됩니다. Get-Disk 명령을 써서 Windows 디스크 번호를 EBS 볼륨 ID로 매핑할 수 있습니다.

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 명령을 실행하여 EBS 볼륨 ID 및 디바이스 이름에 NVMe 디스크 번호를 매핑할 수도 있습니다.

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 로고를 마우스 오른쪽 단추를 클릭한 다음 디스크 관리를 선택합니다.

  3. 디스크를 확인합니다. 루트 볼륨은 C:\로 마운트되는 EBS 볼륨입니다. 다른 디스크가 표시되지 않는 경우 AMI를 생성하거나 인스턴스를 시작할 때 추가 볼륨을 지정하지 않은 것입니다.

    다음 예는 인스턴스 스토어 볼륨(디스크 2) 및 추가 EBS 볼륨(디스크 1)을 포함하여 m3.medium 인스턴스를 시작할 경우 사용 가능한 디스크를 보여줍니다.

    루트 볼륨 1개, 인스턴스 스토어 볼륨 1개 및 EBS 볼륨 1개가 있는 디스크 관리
  4. 회색 창으로 표시된 디스크 1을 마우스 오른쪽 단추로 클릭한 후 속성을 선택합니다. 위치의 값을 디스크 디바이스를 디바이스 이름에 매핑의 표를 확인합니다. 예를 들어, 다음 디스크에는 버스 번호 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가 표시됩니다.