将 Amazon EBS 卷映射到 NVMe 设备名称 - Amazon EBS

将 Amazon EBS 卷映射到 NVMe 设备名称

EBS 使用单一根 I/O 虚拟化(SR-IOV)在使用 NVMe 规范的基于 Nitro 的实例上提供卷附加。这些设备依赖于操作系统上的标准 NVMe 驱动程序。这些驱动程序通常在实例启动期间发现附加的设备,然后根据设备响应的顺序创建设备节点,而不是按照在块设备映射中指定设备的顺序。

在 Linux 中,NVMe 设备名称遵循 /dev/nvme<x>n<y> 模式,其中 <x> 是枚举顺序,对于 EBS,<y> 为 1。有时候,在接下来的实例启动时,设备会以不同顺序响应发现过程,这会导致设备名称更改。此外,块储存设备驱动程序分配的设备名称可以不同于块储存设备映射中指定的名称。

建议您在实例中为 EBS 卷使用静态标识符,例如以下之一:

  • 对基于 Nitro 的实例,您在附加 EBS 卷或者在 AttachVolumeRunInstances API 调用期间通过 Amazon EC2 控制台指定的块储存设备映射,将在 NVMe 控制器标识的供应商特定数据字段中捕获。对版本高于 2017.09.01 的 Amazon Linux AMI,我们提供了 udev 规则,该规则读取此数据并创建指向块储存设备映射的符号链接。

  • EBS 卷 ID 和挂载点在实例状态更改之间保持稳定。NVMe 设备名称可以根据设备在实例启动期间响应的顺序进行更改。我们建议使用 EBS 卷 ID 和挂载点以实现一致的设备标识。

  • NVMe EBS 卷在设备标识中将 EBS 卷 ID 设置为序列号。使用 lsblk -o +SERIAL 命令列出序列号。

  • NVMe 设备名称格式可能会有所不同,具体取决于 EBS 卷是在实例启动期间还是之后附上。实例启动后附上卷的 NVMe 设备名称包括 /dev/ 前缀,而实例启动期间附上卷的 NVMe 设备名称不包括 /dev/ 前缀。

    • 对于 Amazon Linux 或 FreeBSD AMI,请使用 sudo ebsnvme-id /dev/nvme0n1 -u 命令获得一致的 NVMe 设备名称。

    • 对于其他发布版本,请使用 sudo nvme id-ctrl -V /dev/nvme0n1 命令确定 NVMe 设备名称。您可能需要包含 --vendor-specific 命令选项。

  • 格式化设备时,将生成在文件系统的使用寿命内保持的 UUID。此时可指定设备标签。有关更多信息,请参阅使 Amazon EBS 卷可供使用从错误的卷启动

Amazon Linux AMI

利用 Amazon Linux AMI 2017.09.01 或更高版本(包括 Amazon Linux 2),您可以按下面所示运行 ebsnvme-id 命令以将 NVMe 设备名称映射到卷 ID 和设备名称:

以下示例显示实例启动期间附上的卷的命令和输出。请注意,NVMe 设备名称不包括 /dev/ 前缀。

[ec2-user ~]$ sudo /sbin/ebsnvme-id /dev/nvme0n1 Volume ID: vol-01324f611e2463981 sda

以下示例显示实例启动后附上的卷的命令和输出。请注意,NVMe 设备名称包括 /dev/ 前缀。

[ec2-user ~]$ sudo /sbin/ebsnvme-id /dev/nvme1n1 Volume ID: vol-064784f1011136656 /dev/sdf

Amazon Linux 还将创建从块储存设备映射中的设备名称(例如,/dev/sdf)到 NVMe 设备名称的符号链接。

FreeBSD AMI

从 FreeBSD 12.2-RELEASE 开始,您可以运行如上所示的 ebsnvme-id 命令。传递 NVMe 设备的名称(例如,nvme0)或磁盘设备的名称(例如,nvd0nda0)。FreeBSD 还创建到磁盘设备的符号链接(例如,/dev/aws/disk/ebs/volume_id)。

其他 Linux AMI

利用内核版本 4.2 或更高版本,您可以按下面所示运行 nvme id-ctrl 命令以将 NVMe 设备映射到卷 ID。首先,使用您的 Linux 发行版的程序包管理工具安装 NVMe 命令行程序包 nvme-cli。有关其他发行版的下载和安装说明,请参阅特定于您的发行版的文档。

以下示例将获取实例启动期间附上的卷的卷 ID 和 NVMe 设备名称。请注意,NVMe 设备名称不包括 /dev/ 前缀。设备名称通过特定于 NVMe 控制器供应商的扩展(控制器标识的字节 384:4095)提供:

[ec2-user ~]$ sudo nvme id-ctrl -V /dev/nvme0n1 NVME Identify Controller: vid : 0x1d0f ssvid : 0x1d0f sn : vol01234567890abcdef mn : Amazon Elastic Block Store ... 0000: 2f 64 65 76 2f 73 64 6a 20 20 20 20 20 20 20 20 "sda..."

以下示例将获取实例启动后附上的卷的卷 ID 和 NVMe 设备名称。请注意,NVMe 设备名称包括 /dev/ 前缀。

[ec2-user ~]$ sudo nvme id-ctrl -V /dev/nvme1n1 NVME Identify Controller: vid : 0x1d0f ssvid : 0x1d0f sn : volabcdef01234567890 mn : Amazon Elastic Block Store ... 0000: 2f 64 65 76 2f 73 64 6a 20 20 20 20 20 20 20 20 "/dev/sdf..."

lsblk 命令可列出可用设备及其挂载点(如果适用)。这有助于确定要使用的正确设备名称。在本示例中,/dev/nvme0n1p1 作为根设备挂载,/dev/nvme1n1 会附加但不会挂载。

[ec2-user ~]$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT nvme1n1 259:3 0 100G 0 disk nvme0n1 259:0 0 8G 0 disk nvme0n1p1 259:1 0 8G 0 part / nvme0n1p128 259:2 0 1M 0 part

您可以运行 ebsnvme-id 命令以将 NVMe 设备磁盘编号映射到 EBS 卷 ID 和设备名称。默认情况下,枚举所有 EBS NVMe 设备。您可以传递磁盘编号以枚举特定设备的信息。ebsnvme-id 工具包含在 AWS 中的最新 C:\ProgramData\Amazon\Tools 提供的 Windows Server AMI。

从 AWS NVMe 驱动程序包 1.5.0, 开始,ebsnvme-id 工具的最新版本由驱动程序包安装。最新版本仅在驱动程序包中可用。ebsnvme-id 工具的独立下载链接将不再接收更新。通过独立链接提供的最新版本是 1.1.0,可使用 ebsnvme-id.zip 链接下载,并将内容提取到 Amazon EC2 实例以访问 ebsnvme-id.exe

PS C:\ProgramData\Amazon\Tools> ebsnvme-id.exe Disk Number: 0 Volume ID: vol-0d6d7ee9f6e471a7f Device Name: sda1 Disk Number: 1 Volume ID: vol-03a26248ff39b57cf Device Name: xvdd Disk Number: 2 Volume ID: vol-038bd1c629aa125e6 Device Name: xvde Disk Number: 3 Volume ID: vol-034f9d29ec0b64c89 Device Name: xvdb Disk Number: 4 Volume ID: vol-03e2dbe464b66f0a1 Device Name: xvdc
PS C:\ProgramData\Amazon\Tools> ebsnvme-id.exe 4 Disk Number: 4 Volume ID: vol-03e2dbe464b66f0a1 Device Name: xvdc