Жалоба пришла ...
Помогите! Мой
I
диск заполнен наEC2-Server-1
! Пожалуйста, дайте мне место!
Однако, когда я удаленно на сервере перед расширением тома, я обнаружил, что не могу легко понять который Том EBS мне нужно будет расширить.
Когда я бегу aws ec2 describe-instances --filters "Name=tag:Name,Values=EC2-Server-1"
, соответствующую информацию можно найти в $.Reservations.Instances.BlockDeviceMappings
показывает ...
DeviceName Ebs
---------- ---
/dev/sda1 @{VolumeId=vol-0123;...}
xvdf @{VolumeId=vol-0456;...}
xvdj @{VolumeId=vol-0789;...}
xvdg @{VolumeId=vol-0abc;...}
...
Следующий это руководство, Я вижу в Управление диском под Свойства> Общие для Диск 2 (Буква диска I
) Расположение ценность Bus Number 0, Target Id 6, LUN 0
. Глядя на это значение на таблица сопоставления томов Windows с той же страницы мы видим соответствующий DeviceName
является xvdg
, который соответствует vol-0abc
.
Итак ... отлично ... теперь мне просто нужно щелкать примерно 5 диалоговых окон каждый раз, когда мне нужно это сделать (или просто нечеткое совпадение по размеру из Консоли AWS и Проводника Windows).
В настоящее время я прохожу свой путь через различные wmic
итераций, но ... есть ли шанс, что это решенная проблема?
Да, есть. На помощь приходит PowerShell (с WMI):
Get-WmiObject Win32_DiskDrive | select-object DeviceID,size,scsiport,scsibus,scsitargetid,scsilogicalunit
Это оставит вас с:
DeviceID : \\.\PHYSICALDRIVE9
size : 234362882560
scsiport : 3
scsibus : 0
scsitargetid : 2
scsilogicalunit : 4
В функция ниже возвращается BlockDeviceName
и EBS VolumeID
для данной буквы диска при выполнении в контексте хоста EC2. Он обрабатывает диски, охватывающие несколько дисков, но не диски, охватывающие несколько томов EBS.
function Get-EbsDeets {
[cmdletbinding()]Param(
[string[]]$DriveLetter
)
# $wmiVol = Get-WmiObject Win32_Volume | Where DriveLetter -eq "$DriveLetter`:"
$wmiLd = Get-WmiObject Win32_LogicalDisk | Where {($_.DeviceID).Trim(':') -in $DriveLetter}
$wmiLd | ForEach-Object {
$Letter = $_.DeviceID
$wmiLd2p = Get-WmiObject Win32_LogicalDiskToPartition | Where Dependent -in $_.__PATH
$wmiDd2p = Get-WmiObject Win32_DiskDriveToDiskPartition | Where Dependent -in $wmiLd2p.Antecedent
$wmiDsk = Get-WmiObject Win32_DiskDrive | Where __PATH -in $wmiDd2p.Antecedent
$wmiDsk | ForEach-Object {
$EstimatedVolumeId = $_.SerialNumber.Insert(3,'-')
$DeviceName = (ec2WinVolMap $_.SCSIBus -target $_.SCSITargetId -lun $_.SCSILogicalUnit).DeviceName
$VolumeType = (ec2WinVolMap $_.SCSIBus -target $_.SCSITargetId -lun $_.SCSILogicalUnit).VolumeType
$SizeGb = [Math]::Round(($_.Size / 1gb),2)
[PSCustomObject]@{
DriveLetter = $Letter
DiskNumber = $_.DeviceId
DeviceName = $DeviceName
VolumeType = $VolumeType
VolumeId = $EstimatedVolumeId
SizeGb = $SizeGb
}
}
}
}
Function ec2WinVolMap {
[cmdletBinding()]Param(
$bus
,$target
,$lun
)
# https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/ec2-windows-volumes.html#windows-volume-mapping
# https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html
$Lookup = @"
Bus,Target,LUN,DeviceName,VolumeType
0,0,0,/dev/sda1,ebs
0,1,0,xvdb, ebs
0,2,0,xvdc, ebs
0,3,0,xvdd, ebs
0,4,0,xvde, ebs
0,5,0,xvdf, ebs
0,6,0,xvdg, ebs
0,7,0,xvdh, ebs
0,8,0,xvdi, ebs
0,9,0,xvdj, ebs
0,10,0,xvdk,ebs
0,11,0,xvdl,ebs
0,12,0,xvdm,ebs
0,13,0,xvdn,ebs
0,14,0,xvdo,ebs
0,15,0,xvdp,ebs
0,16,0,xvdq,ebs
0,17,0,xvdr,ebs
0,18,0,xvds,ebs
0,19,0,xvdt,ebs
0,20,0,xvdu,ebs
0,21,0,xvdv,ebs
0,22,0,xvdw,ebs
0,23,0,xvdx,ebs
0,24,0,xvdy,ebs
0,25,0,xvdz,ebs
0,78,0,xvdca,instance-store
0,79,0,xvdcb,instance-store
0,80,0,xvdcc,instance-store
0,81,0,xvdcd,instance-store
0,82,0,xvdce,instance-store
0,83,0,xvdcf,instance-store
0,84,0,xvdcg,instance-store
0,85,0,xvdch,instance-store
0,86,0,xvdci,instance-store
0,87,0,xvdcj,instance-store
0,88,0,xvdck,instance-store
0,89,0,xvdcl,instance-store
"@ | ConvertFrom-Csv
$DeviceName = ($Lookup | Where-Object {
$_.Bus -eq $bus -and `
$_.Target -eq $target -and `
$_.LUN -eq $lun
}).DeviceName
$VolumeType = ($Lookup | Where-Object {
$_.Bus -eq $bus -and `
$_.Target -eq $target -and `
$_.LUN -eq $lun
}).VolumeType
[PSCustomObject]@{
DeviceName = $DeviceName
VolumeType = $VolumeType
}
}
Учитывая вышеуказанное ограничение, вы можете оценить EBS VolumeID
для (первый том в) данный диск, проверив SerialNumber
атрибут на Win32_DiskDrive
. Как отмечено в @bjoster
ответ, вы также можете получить значения bus, target и lun, необходимые для поиска BlockDeviceName
на основе таблицы в ранее связанном Документация AWS.
К сожалению, это не так просто сопоставить с фактическим приводом. письмо или название который вы, вероятно, получите в реальной жалобе пользователя. Чтобы связать эти атрибуты (находятся на Win32_LogicalDisk
collection в моем случае), вы можете последовательно выполнить обратную цепочку через антецедентные / зависимые сопоставления на Win32_LogicalDiskToPartition
и Win32_DiskDriveToDiskPartition
коллекции.
Собирая все вместе, я заметил, что на моей установке Win32_DiskDriveToDiskPartition
карты 1: 1 для дисков. Пока Win32_LogicalDiskToPartition
соответствует количеству томов EBS (в случае нескольких томов на диск), я еще не удосужился выяснить, как связать шину, цель и lun, необходимые для получения BlockDeviceName
для неосновных базовых томов, если они существуют. Если они получены, но по какой-то причине EBS VolumeID
не сразу известно о неосновных томах, может возникнуть мысль о вызове функции AWSPowerShell следующим образом
$bdn = 'xvdg'
# assuming you've tagged your instance with the hostname
$ec2 = Get-EC2Instance -Filter @{Name='tag:Name';Values='EC2-Server-1'}
($ec2.Instances.BlockDeviceMappings | Where DeviceName -eq $bdn).Ebs