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