Linux 实例上的 Amazon EBS 和 NVMe
EBS 卷作为 NVMe 块存储设备在基于 Nitro 系统构建的实例上公开。设备名称为 /dev/nvme0n1
、/dev/nvme1n1
,以此类推。您在块储存设备映射中指定的设备名称将使用 NVMe 设备名称 (/dev/nvme[0-26]n1
) 进行重命名。块储存设备驱动程序可以使用不同于您在块储存设备映射中为卷指定的顺序来分配 NVMe 设备名称。
无论块储存设备接口如何,Amazon EBS 产品详细信息
安装或升级 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 驱动程序,您可以使用以下过程将驱动程序更新到最新版本。
-
连接到您的 实例。
-
更新程序包缓存以获取必需程序包更新,如下所示。
-
对于 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
-
-
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
-
重启实例以加载最新内核版本。
sudo reboot
-
重启之后重新连接到实例。
识别 EBS 设备
EBS 使用单一根 I/O 虚拟化 (SR-IOV) 在使用 NVMe 规范的基于 Nitro 的实例上提供卷附加。这些设备依赖于操作系统上的标准 NVMe 驱动程序。这些驱动程序通常在实例启动期间通过扫描 PCI 总线来发现附加的设备,然后根据设备响应的顺序创建设备节点,而不是按照在块储存设备映射中指定设备的顺序。在 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/nvme
命令获得一致的 NVMe 设备名称。对于其他发布版本,请使用0
n1 -usudo ebsnvme-id /dev/nvme
命令确定 NVMe 设备名称。0
n1 -u -
格式化设备时,将生成在文件系统的使用寿命内保持的 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/nvme
0
n1Volume ID: vol-01324f611e2463981 sda
以下示例显示实例启动后附上的卷的命令和输出。请注意,NVMe 设备名称包括 /dev/
前缀。
[ec2-user ~]$
sudo /sbin/ebsnvme-id /dev/nvme
1
n1Volume 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_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/nvme
0
n1NVME 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/nvme
1
n1NVME 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/nvme
1
n1
当您分离 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
命令:R5b
、R6i
、M6i
、M6a
、C6gn
、C6i
、X2gd
、X2iezn
、Im4gn
、Is4gen
。
向附加的 Amazon EBS 卷发出 Abort
命令时,其他实例类型不采取任何操作。
NVMe 设备为 1.4
版本或更高版本的 Amazon EBS 设备支持 Abort
命令。
有关更多信息,请参阅 NVM Express 基本规范