

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

# Amazon EBS 卷和 NVMe
<a name="nvme-ebs-volumes"></a>

Amazon EBS 卷在基于 [AWS Nitro 系统](https://docs.aws.amazon.com/ec2/latest/instancetypes/ec2-nitro-instances.html)构建的 Amazon EC2 实例上显示为 NVMe 块设备。要充分利用显示为 NVMe 块设备的 Amazon EBS 卷的性能和功能，EC2 实例必须安装 AWS NVMe 驱动程序。所有当前一代 AWS Windows 和 Linux AMI 都默认安装有 AWS NVMe 驱动程序。

如果您使用的 AMI 没有 AWS NVMe 驱动程序，则可以手动安装它。有关更多信息，请参阅《*Amazon EC2 用户指南*》中的 [AWS NVMe 驱动程序](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/aws-nvme-drivers.html)。

**Linux 实例**  
设备名称为 `/dev/nvme0n1`、`/dev/nvme1n1`，以此类推。您在块设备映射中指定的设备名称将使用 NVMe 设备名称（`/dev/nvme[0-26]n1`）进行重命名。块储存设备驱动程序可以使用不同于您在块储存设备映射中为卷指定的顺序来分配 NVMe 设备名称。

**Windows 实例**  
当您将卷附加到实例时，需要为卷提供设备名称。该设备名称由 Amazon EC2 使用。实例的块设备驱动程序会在挂载卷时分配实际的卷名称，指定的名称可以与 Amazon EC2 使用的名称不同。

**Topics**
+ [将 Amazon EBS 卷映射到 NVMe 设备名称](identify-nvme-ebs-device.md)
+ [Amazon EBS 卷的 NVMe I/O 操作超时](timeout-nvme-ebs-volumes.md)
+ [Amazon EBS 卷的 NVMe Abort 命令](abort-command.md)

# 将 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.aws.amazon.com/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` 工具包含在 AWS 中的最新 `C:\ProgramData\Amazon\Tools` 提供的 Windows Server AMI。

从 AWS NVMe 驱动程序包 `1.5.0,` 开始，`ebsnvme-id` 工具的最新版本由驱动程序包安装。最新版本仅在驱动程序包中可用。`ebsnvme-id` 工具的独立下载链接将不再接收更新。通过独立链接提供的最新版本是 `1.1.0`，可使用 [ebsnvme-id.zip](https://s3.amazonaws.com/ec2-windows-drivers-downloads/EBSNVMeID/Latest/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
```

# Amazon EBS 卷的 NVMe I/O 操作超时
<a name="timeout-nvme-ebs-volumes"></a>

大多数操作系统为提交到 NVMe 设备的 I/O 操作指定一个超时。

**Linux 实例**  
在 Linux 上，挂载到基于 Nitro 系统的实例的 EBS 卷使用操作系统提供的默认 NVMe 驱动程序。大多数操作系统为提交到 NVMe 设备的 I/O 操作指定一个超时。默认超时为 30 秒，可以使用 `nvme_core.io_timeout` 引导参数更改该超时。对于 4.6 版之前的大多数 Linux 内核版本，此参数为 `nvme.io_timeout`。

如果 I/O 延迟超过了此超时参数的值，则 Linux NVMe 驱动程序会使 I/O 失败，并将错误返回文件系统或应用程序。根据 I/O 操作，您的文件系统或应用程序可以重试错误。在某些情况下，您的文件系统可能会通过只读方式重新挂载。

为了获得与附加到 Xen 实例的 EBS 卷类似的体验，我们建议将 `nvme_core.io_timeout` 设置为可能的最大值。对于当前内核，最大值为 4294967295，而对于较早的内核，最大值为 255。根据 Linux 版本的不同，超时时间可能已设置为支持的最大值。例如，对于 Amazon Linux AMI 2017.09.01 以及更高的版本，超时时间默认设置为 4294967295。

您可以通过将高于建议最大值的值写入 `/sys/module/nvme_core/parameters/io_timeout` 并在尝试保存文件时检查数值结果超出范围错误，以此来验证您的 Linux 发行版的最大值。

**Windows 实例**  
在 Windows 上，默认超时为 60 秒，最大超时为 255 秒。您可以使用 [SCSI 微端口驱动程序的注册表项](https://learn.microsoft.com/en-us/previous-versions/windows/drivers/storage/registry-entries-for-scsi-miniport-drivers)中所述的步骤修改 `TimeoutValue` 磁盘类注册表设置。

# Amazon EBS 卷的 NVMe Abort 命令
<a name="abort-command"></a>

`Abort` 命令是一个 NVMe 管理员命令，用于结束之前提交给控制器的特定命令。此命令通常由设备驱动程序向超过输入/输出操作超时阈值的存储设备发出。

在向挂载的 Amazon EBS 卷发出 `Abort` 命令时，默认支持 `Abort` 命令的 Amazon EC2 实例类型将结束先前提交给控制器的特定命令。在向挂载的 Amazon EBS 卷发出 `Abort` 命令时，不支持 `Abort` 命令的 Amazon EC2 实例不会采取任何措施。

以下对象支持 `Abort` 命令：
+ 具有 NVMe 设备版本 1.4 或更高版本的 Amazon EBS 设备。
+ 所有 Amazon EC2 实例，但基于 Xen 的实例类型和以下基于 Nitro 的实例类型**除外**：
  + 通用型：A1 \$1 M5 \$1 M5a \$1 M5ad \$1 M5d \$1 M5dn \$1 M5n \$1 M5zn \$1 M6g \$1 M6gd \$1 Mac1 \$1 Mac2 \$1 T3 \$1 T3a \$1 T4g
  + 计算优化型：C5 \$1 c5a \$1 C5ad \$1 C5d \$1 C5n \$1 C6g \$1 C6gd
  + 内存优化型：R5 \$1 R5a \$1 R5ad \$1 R5d \$1 R5dn \$1 R5n \$1 R6g \$1 R6gd \$1 U-12tb1 \$1 U-18tb1 \$1 U-24tb1 \$1 U-3tb1 \$1 U-6tb1 \$1 U-9tb1 \$1 X2gd \$1 X2iezn \$1 Z1d
  + 存储优化：D3 \$1 D3en \$1 I3en
  + 加速计算型：DL1 \$1 G4ad \$1 G4dn \$1 G5 \$1 G5g \$1 Inf1 \$1 P3dn \$1 P4d \$1 P4de \$1 VT1

有关更多信息，请参阅 [NVM Express 基本规范](https://nvmexpress.org/wp-content/uploads/NVM-Express-1_4-2019.06.10-Ratified.pdf)的第 **5.1 节 Abort 命令**。