

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 将 Amazon EBS 卷映射到 NVMe 设备名称
<a name="identify-nvme-ebs-device"></a>

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

## Linux 实例
<a name="ebs-nvme-linux"></a>

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

建议您在实例中为 EBS 卷使用静态标识符，例如以下之一：
+ 对基于 Nitro 的实例，您在附加 EBS 卷或者在 `AttachVolume` 或 `RunInstances` 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 卷可供使用](ebs-using-volumes.md)和[从错误的卷启动](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/instance-booting-from-wrong-volume.html)。

**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`）或磁盘设备的名称（例如，`nvd0` 或 `nda0`）。FreeBSD 还创建到磁盘设备的符号链接（例如，`/dev/aws/disk/ebs/`*volume\$1id*）。

**其他 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
```

## Windows 实例
<a name="ebs-nvme-windows"></a>

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

```
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
```