[Red Hat Enterprise Linux] EBSボリュームのデバイス名とOSが認識しているブロックデバイス名をマッピングさせてマウントしてみた
EBSボリュームがOSが認識しているどのブロックデバイスと対応しているのか分からない
こんにちは、のんピ(@non____97)です。
皆さんはEBSボリュームがOSが認識しているどのブロックデバイスと対応しているのか分からないなと思ったことはありますか? 私はあります。
EBSボリュームのデバイス名とOSが認識しているブロックデバイス名は異なる場合があります。
例えば、Amazon Linux 2023のt3.micro
のEC2インスタンスに各デバイス名が/dev/xvda
、/dev/sdb
、/dev/sdc
のEBSボリュームをマウントします。
OSから見ると、ブロックデバイス名はxvda
、xvdb
、xvdc
となっています。
$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS xvda 202:0 0 8G 0 disk ├─xvda1 202:1 0 8G 0 part / ├─xvda127 259:0 0 1M 0 part └─xvda128 259:1 0 10M 0 part xvdb 202:16 0 1G 0 disk xvdc 202:32 0 2G 0 disk
こうなると、EBSボリュームをマウントポイントごとに作成している場合、OSが認識しているどのブロックデバイスをどのマウントポイントにマウントすれば良いのか判断が難しいです。ボリュームサイズが同じであれば特に困ります。
安心してください。Amazon Linux 2023の場合はブロックデバイス名がEBSボリュームで指定したデバイス名のシンボリックリンクになっています。
$ ls -l /dev/ | grep sd lrwxrwxrwx. 1 root root 4 Sep 2 02:13 sda -> xvda lrwxrwxrwx. 1 root root 5 Sep 2 02:13 sda1 -> xvda1 lrwxrwxrwx. 1 root root 7 Sep 2 02:13 sda127 -> xvda127 lrwxrwxrwx. 1 root root 7 Sep 2 02:13 sda128 -> xvda128 lrwxrwxrwx. 1 root root 4 Sep 2 02:13 sdb -> xvdb lrwxrwxrwx. 1 root root 4 Sep 2 02:13 sdc -> xvdc
そのため、簡単にどのデバイスがどのEBSボリュームなのかを特定することが可能です。
re:Postにもlsblk
とインスタンスメタデータを使用してマッピングすることが可能と紹介されています。
$ OSDEVICE=$(sudo lsblk -o NAME -n | grep -v '[[:digit:]]' | sed "s/^sd/xvd/g") $ BDMURL="http://169.254.169.254/latest/meta-data/block-device-mapping/" $ for bd in $(curl -s ${BDMURL}); do MAPDEVICE=$(curl -s ${BDMURL}/${bd}/ | sed "s/^sd/xvd/g"); if grep -wq ${MAPDEVICE} <<< "${OSDEVICE}"; then echo "${bd} is ${MAPDEVICE}"; fi; done | grep ephemeral ephemeral0 is xvdb ephemeral1 is xvdc ephemeral2 is xvdd ephemeral3 is xvde
ただし、Red Hat Enterprise Linux(以降RHEL)の場合はそういう訳にはいきません。
例えば、RHEL 9.2のt3.micro
のEC2インスタンスに各デバイス名が/dev/sda1
、/dev/sdb
、/dev/sdc
のEBSボリュームをマウントします。
OSから見ると、ブロックデバイス名はxvda
、xvdb
、xvdc
となっています。
$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS nvme0n1 259:0 0 10G 0 disk ├─nvme0n1p1 259:3 0 1M 0 part ├─nvme0n1p2 259:4 0 200M 0 part /boot/efi ├─nvme0n1p3 259:5 0 500M 0 part /boot └─nvme0n1p4 259:6 0 9.3G 0 part / nvme1n1 259:1 0 1G 0 disk nvme2n1 259:2 0 2G 0 disk
「nvme1n1
がxvdb
とかのシンボリックリンクになっているんじゃないの?」と思われるかもしれませんが、RHELではそのようなシンボリックリンクは作成されていません。
$ ls -l /dev | grep sd
インスタンスメタデータからEBSボリュームのデバイス名を取得することは可能ですが、「OSが認識しているどのブロックデバイスなのか」という情報が欠けており、判断ができません。
# トークンの取得 $ token=$(curl -s -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600") # EC2インスタンスにアタッチされている仮想デバイス一覧の取得 $ curl -H "X-aws-ec2-metadata-token: $token" http://169.254.169.254/latest/meta-data/block-device-mapping/ ami ebs2 ebs3 # 各仮想デバイスの確認 $ curl -H "X-aws-ec2-metadata-token: $token" http://169.254.169.254/latest/meta-data/block-device-mapping/ami sda1 $ curl -H "X-aws-ec2-metadata-token: $token" http://169.254.169.254/latest/meta-data/block-device-mapping/ami/sda1 <?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>404 - Not Found</title> </head> <body> <h1>404 - Not Found</h1> </body> </html> $ curl -H "X-aws-ec2-metadata-token: $token" http://169.254.169.254/latest/meta-data/block-device-mapping/ebs2 sdb $ curl -H "X-aws-ec2-metadata-token: $token" http://169.254.169.254/latest/meta-data/block-device-mapping/ebs2/sdb <?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>404 - Not Found</title> </head> <body> <h1>404 - Not Found</h1> </body> </html> $ curl -H "X-aws-ec2-metadata-token: $token" http://169.254.169.254/latest/meta-data/block-device-mapping/ebs3 sdc $ curl -H "X-aws-ec2-metadata-token: $token" http://169.254.169.254/latest/meta-data/block-device-mapping/ebs3/sdc <?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>404 - Not Found</title> </head> <body> <h1>404 - Not Found</h1> </body> </html>
これは大変ですね。
そんな時はlsblk -o +SERIAL
を叩いてEBSボリュームのIDを取得することで、判断が可能です。
$ lsblk -o +SERIAL NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS SERIAL nvme1n1 259:0 0 1G 0 disk vol0c042e0f4f8ab87ed nvme0n1 259:1 0 10G 0 disk vol0ac4b53ee9d729ab8 ├─nvme0n1p1 259:3 0 1M 0 part ├─nvme0n1p2 259:4 0 200M 0 part /efi │ /boot/efi ├─nvme0n1p3 259:5 0 500M 0 part /boot └─nvme0n1p4 259:6 0 9.3G 0 part / nvme2n1 259:2 0 2G 0 disk vol0f984dd35d3479403
では、AWS CDKなどボリュームIDが分からない状況において、一撃でマッピングするにはどのようにしたら良いでしょうか。
そんな時は対応としてnvme-cli
を活用することで解決できます。
いきなりまとめ
- RHELのEC2インスタンスでEBSボリュームのデバイス名とOSが認識しているブロックデバイス名をマッピングさせる場合は、
nvme-cli
を使用する必要があるnvme1n1
=/dev/sdb
やnvme2n1
=/dev/sdc
ではない
nvme-cli
でブロックデバイスからEBSボリュームのデバイス名を取得することが可能- バイナリ形式の
nvme id-ctrl
の出力結果の3072バイトから3088バイトの間に出現する
- バイナリ形式の
- シェルスクリプトで頑張れば複数のEBSボリュームを意図したマウントポイントにマウントすることも可能
検証環境
RHEL 9.2(RHEL-9.2.0_HVM-20230726-x86_64-61-Hourly2-GP2
)のEC2インスタンスにEBSボリュームをルートボリューム含めて10個アタッチします。
分かりやすいように/dev/sdb
からボリュームサイズを1GiBづつ増やしています。
AWS CDKでデプロイしました。コードは以下の通りです。
// Instance this.instance = new cdk.aws_ec2.Instance(this, "Default", { machineImage: cdk.aws_ec2.MachineImage.lookup({ name: "RHEL-9.2.0_HVM-20230726-x86_64-61-Hourly2-GP2", owners: ["309956199498"], }), instanceType: new cdk.aws_ec2.InstanceType("t3.micro"), blockDevices: [ { deviceName: "/dev/sda1", volume: cdk.aws_ec2.BlockDeviceVolume.ebs(10, { volumeType: cdk.aws_ec2.EbsDeviceVolumeType.GP3, encrypted: true, }), }, { deviceName: "/dev/sdb", volume: cdk.aws_ec2.BlockDeviceVolume.ebs(1, { volumeType: cdk.aws_ec2.EbsDeviceVolumeType.GP3, encrypted: true, }), }, { deviceName: "/dev/sdc", volume: cdk.aws_ec2.BlockDeviceVolume.ebs(2, { volumeType: cdk.aws_ec2.EbsDeviceVolumeType.GP3, encrypted: true, }), }, { deviceName: "/dev/sdd", volume: cdk.aws_ec2.BlockDeviceVolume.ebs(3, { volumeType: cdk.aws_ec2.EbsDeviceVolumeType.GP3, encrypted: true, }), }, { deviceName: "/dev/sde", volume: cdk.aws_ec2.BlockDeviceVolume.ebs(4, { volumeType: cdk.aws_ec2.EbsDeviceVolumeType.GP3, encrypted: true, }), }, { deviceName: "/dev/sdf", volume: cdk.aws_ec2.BlockDeviceVolume.ebs(5, { volumeType: cdk.aws_ec2.EbsDeviceVolumeType.GP3, encrypted: true, }), }, { deviceName: "/dev/sdg", volume: cdk.aws_ec2.BlockDeviceVolume.ebs(6, { volumeType: cdk.aws_ec2.EbsDeviceVolumeType.GP3, encrypted: true, }), }, { deviceName: "/dev/sdh", volume: cdk.aws_ec2.BlockDeviceVolume.ebs(7, { volumeType: cdk.aws_ec2.EbsDeviceVolumeType.GP3, encrypted: true, }), }, { deviceName: "/dev/sdi", volume: cdk.aws_ec2.BlockDeviceVolume.ebs(8, { volumeType: cdk.aws_ec2.EbsDeviceVolumeType.GP3, encrypted: true, }), }, { deviceName: "/dev/sdi", volume: cdk.aws_ec2.BlockDeviceVolume.ebs(9, { volumeType: cdk.aws_ec2.EbsDeviceVolumeType.GP3, encrypted: true, }), }, ], vpc: props.vpc, vpcSubnets: props.vpc.selectSubnets({ subnetGroupName: "Public", }), ssmSessionPermissions: true, userData, requireImdsv2: true, });
AWS CDKのコードは以下リポジトリにも保存しています。
デプロイ後、EC2インスタンスに10個のEBSボリュームがアタッチされていることを確認します。
OSからもブロックデバイス一覧を確認します。
$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS nvme0n1 259:0 0 10G 0 disk ├─nvme0n1p1 259:1 0 1M 0 part ├─nvme0n1p2 259:2 0 200M 0 part /boot/efi ├─nvme0n1p3 259:3 0 500M 0 part /boot └─nvme0n1p4 259:4 0 9.3G 0 part / nvme1n1 259:5 0 9G 0 disk nvme2n1 259:6 0 2G 0 disk nvme3n1 259:7 0 3G 0 disk nvme5n1 259:8 0 8G 0 disk nvme4n1 259:9 0 1G 0 disk nvme6n1 259:10 0 6G 0 disk nvme7n1 259:11 0 5G 0 disk nvme8n1 259:12 0 4G 0 disk nvme9n1 259:13 0 7G 0 disk $ ls -l /dev | grep sd
「nvme1n1
だから/dev/sdb
で指定したボリュームサイズの2GiBである」ということはないですね。EC2のコンソールで表示されたEBSボリュームの順番ともリンクしていなさそうです。
やってみる
NVMeデバイスの一覧の表示
まず、nvme-cli
をインストールします。
$ sudo dnf install nvme-cli -y Updating Subscription Management repositories. Unable to read consumer identity This system is not registered with an entitlement server. You can use subscription-manager to register. Last metadata expiration check: 0:07:58 ago on Sat 02 Sep 2023 03:25:38 AM UTC. Dependencies resolved. ============================================================================================================ Package Architecture Version Repository Size ============================================================================================================ Installing: nvme-cli x86_64 2.2.1-4.el9_2 rhel-9-baseos-rhui-rpms 735 k Installing dependencies: libnvme x86_64 1.2-3.el9_2 rhel-9-baseos-rhui-rpms 84 k Transaction Summary ============================================================================================================ Install 2 Packages Total download size: 819 k Installed size: 4.7 M Downloading Packages: (1/2): libnvme-1.2-3.el9_2.x86_64.rpm 1.9 MB/s | 84 kB 00:00 (2/2): nvme-cli-2.2.1-4.el9_2.x86_64.rpm 11 MB/s | 735 kB 00:00 ------------------------------------------------------------------------------------------------------------ Total 8.7 MB/s | 819 kB 00:00 Running transaction check Transaction check succeeded. Running transaction test Transaction test succeeded. Running transaction Preparing : 1/1 Installing : libnvme-1.2-3.el9_2.x86_64 1/2 Installing : nvme-cli-2.2.1-4.el9_2.x86_64 2/2 Running scriptlet: nvme-cli-2.2.1-4.el9_2.x86_64 2/2 Created symlink /etc/systemd/system/default.target.wants/nvmefc-boot-connections.service → /usr/lib/systemd/system/nvmefc-boot-connections.service. Verifying : nvme-cli-2.2.1-4.el9_2.x86_64 1/2 Verifying : libnvme-1.2-3.el9_2.x86_64 2/2 Installed products updated. Installed: libnvme-1.2-3.el9_2.x86_64 nvme-cli-2.2.1-4.el9_2.x86_64 Complete!
nvme-cli
のマニュアルは以下をご覧ください。
それでは、NVMeのデバイス一覧を表示します。
$ sudo nvme list Node Generic SN Model Namespace Usage Format FW Rev --------------------- --------------------- -------------------- ---------------------------------------- --------- -------------------------- ---------------- -------- /dev/nvme9n1 /dev/ng9n1 vol01e6f05cc38b00bca Amazon Elastic Block Store 1 7.52 GB / 7.52 GB 512 B + 0 B 1.0 /dev/nvme8n1 /dev/ng8n1 vol0f03216dd39d1ba88 Amazon Elastic Block Store 1 4.29 GB / 4.29 GB 512 B + 0 B 1.0 /dev/nvme7n1 /dev/ng7n1 vol07597c1950ee51fdb Amazon Elastic Block Store 1 5.37 GB / 5.37 GB 512 B + 0 B 1.0 /dev/nvme6n1 /dev/ng6n1 vol0fcf2d0dbfbb379a3 Amazon Elastic Block Store 1 6.44 GB / 6.44 GB 512 B + 0 B 1.0 /dev/nvme5n1 /dev/ng5n1 vol0f0c5b20e39976f7d Amazon Elastic Block Store 1 8.59 GB / 8.59 GB 512 B + 0 B 1.0 /dev/nvme4n1 /dev/ng4n1 vol090468b5a7a9c526b Amazon Elastic Block Store 1 1.07 GB / 1.07 GB 512 B + 0 B 1.0 /dev/nvme3n1 /dev/ng3n1 vol0219674504bdb3dca Amazon Elastic Block Store 1 3.22 GB / 3.22 GB 512 B + 0 B 1.0 /dev/nvme2n1 /dev/ng2n1 vol0bdf46387057b6985 Amazon Elastic Block Store 1 2.15 GB / 2.15 GB 512 B + 0 B 1.0 /dev/nvme1n1 /dev/ng1n1 vol079f22b6d68322c16 Amazon Elastic Block Store 1 9.66 GB / 9.66 GB 512 B + 0 B 1.0 /dev/nvme0n1 /dev/ng0n1 vol00098242ca87f8eb6 Amazon Elastic Block Store 1 10.74 GB / 10.74 GB 512 B + 0 B 1.0 # 詳細の表示 $ sudo nvme list -v Subsystem Subsystem-NQN Controllers ---------------- ------------------------------------------------------------------------------------------------ ---------------- nvme-subsys9 nqn.2014.08.org.nvmexpress:1d0f1d0fvol01e6f05cc38b00bcaAmazon Elastic Block Store nvme9 nvme-subsys8 nqn.2014.08.org.nvmexpress:1d0f1d0fvol0f03216dd39d1ba88Amazon Elastic Block Store nvme8 nvme-subsys7 nqn.2014.08.org.nvmexpress:1d0f1d0fvol07597c1950ee51fdbAmazon Elastic Block Store nvme7 nvme-subsys6 nqn.2014.08.org.nvmexpress:1d0f1d0fvol0fcf2d0dbfbb379a3Amazon Elastic Block Store nvme6 nvme-subsys5 nqn.2014.08.org.nvmexpress:1d0f1d0fvol0f0c5b20e39976f7dAmazon Elastic Block Store nvme5 nvme-subsys4 nqn.2014.08.org.nvmexpress:1d0f1d0fvol090468b5a7a9c526bAmazon Elastic Block Store nvme4 nvme-subsys3 nqn.2014.08.org.nvmexpress:1d0f1d0fvol0219674504bdb3dcaAmazon Elastic Block Store nvme3 nvme-subsys2 nqn.2014.08.org.nvmexpress:1d0f1d0fvol0bdf46387057b6985Amazon Elastic Block Store nvme2 nvme-subsys1 nqn.2014.08.org.nvmexpress:1d0f1d0fvol079f22b6d68322c16Amazon Elastic Block Store nvme1 nvme-subsys0 nqn.2014.08.org.nvmexpress:1d0f1d0fvol00098242ca87f8eb6Amazon Elastic Block Store nvme0 Device SN MN FR TxPort Address Subsystem Namespaces -------- -------------------- ---------------------------------------- -------- ------ -------------- ------------ ---------------- nvme9 vol01e6f05cc38b00bca Amazon Elastic Block Store 1.0 pcie 0000:00:1f.0 nvme-subsys9 nvme9n1 nvme8 vol0f03216dd39d1ba88 Amazon Elastic Block Store 1.0 pcie 0000:00:1e.0 nvme-subsys8 nvme8n1 nvme7 vol07597c1950ee51fdb Amazon Elastic Block Store 1.0 pcie 0000:00:1d.0 nvme-subsys7 nvme7n1 nvme6 vol0fcf2d0dbfbb379a3 Amazon Elastic Block Store 1.0 pcie 0000:00:1c.0 nvme-subsys6 nvme6n1 nvme5 vol0f0c5b20e39976f7d Amazon Elastic Block Store 1.0 pcie 0000:00:1b.0 nvme-subsys5 nvme5n1 nvme4 vol090468b5a7a9c526b Amazon Elastic Block Store 1.0 pcie 0000:00:1a.0 nvme-subsys4 nvme4n1 nvme3 vol0219674504bdb3dca Amazon Elastic Block Store 1.0 pcie 0000:00:19.0 nvme-subsys3 nvme3n1 nvme2 vol0bdf46387057b6985 Amazon Elastic Block Store 1.0 pcie 0000:00:18.0 nvme-subsys2 nvme2n1 nvme1 vol079f22b6d68322c16 Amazon Elastic Block Store 1.0 pcie 0000:00:17.0 nvme-subsys1 nvme1n1 nvme0 vol00098242ca87f8eb6 Amazon Elastic Block Store 1.0 pcie 0000:00:04.0 nvme-subsys0 nvme0n1 Device Generic NSID Usage Format Controllers ------------ ------------ -------- -------------------------- ---------------- ---------------- /dev/nvme9n1 /dev/ng9n1 1 7.52 GB / 7.52 GB 512 B + 0 B nvme9 /dev/nvme8n1 /dev/ng8n1 1 4.29 GB / 4.29 GB 512 B + 0 B nvme8 /dev/nvme7n1 /dev/ng7n1 1 5.37 GB / 5.37 GB 512 B + 0 B nvme7 /dev/nvme6n1 /dev/ng6n1 1 6.44 GB / 6.44 GB 512 B + 0 B nvme6 /dev/nvme5n1 /dev/ng5n1 1 8.59 GB / 8.59 GB 512 B + 0 B nvme5 /dev/nvme4n1 /dev/ng4n1 1 1.07 GB / 1.07 GB 512 B + 0 B nvme4 /dev/nvme3n1 /dev/ng3n1 1 3.22 GB / 3.22 GB 512 B + 0 B nvme3 /dev/nvme2n1 /dev/ng2n1 1 2.15 GB / 2.15 GB 512 B + 0 B nvme2 /dev/nvme1n1 /dev/ng1n1 1 9.66 GB / 9.66 GB 512 B + 0 B nvme1 /dev/nvme0n1 /dev/ng0n1 1 10.74 GB / 10.74 GB 512 B + 0 B nvme0
EBSボリュームIDは確認できますが、/dev/sdb
などのEBSボリュームで指定したデバイス名は出力されていませんね。
EBSボリュームで指定したデバイス名の抽出
EBSボリュームで指定したデバイス名は言うなればAWSというベンダー固有の情報です。そのため、nvme id-ctrl デバイス名 -v
というようにベンダー固有のフィールドを出力させてみます。
$ sudo nvme id-ctrl /dev/nvme1n1 -v NVME Identify Controller: vid : 0x1d0f ssvid : 0x1d0f sn : vol079f22b6d68322c16 mn : Amazon Elastic Block Store fr : 1.0 rab : 32 ieee : a002dc cmic : 0 mdts : 6 cntlid : 0 ver : 0x10000 rtd3r : 0 rtd3e : 0 oaes : 0x100 ctratt : 0 rrls : 0 cntrltype : 0 fguid : 00000000-0000-0000-0000-000000000000 crdt1 : 0 crdt2 : 0 crdt3 : 0 nvmsr : 0 vwci : 0 mec : 0 oacs : 0 acl : 4 aerl : 0 frmw : 0x3 lpa : 0 elpe : 63 npss : 0 avscc : 0x1 apsta : 0 wctemp : 343 cctemp : 0 mtfa : 0 hmpre : 0 hmmin : 0 tnvmcap : 0 unvmcap : 0 rpmbs : 0 edstt : 0 dsto : 0 fwug : 0 kas : 0 hctma : 0 mntmt : 0 mxtmt : 0 sanicap : 0 hmminds : 0 hmmaxd : 0 nsetidmax : 0 endgidmax : 0 anatt : 0 anacap : 0 anagrpmax : 0 nanagrpid : 0 pels : 0 domainid : 0 megcap : 0 sqes : 0x66 cqes : 0x44 maxcmd : 0 nn : 1 oncs : 0 fuses : 0 fna : 0 vwc : 0 awun : 0 awupf : 0 icsvscc : 0 nwpc : 0 acwu : 0 ocfs : 0 sgls : 0 mnan : 0 maxdna : 0 maxcna : 0 subnqn : ioccsz : 0 iorcsz : 0 icdoff : 0 fcatt : 0 msdbd : 0 ofcs : 0 ps 0 : mp:0.01W operational enlat:1000000 exlat:1000000 rrt:0 rrl:0 rwt:0 rwl:0 idle_power:- active_power:- active_power_workload:- vs[]: 0 1 2 3 4 5 6 7 8 9 a b c d e f 0000: 73 64 6a 20 20 20 20 20 20 20 20 20 20 20 20 20 "sdj............." 0010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 "................" 0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 0040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 0050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 0060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 0070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 0080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 0090: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 00a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 00b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 00c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 00d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 00e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 00f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 0100: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 0110: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 0120: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 0130: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 0140: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 0150: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 0160: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 0170: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 0180: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 0190: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 01a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 01b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 01c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 01d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 01e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 01f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 0200: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 0210: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 0220: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 0230: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 0240: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 0250: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 0260: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 0270: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 0280: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 0290: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 02a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 02b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 02c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 02d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 02e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 02f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 0300: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 0310: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 0320: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 0330: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 0340: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 0350: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 0360: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 0370: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 0380: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 0390: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 03a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 03b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 03c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 03d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 03e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................" 03f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "................"
sdj
という文字列が隠れていました。
バイナリで表示してみましょう。
$ sudo nvme id-ctrl /dev/nvme1n1 -v -b vol079f22b6d68322c16Amazon Elastic Block Store 1.0 ��?WfD@B@Bsdj $ sudo nvme id-ctrl /dev/nvme2n1 -v -b vol0bdf46387057b6985Amazon Elastic Block Store 1.0 ��?WfD@B@Bsdc $ sudo nvme id-ctrl /dev/nvme3n1 -v -b vol0219674504bdb3dcaAmazon Elastic Block Store 1.0 ��?WfD@B@Bsdd $ sudo nvme id-ctrl /dev/nvme4n1 -v -b vol090468b5a7a9c526bAmazon Elastic Block Store 1.0 ��?WfD@B@Bsdb
末尾にデバイス名が出てきていますね。
色々試してみるとnvme id-ns デバイス名 -v -b
でも確認できました。
$ sudo nvme id-ns /dev/nvme1n1 -v -b @ sdj vol079f22b6d68322c16 $ sudo nvme id-ns /dev/nvme2n1 -v -b @@@� sdc vol0bdf46387057b6985 $ sudo nvme id-ns /dev/nvme3n1 -v -b ```� sdd vol0219674504bdb3dca $ sudo nvme id-ns /dev/nvme4n1 -v -b @ sdb vol090468b5a7a9c526b[
こちらの方が前後にスペースがあるのでawk
で調理しやすそうですね。
実際にやってみます。
$ sudo nvme id-ns /dev/nvme3n1 -v -b | awk '{print $2}' sdd
EBSボリュームのデバイス名が表示できましたね。
全ブロックデバイスのEBSボリュームのデバイス名を表示してみましょう。
# OSが認識しているNVMeのブロックデバイスの数を取得 $ device_count=$(lsblk -d \ | grep nvme \ | wc -l) # OSが認識しているNVMeのブロックデバイスから対応するEBSボリュームのデバイス名を取得 # grub は16進数で行われるようなので、ブロックデバイス数を16進数に変換 # "warning: command substitution: ignored null byte in input" が出力されたので null を削除 $ for os_device_name in /dev/nvme[0-$(printf '%x\n' $device_count)]n1; do ebs_device_name=$(sudo nvme id-ns "$os_device_name" -v -b | awk '{print $2}' | tr -d '\0') echo "==============================================" echo "OS Device Name : ${os_device_name}" echo "EBS Volume Device Name : ${ebs_device_name}" done ============================================== OS Device Name : /dev/nvme0n1 EBS Volume Device Name : sda1 ============================================== OS Device Name : /dev/nvme1n1 EBS Volume Device Name : ============================================== OS Device Name : /dev/nvme2n1 EBS Volume Device Name : sdc ============================================== OS Device Name : /dev/nvme3n1 EBS Volume Device Name : sdd ============================================== OS Device Name : /dev/nvme4n1 EBS Volume Device Name : ============================================== OS Device Name : /dev/nvme5n1 EBS Volume Device Name : sdi ============================================== OS Device Name : /dev/nvme6n1 EBS Volume Device Name : sdg ============================================== OS Device Name : /dev/nvme7n1 EBS Volume Device Name : sdf ============================================== OS Device Name : /dev/nvme8n1 EBS Volume Device Name : sde ============================================== OS Device Name : /dev/nvme9n1 EBS Volume Device Name : sdh
一部のデバイスは取得できませんでした。
確認してみます。
$ sudo nvme id-ns /dev/nvme1n1 -v -b @ sdj vol079f22b6d68322c16 $ sudo nvme id-ns /dev/nvme4n1 -v -b @ sdb vol090468b5a7a9c526b
出力はされていますね。
しかし、awkだと5列目にあるような認識をされていました。バイナリだからでしょうか。
$ sudo nvme id-ns /dev/nvme4n1 -v -b | awk '{print $5}' sdb $ sudo nvme id-ns /dev/nvme1n1 -v -b | awk '{print $5}' sdj
ということで、awkは難しそうです。
バイナリから直接判断しましょう。
まず、バリナリの何バイトから何バイトまででデバイス名が表示されているのか確認します。
$ sudo nvme id-ctrl /dev/nvme1n1 -v -b | hexdump -C 00000000 0f 1d 0f 1d 76 6f 6c 30 37 39 66 32 32 62 36 64 |....vol079f22b6d| 00000010 36 38 33 32 32 63 31 36 41 6d 61 7a 6f 6e 20 45 |68322c16Amazon E| 00000020 6c 61 73 74 69 63 20 42 6c 6f 63 6b 20 53 74 6f |lastic Block Sto| 00000030 72 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 |re | 00000040 31 2e 30 20 20 20 20 20 20 dc 02 a0 00 06 00 00 |1.0 .......| 00000050 00 00 01 00 00 00 00 00 00 00 00 00 00 01 00 00 |................| 00000060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00000100 00 00 04 00 03 00 3f 00 01 00 57 01 00 00 00 00 |......?...W.....| 00000110 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00000200 66 44 00 00 01 00 00 00 00 00 00 00 00 00 00 00 |fD..............| 00000210 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00000800 01 00 00 00 40 42 0f 00 40 42 0f 00 00 00 00 00 |....@B..@B......| 00000810 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00000c00 73 64 6a 20 20 20 20 20 20 20 20 20 20 20 20 20 |sdj | 00000c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | | 00000c20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00001000
sdj
は16進数で00000c00
から00000c10
までの間に出力されているので、10進数で3072バイトから3088バイトまでですね。
cut
コマンドで抽出してみます。
$ sudo nvme id-ctrl --raw-binary /dev/nvme1n1 | cut -c3072-3088 sdj
抽出できましたね。
全ボリュームで試してみましょう。
# OSが認識しているNVMeのブロックデバイスの数を取得 device_count=$(lsblk -d \ | grep nvme \ | wc -l) # OSが認識しているNVMeのブロックデバイスから対応するEBSボリュームのデバイス名を取得 # grub は16進数で行われるようなので、ブロックデバイス数を16進数に変換 # "warning: command substitution: ignored null byte in input" が出力されたので null を削除 # 末尾にスペースが含まれるため除去 for os_device_name in /dev/nvme[0-$(printf '%x\n' $device_count)]n1; do ebs_device_name=$(sudo nvme id-ctrl "$os_device_name" -v -b | cut -c3072-3088 | tr -d '\0' | sed 's/ //g') echo "==============================================" echo "OS Device Name : ${os_device_name}" echo "EBS Volume Device Name : ${ebs_device_name}" done ============================================== OS Device Name : /dev/nvme0n1 EBS Volume Device Name : sda1 ============================================== OS Device Name : /dev/nvme1n1 EBS Volume Device Name : sdj ============================================== OS Device Name : /dev/nvme2n1 EBS Volume Device Name : sdc ============================================== OS Device Name : /dev/nvme3n1 EBS Volume Device Name : sdd ============================================== OS Device Name : /dev/nvme4n1 EBS Volume Device Name : sdb ============================================== OS Device Name : /dev/nvme5n1 EBS Volume Device Name : sdi ============================================== OS Device Name : /dev/nvme6n1 EBS Volume Device Name : sdg ============================================== OS Device Name : /dev/nvme7n1 EBS Volume Device Name : sdf ============================================== OS Device Name : /dev/nvme8n1 EBS Volume Device Name : sde ============================================== OS Device Name : /dev/nvme9n1 EBS Volume Device Name : sdh
こちらは全ボリュームでマッピングできましたね。バイナリから切り出してデバイス名を抽出するのがよさそうです。
一撃で複数のEBSボリュームを意図したマウントポイントにマウントする
一撃で複数のEBSボリュームを意図したマウントポイントにマウントしてみます。
分かりやすいようにsdb
は/vol2
、sdc
は/vol3
というようにマウントさせます。
# マウントポイントのリストアップ declare -A mount_points=( ["sdb"]="/vol2" ["sdc"]="/vol3" ["sdd"]="/vol4" ["sde"]="/vol5" ["sdf"]="/vol6" ["sdg"]="/vol7" ["sdh"]="/vol8" ["sdi"]="/vol9" ["sdj"]="/vol10" ) # OSが認識しているNVMeのブロックデバイスの数を取得 device_count=$(lsblk -d \ | grep nvme \ | wc -l) # grub は16進数で行われるようなので、ブロックデバイス数を16進数に変換 for os_device_name in /dev/nvme[0-$(printf '%x\n' $device_count)]n1; do # OSが認識しているNVMeのブロックデバイスから対応するEBSボリュームのデバイス名を取得 # "warning: command substitution: ignored null byte in input" が出力されたので null を削除 # 末尾にスペースが含まれるため除去 ebs_device_name=$(sudo nvme id-ctrl "$os_device_name" -v -b | cut -c3072-3088 | tr -d '\0' | sed 's/ //g') echo "==============================================" echo "OS Device Name : ${os_device_name}" echo "EBS Volume Device Name : ${ebs_device_name}" # 配列に対応するマウントポイントがない場合はスキップ if [[ ! -v "mount_points[${ebs_device_name}]" ]]; then echo "No mount points found for ${ebs_device_name}. Skipping" continue fi mount_point=${mount_points["${ebs_device_name#/dev/}"]} echo "Mount Point : ${mount_point}" # xfsでファイルシステムを作成 sudo mkfs.xfs $os_device_name # マウント sudo mkdir -p $mount_point sudo mount $os_device_name $mount_point # /etc/fstab に追記 uuid=$(sudo blkid | grep ${os_device_name} | sed 's/.*UUID="//; s/".*//') echo -e "UUID=${uuid}\t${mount_point}\txfs\tdefaults\t0\t0" | sudo tee -a /etc/fstab sudo systemctl daemon-reload done ============================================== OS Device Name : /dev/nvme0n1 EBS Volume Device Name : sda1 No mount points found for sda1. Skipping ============================================== OS Device Name : /dev/nvme1n1 EBS Volume Device Name : sdj Mount Point : /vol10 meta-data=/dev/nvme1n1 isize=512 agcount=16, agsize=147456 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=1, sparse=1, rmapbt=0 = reflink=1 bigtime=1 inobtcount=1 data = bsize=4096 blocks=2359296, imaxpct=25 = sunit=1 swidth=1 blks naming =version 2 bsize=4096 ascii-ci=0, ftype=1 log =internal log bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=1 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 UUID=07302d63-aeab-46f6-93d6-71efdc417eee /vol10 xfs defaults 0 0 ============================================== OS Device Name : /dev/nvme2n1 EBS Volume Device Name : sdc Mount Point : /vol3 meta-data=/dev/nvme2n1 isize=512 agcount=8, agsize=65536 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=1, sparse=1, rmapbt=0 = reflink=1 bigtime=1 inobtcount=1 data = bsize=4096 blocks=524288, imaxpct=25 = sunit=1 swidth=1 blks naming =version 2 bsize=4096 ascii-ci=0, ftype=1 log =internal log bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=1 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 UUID=0097870f-f5ba-4a53-a1ee-1cf68ea9f746 /vol3 xfs defaults 0 0 ============================================== OS Device Name : /dev/nvme3n1 EBS Volume Device Name : sdd Mount Point : /vol4 meta-data=/dev/nvme3n1 isize=512 agcount=8, agsize=98304 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=1, sparse=1, rmapbt=0 = reflink=1 bigtime=1 inobtcount=1 data = bsize=4096 blocks=786432, imaxpct=25 = sunit=1 swidth=1 blks naming =version 2 bsize=4096 ascii-ci=0, ftype=1 log =internal log bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=1 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 UUID=5c12d789-f201-4337-981b-4214752828c1 /vol4 xfs defaults 0 0 ============================================== OS Device Name : /dev/nvme4n1 EBS Volume Device Name : sdb Mount Point : /vol2 meta-data=/dev/nvme4n1 isize=512 agcount=8, agsize=32768 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=1, sparse=1, rmapbt=0 = reflink=1 bigtime=1 inobtcount=1 data = bsize=4096 blocks=262144, imaxpct=25 = sunit=1 swidth=1 blks naming =version 2 bsize=4096 ascii-ci=0, ftype=1 log =internal log bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=1 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 UUID=5d7a620e-56de-41e5-9ff0-fd389ed2d1c9 /vol2 xfs defaults 0 0 ============================================== OS Device Name : /dev/nvme5n1 EBS Volume Device Name : sdi Mount Point : /vol9 meta-data=/dev/nvme5n1 isize=512 agcount=8, agsize=262144 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=1, sparse=1, rmapbt=0 = reflink=1 bigtime=1 inobtcount=1 data = bsize=4096 blocks=2097152, imaxpct=25 = sunit=1 swidth=1 blks naming =version 2 bsize=4096 ascii-ci=0, ftype=1 log =internal log bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=1 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 UUID=1bf0a0a0-5568-47fb-abf9-327036e5b353 /vol9 xfs defaults 0 0 ============================================== OS Device Name : /dev/nvme6n1 EBS Volume Device Name : sdg Mount Point : /vol7 meta-data=/dev/nvme6n1 isize=512 agcount=8, agsize=196608 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=1, sparse=1, rmapbt=0 = reflink=1 bigtime=1 inobtcount=1 data = bsize=4096 blocks=1572864, imaxpct=25 = sunit=1 swidth=1 blks naming =version 2 bsize=4096 ascii-ci=0, ftype=1 log =internal log bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=1 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 UUID=8d9329db-755f-4573-bb22-6f388b93a753 /vol7 xfs defaults 0 0 ============================================== OS Device Name : /dev/nvme7n1 EBS Volume Device Name : sdf Mount Point : /vol6 meta-data=/dev/nvme7n1 isize=512 agcount=8, agsize=163840 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=1, sparse=1, rmapbt=0 = reflink=1 bigtime=1 inobtcount=1 data = bsize=4096 blocks=1310720, imaxpct=25 = sunit=1 swidth=1 blks naming =version 2 bsize=4096 ascii-ci=0, ftype=1 log =internal log bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=1 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 UUID=9ad02547-47ce-482c-be6f-ed83fd8a1841 /vol6 xfs defaults 0 0 ============================================== OS Device Name : /dev/nvme8n1 EBS Volume Device Name : sde Mount Point : /vol5 meta-data=/dev/nvme8n1 isize=512 agcount=8, agsize=131072 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=1, sparse=1, rmapbt=0 = reflink=1 bigtime=1 inobtcount=1 data = bsize=4096 blocks=1048576, imaxpct=25 = sunit=1 swidth=1 blks naming =version 2 bsize=4096 ascii-ci=0, ftype=1 log =internal log bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=1 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 UUID=20e3b918-133a-47af-b828-e3900f5faa45 /vol5 xfs defaults 0 0 ============================================== OS Device Name : /dev/nvme9n1 EBS Volume Device Name : sdh Mount Point : /vol8 meta-data=/dev/nvme9n1 isize=512 agcount=8, agsize=229376 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=1, sparse=1, rmapbt=0 = reflink=1 bigtime=1 inobtcount=1 data = bsize=4096 blocks=1835008, imaxpct=25 = sunit=1 swidth=1 blks naming =version 2 bsize=4096 ascii-ci=0, ftype=1 log =internal log bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=1 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 UUID=1d70f256-7be4-4e8a-8da9-baf28d4321b8 /vol8 xfs defaults 0 0
無事に実行完了しました。
マウントできているか確認しましょう。
$ df -hT Filesystem Type Size Used Avail Use% Mounted on devtmpfs devtmpfs 4.0M 0 4.0M 0% /dev tmpfs tmpfs 372M 0 372M 0% /dev/shm tmpfs tmpfs 149M 11M 139M 7% /run /dev/nvme0n1p4 xfs 9.4G 1.9G 7.5G 20% / /dev/nvme0n1p3 xfs 495M 164M 331M 34% /boot /dev/nvme0n1p2 vfat 200M 8.0K 200M 1% /boot/efi /dev/nvme1n1 xfs 9.0G 98M 8.9G 2% /vol10 /dev/nvme2n1 xfs 2.0G 47M 2.0G 3% /vol3 /dev/nvme3n1 xfs 3.0G 54M 3.0G 2% /vol4 /dev/nvme4n1 xfs 1014M 40M 975M 4% /vol2 /dev/nvme5n1 xfs 8.0G 90M 8.0G 2% /vol9 /dev/nvme6n1 xfs 6.0G 76M 6.0G 2% /vol7 /dev/nvme7n1 xfs 5.0G 69M 5.0G 2% /vol6 /dev/nvme8n1 xfs 4.0G 62M 4.0G 2% /vol5 /dev/nvme9n1 xfs 7.0G 83M 7.0G 2% /vol8
マウントできていますね。
ただ、こちらだと指定したブロックデバイス名に意図したマウントポイントをマウントしているのか分かりづらいので、ボリュームサイズの昇順でソートしてあげます。
$ lsblk -d | sort -n -k 4 NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS nvme4n1 259:9 0 1G 0 disk /vol2 nvme2n1 259:6 0 2G 0 disk /vol3 nvme3n1 259:7 0 3G 0 disk /vol4 nvme8n1 259:12 0 4G 0 disk /vol5 nvme7n1 259:11 0 5G 0 disk /vol6 nvme6n1 259:10 0 6G 0 disk /vol7 nvme9n1 259:13 0 7G 0 disk /vol8 nvme5n1 259:8 0 8G 0 disk /vol9 nvme1n1 259:5 0 9G 0 disk /vol10 nvme0n1 259:0 0 10G 0 disk
sdb
の1GiBのボリュームは/vol2
、sdc
の2GiBのボリュームは/vol3
と意図した通りにマウントできていることが分かります。
/etc/fstab
も確認します。
$ cat /etc/fstab UUID=fac724b7-ede8-4b39-aff9-44db8e22c0f1 / xfs defaults 0 0 UUID=2e756c58-7b6e-4700-8a89-b9ab3e1058f1 /boot xfs defaults 0 0 UUID=7B77-95E7 /boot/efi vfat defaults,uid=0,gid=0,umask=077,shortname=winnt 0 2 UUID=07302d63-aeab-46f6-93d6-71efdc417eee /vol10 xfs defaults 0 0 UUID=0097870f-f5ba-4a53-a1ee-1cf68ea9f746 /vol3 xfs defaults 0 0 UUID=5c12d789-f201-4337-981b-4214752828c1 /vol4 xfs defaults 0 0 UUID=5d7a620e-56de-41e5-9ff0-fd389ed2d1c9 /vol2 xfs defaults 0 0 UUID=1bf0a0a0-5568-47fb-abf9-327036e5b353 /vol9 xfs defaults 0 0 UUID=8d9329db-755f-4573-bb22-6f388b93a753 /vol7 xfs defaults 0 0 UUID=9ad02547-47ce-482c-be6f-ed83fd8a1841 /vol6 xfs defaults 0 0 UUID=20e3b918-133a-47af-b828-e3900f5faa45 /vol5 xfs defaults 0 0 UUID=1d70f256-7be4-4e8a-8da9-baf28d4321b8 /vol8 xfs defaults 0 0
良い感じに記述されていそうですね。
一度アンマウントして、/etc/fstab
の設定内容にしたがって再マウントさせてみます。
# アンマウント $ sudo umount /vol* # アンマウントされたことを確認 $ df -hT Filesystem Type Size Used Avail Use% Mounted on devtmpfs devtmpfs 4.0M 0 4.0M 0% /dev tmpfs tmpfs 372M 0 372M 0% /dev/shm tmpfs tmpfs 149M 11M 139M 7% /run /dev/nvme0n1p4 xfs 9.4G 1.9G 7.5G 20% / /dev/nvme0n1p3 xfs 495M 164M 331M 34% /boot /dev/nvme0n1p2 vfat 200M 8.0K 200M 1% /boot/efi tmpfs tmpfs 75M 0 75M 0% /run/user/0 /etc/fstab`の設定内容にしたがって再マウント [ec2-user@ip-10-10-10-30 ~]$ sudo mount -a # 再マウントできたことを確認 $ df -hT Filesystem Type Size Used Avail Use% Mounted on devtmpfs devtmpfs 4.0M 0 4.0M 0% /dev tmpfs tmpfs 372M 0 372M 0% /dev/shm tmpfs tmpfs 149M 11M 139M 7% /run /dev/nvme0n1p4 xfs 9.4G 1.9G 7.5G 20% / /dev/nvme0n1p3 xfs 495M 164M 331M 34% /boot /dev/nvme0n1p2 vfat 200M 8.0K 200M 1% /boot/efi tmpfs tmpfs 75M 0 75M 0% /run/user/0 /dev/nvme1n1 xfs 9.0G 98M 8.9G 2% /vol10 /dev/nvme2n1 xfs 2.0G 47M 2.0G 3% /vol3 /dev/nvme3n1 xfs 3.0G 54M 3.0G 2% /vol4 /dev/nvme4n1 xfs 1014M 40M 975M 4% /vol2 /dev/nvme5n1 xfs 8.0G 90M 8.0G 2% /vol9 /dev/nvme6n1 xfs 6.0G 76M 6.0G 2% /vol7 /dev/nvme7n1 xfs 5.0G 69M 5.0G 2% /vol6 /dev/nvme8n1 xfs 4.0G 62M 4.0G 2% /vol5 /dev/nvme9n1 xfs 7.0G 83M 7.0G 2% /vol8
問題なく再マウントできました。
NVMeの情報に記載のEBSボリュームのデバイス名を活用しよう
RHELのEC2インスタンスにおいて、EBSボリュームのデバイス名とOSが認識しているブロックデバイス名をマッピングさせてマウントしてみました。
NVMeの情報に記載のEBSボリュームのデバイス名を活用しましょう。
AWS CDKで一気にデプロイする時もユーザーデータに以下のようなスクリプトを仕組んでおけば、意図した通りにマウントポイントにEBSボリュームをマウントしてくれそうです。
# マウントポイントのリストアップ declare -A mount_points=( ["EBSボリュームに指定したデバイス名"]="マウントポイント" ) for os_device_name in /dev/nvme*n1; do # OSが認識しているNVMeのブロックデバイスから対応するEBSボリュームのデバイス名を取得 # "warning: command substitution: ignored null byte in input" が出力されたので null を削除 # 末尾にスペースが含まれるため除去 ebs_device_name=$(sudo nvme id-ctrl "$os_device_name" -v -b | cut -c3072-3088 | tr -d '\0' | sed 's/ //g') echo "==============================================" echo "OS Device Name : ${os_device_name}" echo "EBS Volume Device Name : ${ebs_device_name}" # 配列に対応するマウントポイントがない場合はスキップ if [[ ! -v "mount_points[${ebs_device_name}]" ]]; then echo "No mount points found for ${ebs_device_name}. Skipping" continue fi mount_point=${mount_points["${ebs_device_name}"]} echo "Mount Point : ${mount_point}" # xfsでファイルシステムを作成 sudo mkfs.xfs $os_device_name # マウント sudo mkdir -p $mount_point sudo mount $os_device_name $mount_point # /etc/fstab に追記 uuid=$(sudo blkid | grep ${os_device_name} | sed 's/.*UUID="//; s/".*//') echo -e "UUID=${uuid}\t${mount_point}\txfs\tdefaults\t0\t0" | sudo tee -a /etc/fstab sudo systemctl daemon-reload done
ちなみにこちらの手法はt2.microなどの非Nitroインスタンスでは使用出来ません。非Nitroインスタンスの場合はOSが認識するデバイス名はnvme[0-26]n1
ではなくxvd[a-d][a-z]
となります。
EBS ボリュームは、Nitro System上に構築されたインスタンスで NVMe ブロックデバイスとして公開されます。デバイス名は、/dev/nvme0n1、/dev/nvme1n1 などです。ブロックデバイスマッピングで指定したデバイス名は、NVMe デバイス名 (/dev/nvme[0-26]n1) を使用して名称変更されます。ブロックデバイスドライバーは、ブロックデバイスマッピングのボリュームに指定した順序とは異なる順序で NVMe デバイス名を割り当てることができます。
Linux インスタンスの Amazon EBS および NVMe - Amazon Elastic Compute Cloud
実際に、t2.micro
に変更して起動すると以下のようにxvdb
などとデバイス名が変わっていました。
$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS xvda 202:0 0 10G 0 disk ├─xvda1 202:1 0 1M 0 part ├─xvda2 202:2 0 200M 0 part /efi │ /boot/efi ├─xvda3 202:3 0 500M 0 part /boot └─xvda4 202:4 0 9.3G 0 part / xvdb 202:16 0 1G 0 disk /vol2 xvdc 202:32 0 2G 0 disk /vol3 xvdd 202:48 0 3G 0 disk /vol4 xvde 202:64 0 4G 0 disk /vol5 xvdf 202:80 0 5G 0 disk /vol6 xvdg 202:96 0 6G 0 disk /vol7 xvdh 202:112 0 7G 0 disk /vol8 xvdi 202:128 0 8G 0 disk /vol9 xvdj 202:144 0 9G 0 disk /vol10 $ ls -l /dev | grep sd
NVMe デバイスとして認識されていないので、nvme-cli
で判別することは出来ません。
$ sudo nvme list Failed to scan topology: No such file or directory
Linuxインスタンスのデバイス名は以下AWS公式ドキュメントをご覧ください。
この記事が誰かの助けになれば幸いです。
以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!