Amazon EBS 和 NVMe - Amazon EBS

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

Amazon EBS 和 NVMe

EBS 卷作为 NVMe 块存储设备在基于 Nitro 系统构建的实例上公开。

无论块设备接口如何,Amazon EBS 产品详细信息中所述的 EBS 性能指南都有效。

Linux 实例

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

Windows 实例

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

安装或升级 NVMe 驱动程序

要访问 NVMe 卷,必须安装 NVMe 驱动程序。实例可以支持 NVMe EBS 卷和 NVMe 实例存储卷(要么两种类型的 NVMe 卷均支持,要么均不支持)。有关更多信息,请参阅联网和存储功能摘要

以下 AMI 包含所需的 NVMe 驱动程序:

  • Amazon Linux 2

  • Amazon Linux AMI 2018.03

  • Ubuntu 14.04 或更高版本(采用 linux-aws 内核)

    注意

    AWS 基于 Graviton 的实例类型需要带内核的 Ubuntu 18.04 或更高版本 linux-aws

  • Red Hat Enterprise Linux 6.5 或更高版本

  • Red Hat Enterprise Linux 7.4 或更高版本

  • SUSE Linux Enterprise Server 12 SP2 或更高版本

  • CentOS 7.4.1708 或更高版本

  • FreeBSD 11.1 或更高版本

  • Debian GNU/Linux 9 或更高版本

确认实例具有 NVMe 驱动程序

您可以使用以下命令确认您的实例是否具有 NVMe 驱动程序。

  • Amazon Linux、RHEL、CentOS 和 SUSE Linux Enterprise Server

    $ modinfo nvme

    如果实例具有 NVMe 驱动程序,则该命令将返回有关该驱动程序的信息。

  • Amazon Linux 2 和 Ubuntu

    $ ls /sys/module/ | grep nvme

    如果实例具有 NVMe 驱动程序,该命令将返回已安装的驱动程序。

更新 NVMe 驱动程序

如果您的实例具有 NVMe 驱动程序,您可以使用以下过程将驱动程序更新到最新版本。

  1. 连接到您的 实例。

  2. 更新程序包缓存以获取必需程序包更新,如下所示。

    • 对于 Amazon Linux 2、Amazon Linux、CentOS 和 Red Hat Enterprise Linux:

      [ec2-user ~]$ sudo yum update -y
    • 对于 Ubuntu 和 Debian:

      [ec2-user ~]$ sudo apt-get update -y
  3. Ubuntu 16.04 及更高版本包含 linux-aws 程序包,该程序包包含基于 Nitro 的实例所需的 NVMe 和 ENA 驱动程序。升级 linux-aws 程序包以接收最新版本,如下所示:

    [ec2-user ~]$ sudo apt-get install --only-upgrade -y linux-aws

    对于 Ubuntu 14.04,您可以安装最新的 linux-aws 程序包,如下所示:

    [ec2-user ~]$ sudo apt-get install linux-aws
  4. 重启实例以加载最新内核版本。

    sudo reboot
  5. 重启之后重新连接到实例。

AWS 适用于 Windows Server 2008 R2 及更高版本的 Windows AMI 包括 AWS NVMe 驱动程序。如果您使用的不是亚马逊提供的最新 AWS Windows AMI,请参阅亚马逊 EC2 Windows 实例用户指南 PowerShell中的使用安装或升级 AWS NVMe 驱动程序

识别 EBS 设备

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 设备名称。

  • 格式化设备时,将生成在文件系统的使用寿命内保持的 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 提供的 Windows 服务器 AMI 中,位于。C:\PROGRAMDATA\AMAZON\Tools

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

PS C:\Users\Administrator\Desktop> 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:\Users\Administrator\Desktop> ebsnvme-id.exe 4 Disk Number: 4 Volume ID: vol-03e2dbe464b66f0a1 Device Name: xvdc

使用 NVMe EBS 卷

要格式化并挂载 NVMe EBS 卷,请参阅 使 Amazon EBS 卷可供使用

Linux 实例

如果您使用的是 Linux 内核 4.2 或更高版本,您对 NVMe EBS 卷的卷大小进行的所有更改将自动在实例中反映。对于旧版 Linux 内核,您可能需要分离然后附加 EBS 卷或者重启实例才能反映大小更改。对于 Linux 内核 3.19 或更高版本,您可以按下面所示使用 hdparm 命令强制重新扫描 NVMe 设备:

[ec2-user ~]$ sudo hdparm -z /dev/nvme1n1

当您分离 NVMe EBS 卷时,实例在分离卷之前将没有机会刷新文件系统缓存或元数据。在分离 NVMe EBS 卷之前,您应该首先同步并卸载它。如果卷无法分离,您可以按照force-detach中所述尝试执行 将 Amazon EBS 卷与实例分离 命令。

Windows 实例

最新的 AWS Windows AMI 包含将 EBS 卷作为 AWS NVMe 块储存设备的实例类型所必需的 NVMe 驱动程序。但是,如果您调整了 Windows 系统上的根卷的大小,则必须重新扫描该卷才能在实例中体现此更改。如果您从其他 AMI 启动实例,则该实例可能不包含所需的 AWS NVMe 驱动程序。如果您的实例没有最新的 AWS NVMe 驱动程序,则必须安装它。有关更多信息,请参阅适用于 Windows 实例的AWS NVMe 驱动程序

I/O 操作超时

大多数操作系统为提交到 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 微端口驱动程序的注册表项中所述的步骤修改 TimeoutValue 磁盘类注册表设置。

Abort 命令

Abort 命令是一个 NVMe 管理员命令,用于中止之前提交给控制器的特定命令。此命令通常由设备驱动程序向超过输入/输出操作超时阈值的存储设备发出。默认支持 Abort 命令的 Amazon EC2 实例类型,将中止先前提交给已向其发出 Abort 命令的所附加 Amazon EBS 设备的控制器的特定命令。

默认情况下,以下实例类型支持所有附加的 Amazon EBS 卷的 Abort 命令:R5bR6iM6iM6aC6gnC6iX2gdX2ieznIm4gnIs4gen

向附加的 Amazon EBS 卷发出 Abort 命令时,其他实例类型不采取任何操作。

NVMe 设备为 1.4 版本或更高版本的 Amazon EBS 设备支持 Abort 命令。

有关更多信息,请参阅 NVM Express 基本规范5.1 Abort 命令部分。