のぴぴのメモ

自分用のLinuxとかの技術メモ

AWS NitroインスタンスのLinuxでEBSボリュームを特定する手順

はじめに

m5・c5・t3などのNitroタイプのインスタンスを利用している場合にOS上で認識しているボリュームがどのEBSボリュームかを、Volume IDベースで確認する手順です。
なおXenベースのインスタンス(m4以前、c5以前、t2以前など)は調べた限りでは、残念ながらVolume IDでのボリューム特定方法は見つかりませんでした。(Xenの準仮想化ドライバ blk_frontでデバイス情報を表示する実装がそもそもなさそう)

AWSでEBSのVolume ID確認

マネコンでの確認

対象インスタンスのEBSのデバイスをクリックするとVolume IDが表示されます。
f:id:nopipi:20200409144901p:plain:w500

CLIでの確認

CLIaws ec2 describe-instancesで対象インタンスにアタッチされているEBSボリュームの情報を確認することができます。

 aws ec2 describe-instances --instance-ids i-03e048ef20e38a8d7 \
    --query 'Reservations[].Instances[].BlockDeviceMappings' ;
[
    [
        {
            "DeviceName": "/dev/xvda",
            "Ebs": {
                "AttachTime": "2020-04-09T05:46:34.000Z",
                "DeleteOnTermination": true,
                "Status": "attached",
                "VolumeId": "vol-0b5cbc3d4d6d5a965"
            }
        }
    ]
]

LinuxOS上でのVolume ID確認によるEBSの特定

RHELの場合

nvmeのCLIをインストールしてnvmeデバイスの情報を取得します。4行目のsnの部分に表示されますが、vol-xxxxxxxxxxxの"-"がないのでコピーして利用する時は注意してください。

#CLIのインストール
sudo yum -y install nvme-cli

#ボリュームの情報取得
sudo nvme id-ctrl /dev/nvme0|head -n 5
NVME Identify Controller:
vid     : 0x1d0f
ssvid   : 0x1d0f
sn      : vol0b5cbc3d4d6d5a965
mn      : Amazon Elastic Block Store 

Amazon Linuxの場合

Amazon Linux専用で、EBSのVolume IDを表示する/sbin/ebsnvme-idコマンドがあります。ちなみに、RHELで記載したnvmeコマンドでも取得可能です。

#ボリュームの情報取得
sudo /sbin/ebsnvme-id /dev/nvme0n1
Volume ID: vol-0b5cbc3d4d6d5a965
xvda

(蛇足)どのようにVolume id情報を取得しているか

RHEL(nvmeコマンド)

コマンドの中では指定したデバイスに対して、ioctlでデバイス情報の取得をしています。straceで実際に取得する部分でを表示すると以下の通りです。 ioctl()のシステムコールでオペレーションコードにNVME_IOCTL_ADMIN_CMDを指定し情報取得をしています。

# nvmeコマンドのstrace結果(抜粋)

open("/dev/nvme0", O_RDONLY)            = 3
fstat(3, {st_mode=S_IFCHR|0600, st_rdev=makedev(245, 0), ...}) = 0
ioctl(3, NVME_IOCTL_ADMIN_CMD, 0x7ffc7436f9c0) = 0
fstat(1, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f0224788000
close(3) 

Amazon Linux(ebsnvme-idコマンド)

ebsnvme-idはpythonで実装されており、こちらもnvmeコマンドと同様ioctl()システムコールで情報取得していますが、オペレーションコードにNVME_IOCTL_ADMIN_CMDを指定し情報取得をしています。

# ebsnvme-idコマンドのstrace結果(抜粋)

openat(AT_FDCWD, "/dev/nvme0", O_RDONLY) = 3
fstat(3, {st_mode=S_IFCHR|0600, st_rdev=makedev(248, 0), ...}) = 0
ioctl(3, NVME_IOCTL_ADMIN_CMD, 0x7ffdf50dddb0) = 0
close(3)