amazon-web-servicesamazon-ec2redhatrhelamazon-ebs

correctly specifying Device Name for EBS volume while attaching to an ec2 instance and identifying it later using Device name


I am trying to attach an EBS volume on EC2 (RHEL) instance. This is how my attach-volume command looks like:

aws ec2 attach-volume --volume-id vol-xxxxxxxxxxxxxxxxx --instance-id i-yyyyyyyyyyyyyyyyy --device /dev/sdf
{
    "AttachTime": "2021-12-02T19:30:13.070000+00:00",
    "Device": "/dev/sdf",
    "InstanceId": "i-yyyyyyyyyyyyyyyyy ",
    "State": "attaching",
    "VolumeId": "vol-xxxxxxxxxxxxxxxxx "
}

this is the output of lsblk

NAME                   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme1n1                259:0    0   5G  0 disk
└─aaaaa-aaa            253:2    0   5G  0 lvm  /logs
nvme0n1                259:1    0  10G  0 disk
├─nvme0n1p1            259:2    0   1M  0 part
└─nvme0n1p2            259:3    0  10G  0 part /
nvme3n1                259:4    0  35G  0 disk
├─bbbbb-bbb            253:3    0   8G  0 lvm  [SWAP]
├─bbbbb-ccc            253:4    0   4G  0 lvm  /var/tmp
├─bbbbb-ddd            253:5    0   4G  0 lvm  /var
├─bbbbb-eee            253:6    0   4G  0 lvm  /var/log
nvme2n1                259:5    0   5G  0 disk
└─ccccc-ffff           253:0    0   5G  0 lvm  /products
nvme4n1                259:6    0   5G  0 disk
└─ddddd-gggg           253:1    0   5G  0 lvm  /apps
nvme5n1                259:7    0  20G  0 disk

Even though I specified device name as /dev/sdf, it shows up as nvme5n1. This makes it difficult for me to identify the newly attached EBS volume and mount it.

I tried aws ec2 attach-volume --volume-id vol-xxxxxxxxxxxxxxxxx --instance-id i-yyyyyyyyyyyyyyyyy --device /dev/nvme5n1 but that gives me an error saying /dev/nvme5n1 is not a valid EBS device name.

Is there a way I can identify the right name of the EBS volume I just attached so that I can mount it to the directory I desire?


Solution

  • EBS volumes are exposed as NVMe block devices on instances built on the Nitro System.

    On an older instance type you might see something like:

    $ lsblk 
    NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    xvda    202:0    0  160G  0 disk 
    └─xvda1 202:1    0  160G  0 part /
    

    On a Nitro-based instance you'll see something similar to what you provided above.

    With Amazon Linux AMIs later than version 2017.09.01, we provide a udev rule that reads this data and creates a symbolic link to the block-device mapping.

    $ lsblk 
    NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    nvme0n1       259:0    0  120G  0 disk 
    ├─nvme0n1p1   259:1    0  120G  0 part /
    └─nvme0n1p128 259:2    0    1M  0 part 
    $ ls -l /dev/xvda
    lrwxrwxrwx 1 root root 7 Dec  3 08:59 /dev/xvda -> nvme0n1
    

    If you are using an Amazon Linux or FreeBSD AMI, use the sudo ebsnvme-id /dev/nvme0n1 -u command for a consistent NVMe device name. For other distributions, use the sudo ebsnvme-id /dev/nvme0n1 -u command to determine the NVMe device name.

    $ sudo ebsnvme-id /dev/nvme0n1
    xvda
    

    You could enumerate all the NVMe devices and check for the one that has the associated device name. Perhaps with something like:

    $ DEV=xvda
    $ lsblk | grep disk | awk '{print $1}' | while read disk; do echo -n "$disk " && sudo ebsnvme-id -b /dev/$disk; done | grep $DEV | awk '{print $1}'
    nvme0n1
    

    For more information on device naming see the Amazon EBS and NVMe on Linux instances documentation.