web-dev-qa-db-ja.com

ドライブ文字を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;...}
...

このガイダンス に続いて、私はで見ることができます Disk Management 下 Properties > General forDisk 2(Drive Letter I)the Location 値はBus Number 0, Target Id 6, LUN 0です。同じページから Windowsボリュームマッピングテーブル でこの値を調べると、対応するDeviceNamexvdgであり、これはvol-0abcにマップされます。

だから...素晴らしい...今、私はこれを行う必要があるたびに約5つのダイアログボックスをクリックする必要があります(またはAWSコンソールとWindowsエクスプローラーからのサイズのあいまい一致)。

このマッピングを迅速かつ確実に取得するために実行できるターミナルコマンド(または一連のコマンド)はありますか?

私は現在、さまざまなwmicの反復をラバーダックしていますが、これが解決された問題である可能性はありますか?

3
Peter Vandivier

関数の下 は、EC2ホストのコンテキスト内で実行されると、特定のドライブ文字に対してBlockDeviceNameとEBSVolumeIDを返します。複数のディスクにまたがるドライブには対応しますが、複数の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
    }
}

説明

上記の制限がある場合、EBSVolumeIDを見積もることができます。 (の最初のボリューム)Win32_DiskDriveSerialNumber属性を検査することにより、特定のディスク。 @bjosterの回答 に記載されているように、以前にリンクされたテーブルに基づいてBlockDeviceNameを検索するために必要なバス、ターゲット、およびlunの値を取得することもできます AWSドキュメント

ただし、イライラすることに、これは実際のドライブ文字または名前に簡単にマップすることはできません。実際のユーザーの苦情。これらの属性(私の場合は Win32_LogicalDisk コレクションにあります)を関連付けるには、Win32_LogicalDiskToPartitionおよびWin32_DiskDriveToDiskPartitionの先行/依存マッピングをデイジーチェーン接続します。コレクション。

これを一緒に組み合わせると、インストール時にWin32_DiskDriveToDiskPartitionがディスクに1:1でマップされることに気付きました。 Win32_LogicalDiskToPartitionはEBSボリュームの数と一致しますが(ディスクごとに複数のボリュームの場合)、BlockDeviceNameを取得するために必要なバス、ターゲット、およびlunを関連付ける方法をまだ理解していません。非プライマリの基になるボリューム(存在する場合)。これらが取得されたが、何らかの理由で非プライマリボリュームの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
1
Peter Vandivier

はいあります。 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
2
bjoster