亚马逊EBS和 NVMe - Amazon EBS

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

亚马逊EBS和 NVMe

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

无论屏蔽设备接口如何,Amazon EBS 商品详情中规定的EBS性能指南均有效。

Linux 实例

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

Windows 实例

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

安装或升级NVMe驱动程序

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

以下内容AMIs包括所需的NVMe驱动程序:

  • Amazon Linux 2

  • 亚马逊 Linux AMI 2018.03

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

    注意

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

  • Red Hat Enterprise Linux 7.4 或更高版本

  • SUSELinux 企业服务器 12 SP2 或更高版本

  • CentOS 7.4.1708 或更高版本

  • 免费 BSD 11.1 或更高版本

  • Debian GNU /Linux 9 或更高版本

确认您的实例是否有NVMe驱动程序

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

  • 亚马逊 Linux RHEL、CentOS 和 SUSE Linux 企业服务器

    $ 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 适用AMIs于 Windows Server 2008 R2 及更高版本的 Windows 包含该 AWS NVMe驱动程序。如果您使用的不是亚马逊AMIs提供的最新 AWS Windows,请参阅亚马逊EC2用户指南 PowerShell中的使用安装或升级 AWS NVMe驱动程序

识别EBS设备

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

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

我们建议您为实例中的EBS卷使用稳定的标识符,例如以下标识符之一:

  • 对于基于 Nitro 的实例,将在EC2控制器标识的供应商特定数据字段中捕获您在连接EBS卷时AttachVolumeRunInstancesAPI调用期间在 Amazon 控制台中指定的块储存设备映射。NVMe对于AMIs高于 2017.09.01 版本的 Amazon Linux,我们提供了一udev条规则,用于读取这些数据并创建指向区块设备映射的符号链接。

  • 在实例状态更改之间,EBS卷 ID 和挂载点是稳定的。NVMe设备名称可以根据设备在实例启动期间的响应顺序而变化。我们建议使用EBS卷 ID 和装入点以实现一致的设备识别。

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

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

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

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

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

亚马逊 Linux AMIs

在 Amazon Linux AMI 2017.09.01 或更高版本(包括亚马逊 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设备名称的符号链接。

免费 BSD AMIs

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

其他Linux AMIs

如果内核版本为 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 和设备名称。默认情况下,枚举所有EBSNVMe设备。您可以传递磁盘编号以枚举特定设备的信息。该ebsnvme-id工具包含在最新 AWS 提供的 Windows 服务器中,AMIs位于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

处理NVMeEBS卷

要格式化和装入NVMeEBS卷,请参阅使 Amazon EBS 卷可供使用

Linux 实例

如果您使用的是 Linux 内核 4.2 或更高版本,则您对卷大小所做的任何更改都会自动反映在实例中。NVMe EBS对于较旧的 Linux 内核,您可能需要分离并连接EBS卷或重启实例,以反映大小变化。在 Linux 内核 3.19 或更高版本中,您可以使用以下hdparm命令强制重新扫描设备:NVMe

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

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

Windows 实例

最新的 AWS Windows AMIs 包含将EBS卷作为NVMe块设备公开的实例类型所需的 AWS 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 版本的不同,超时时间可能已设置为支持的最大值。例如,亚马逊 Linux 2017.09.01 及更高版本的超时默认设置为 4294967295。AMI

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

Windows 实例

在 Windows 上,默认超时时间为 60 秒,最大值为 255 秒。您可以使用 M SCSIiniport 驱动程序的注册表项中描述的步骤修改TimeoutValue磁盘类注册表设置。

Abort 命令

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

默认情况下,以下实例类型支持所有连接的 Amazon EBS 卷的Abort命令:R5bR6i、、M6iM6aC6gnC6iX2gd、、X2ieznIm4gnIs4gen

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

EBSNVMe设备版本1.4或更高版本的 Amazon 设备支持该Abort命令。

有关更多信息,请参阅 E NVMxpress Base 规范的 5.1 节中止命令