La fonction ci-dessous retourne BlockDeviceName
et EBS VolumeID
pour une lettre de lecteur donnée lorsqu'elle est exécutée dans le contexte d'un hôte EC2. Elle gère les lecteurs qui couvrent plusieurs disques, mais pas les disques couvrant plusieurs volumes 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
}
}
Explication
Étant donnée la limitation ci-dessus, vous pouvez estimer l'EBS VolumeID
pour (le premier volume dans) un disque donné en inspectant l'attribut SerialNumber
sur Win32_DiskDrive
. Comme indiqué dans @bjoster
's answer, vous pouvez également récupérer les valeurs de bus, de target et de lun nécessaires pour rechercher le BlockDeviceName
en vous basant sur le tableau dans la documentation AWS précédemment liée ici.
Cependant, il est frustrant que cela ne corresponde pas facilement à la lettre de lecteur ou au nom réel du lecteur que vous êtes susceptible de recevoir dans une plainte d'utilisateur. Pour associer ces attributs (trouvés sur la collection Win32_LogicalDisk
dans mon cas), vous pouvez remonter en chaîne à travers les mapping antécédent/dépendant sur les collections Win32_LogicalDiskToPartition
et Win32_DiskDriveToDiskPartition
.
En assemblant cela, j'ai remarqué que sur mon installation Win32_DiskDriveToDiskPartition
cartographie de manière 1:1 pour les disques. Alors que Win32_LogicalDiskToPartition
correspond au nombre de volumes EBS (dans le cas de plusieurs volumes par disque), je n'ai pas encore pris la peine de comprendre comment associer le bus, la target et le lun nécessaires pour obtenir le BlockDeviceName
des volume(s) sous-jacents non primaires lorsqu'ils existent. Si ceux-ci sont récupérés mais que, pour une raison quelconque, l'EBS VolumeID
n'est pas immédiatement connu pour les volumes non primaires, il peut être envisagé d'appeler la fonction AWSPowerShell de la manière suivante
$bdn = 'xvdg'
# en supposant que vous avez taggé votre instance avec le nom d'hôte
$ec2 = Get-EC2Instance -Filter @{Name='tag:Name';Values='EC2-Server-1'}
($ec2.Instances.BlockDeviceMappings | Where DeviceName -eq $bdn).Ebs