Назад | Перейти на главную страницу

Сопоставить букву диска с VolumeID

Жалоба пришла ...

Помогите! Мой 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