Linux 实例上的 Amazon EBS 和 NVMe - Amazon Elastic Compute Cloud
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

Linux 实例上的 Amazon EBS 和 NVMe

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

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

有关 Windows 实例上的 EBS 卷和 NVME 的信息,请参阅用户指南(适用于 Windows 实例)

安装或升级 NVMe 驱动程序

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

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

  • Amazon Linux 2

  • Amazon Linux AMI 2018.03

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

  • Red Hat Enterprise Linux 7.4 或更高版本

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

  • CentOS 7.4.1708 或更高版本

  • FreeBSD 11.1 或更高版本

  • Debian GNU/Linux 9 或更高版本

有关 Windows 实例上的 NVMe 驱动程序的更多信息,请参阅 Amazon EC2 用户指南(适用于 Windows 实例) 中的 Windows 实例上的 Amazon EBS 和 NVMe

确认实例具有 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. 重启之后重新连接到实例。

识别 EBS 设备

EBS 使用单一根 I/O 虚拟化 (SR-IOV) 在使用 NVMe 规范的基于 Nitro 的实例上提供卷附加。这些设备依赖于操作系统上的标准 NVMe 驱动程序。这些驱动程序通常在实例启动期间通过扫描 PCI 总线来发现附加的设备,然后根据设备响应的顺序创建设备节点,而不是按照在块储存设备映射中指定设备的顺序。在 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 ebsnvme-id /dev/nvme0n1 -u 命令确定 NVMe 设备名称。

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

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

使用 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中所述尝试执行 从 Linux 实例分离 Amazon EBS 卷 命令。

I/O 操作超时

附加到基于 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 并在尝试保存文件时检查 Numerical result out of range (数值结果超出范围) 错误,以此来验证您的 Linux 发行版的最大值。

Abort command

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 命令部分。