Amazon Elastic Compute Cloud
用户指南(适用于 Linux 实例)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

Linux 实例上的 Amazon EBS 和 NVMe

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

注意

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

安装或升级 NVMe 驱动程序

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

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

  • Amazon Linux 2

  • Amazon Linux AMI 2018.03

  • Ubuntu 14.04 或更高版本

  • Red Hat Enterprise Linux 7.4 或更高版本

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

  • CentOS 7 或更高版本

  • FreeBSD 11.1 或更高版本

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

如果您使用的是不包含 NVMe 驱动程序的 AMI,则可以使用以下过程将该驱动程序安装在实例上。

安装 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 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 规则,该规则读取此数据并创建指向块储存设备映射的符号链接。

  • NVMe EBS 卷在设备标识中将 EBS 卷 ID 设置为序列号。

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

Amazon Linux AMI

利用 Amazon Linux AMI 2017.09.01 或更高版本(包括 Amazon Linux 2),您可以按下面所示运行 ebsnvme-id 命令以将 NVMe 设备名称映射到卷 ID 和设备名称:

[ec2-user ~]$ sudo /sbin/ebsnvme-id /dev/nvme1n1 Volume ID: vol-01324f611e2463981 /dev/sdf

Amazon Linux 还将创建从块储存设备映射中的设备名称(例如,/dev/sdf)到 NVMe 设备名称的符号链接。

其他 Linux AMI

利用内核版本 4.2 或更高版本,您可以按下面所示运行 nvme id-ctrl 命令以将 NVMe 设备映射到卷 ID。首先,使用您的 Linux 发行版的程序包管理工具安装 NVMe 命令行程序包 nvme-cli

以下示例将获取卷 ID 和设备名称。设备名称通过特定于 NVMe 控制器供应商的扩展(控制器标识的字节 384:4095)提供:

[ec2-user ~]$ sudo nvme id-ctrl -v /dev/nvme1n1 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 "/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 卷之前,您应该首先同步并卸载它。如果卷无法分离,您可以按照将 Amazon EBS 卷与实例分离中所述尝试执行 force-detach 命令。

I/O 操作超时

附加到基于 Nitro 系统的实例的 EBS 卷使用操作系统提供的默认 NVMe 驱动程序。大多数操作系统为提交到 NVMe 设备的 I/O 操作指定一个超时。默认超时为 30 秒,可以使用 nvme.io_timeout 引导参数更改该超时。如果 I/O 延迟超过了此参数的值,Linux NVMe 驱动程序会使 I/O 失败,将错误返回文件系统或应用程序。根据 I/O 操作,您的文件系统或应用程序可以重试错误。在某些情况下,您的文件系统可通过只读方式重新挂载。

为了获得与附加到 Xen 实例的 EBS 卷类似的体验,我们建议将 nvme.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 发行版的最大值。