4 votes

Attribuer une lettre de lecteur à VolumeID

J'ai reçu la plainte...

Aidez ! Mon lecteur I est plein sur EC2-Server-1! S'il vous plaît donner plus d'espace !

Cependant, lorsque je me connecte à distance sur le serveur avant d'étendre le volume, je trouve que je ne peux pas facilement déterminer lequel des volumes EBS je devrai étendre.

Lorsque j'exécute aws ec2 describe-instances --filters "Name=tag:Name,Values=EC2-Server-1", les informations pertinentes trouvées dans $.Reservations.Instances.BlockDeviceMappings montrent...

DeviceName Ebs
---------- ---
/dev/sda1  @{VolumeId=vol-0123;...}
xvdf       @{VolumeId=vol-0456;...}
xvdj       @{VolumeId=vol-0789;...}
xvdg       @{VolumeId=vol-0abc;...}
...

Suivant ce guide, je peux voir dans Gestion de disque sous Propriétés > Général pour Disque 2 (Lettre du lecteur I) que la valeur de Emplacement est Numéro de bus 0, Identifiant de la cible 6, LUN 0. En recherchant cette valeur sur le tableau de correspondance des volumes Windows de la même page, nous voyons que le DeviceName correspondant est xvdg, qui est associé à vol-0abc.

Donc... super... maintenant je dois juste cliquer à travers environ 5 boîtes de dialogue chaque fois que j'ai besoin de le faire (ou simplement faire correspondre approximativement avec la taille depuis la Console AWS et l'Explorateur Windows).

Y a-t-il une commande terminal (ou une série de commandes) que je peux exécuter pour récupérer rapidement et de manière fiable ce mapping ?

Je suis actuellement en train de rechercher différentes itérations de wmic, mais... est-ce que ce problème est résolu ?

2voto

bjoster Points 4276

Oui, il y a. PowerShell (avec WMI) à la rescousse :

Get-WmiObject Win32_DiskDrive | select-object DeviceID,size,scsiport,scsibus,scsitargetid,scsilogicalunit

Cela vous laissera avec :

DeviceID : \\.\PHYSICALDRIVE9
size : 234362882560
scsiport : 3
scsibus : 0
scsitargetid : 2
scsilogicalunit : 4

1 votes

Merci! Cela est super utile, mais semble toujours manquer un élément clé nécessaire pour mapper Win32_DiskDrive (informations AWS) à Win32_Volume (Lettre de lecteur & Nom).

1voto

Peter Vandivier Points 353

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X