在 Linux 实例上启用 Elastic Network Adapter (ENA) 增强联网 - Amazon Elastic Compute Cloud

Linux 实例上启用 Elastic Network Adapter (ENA) 增强联网

Amazon EC2 通过 Elastic Network Adapter (ENA) 提供增强联网功能。要使用增强型联网,您必须安装所需的 ENA 模块并启用 ENA 支持。

要求

要使用 ENA 准备增强联网,请按如下方式设置您的实例:

  • 使用当前一代实例类型启动实例,但小于 m4.16xlarge 的 C4、D2、M4 实例或 T2 除外。

  • 使用支持的 Linux 内核版本及支持的发行版启动实例,以便为实例自动启用 ENA 增强联网。有关更多信息,请参阅 ENA Linux 内核驱动程序发行说明

  • 确保实例具有 Internet 连接。

  • 使用 AWS Management Console 的 AWS CloudShell,或者将 AWS CLIAWS Tools for Windows PowerShell 安装到您选择的任意电脑上(最好是本地台式机或笔记本电脑)并进行配置。有关的更多信息,请参阅 访问 Amazon EC2AWS CloudShell 用户指南。不能从 Amazon EC2 控制台管理增强联网。

  • 如果您的实例上有重要的数据需要保留,则应立即从您的实例创建 AMI,来备份这些数据。更新内核和内核模块以及启用 enaSupport 属性可能会导致实例不兼容或无法访问操作系统。如果您有最新备份,则发生此情况时仍将保留数据。

注意

我们要求使用 TLS 1.2,建议使用 TLS 1.3。客户端必须满足此要求才能从 Amazon Simple Storage Service(Amazon S3)下载。有关更多信息,请参阅 TLS 1.2 成为所有 AWS API 端点的最低 TLS 协议级别

增强联网性能

以下文档汇总了支持 ENA 增强联网的实例类型的网络性能:

测试是否启用了增强联网功能

以下 AMI 包含所需的 ENA 模块并启用了 ENA 支持:

  • Amazon Linux 2023

  • Amazon Linux 2

  • Amazon Linux AMI 2018.03 和更高版本

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

    注意

    AWS 基于 Graviton 的实例类型需要 Ubuntu 18.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 或更高版本

若要测试是否已启用了增强联网,请确认实例上已安装 ena 模块且设置了 enaSupport 属性如果实例满足这两个条件,则 ethtool -i ethn 命令应显示该模块已在网络接口上使用。

内核模块 (ena)

要确认已安装 ena 模块,请使用 modinfo 命令,如以下示例中所示。

[ec2-user ~]$ modinfo ena filename: /lib/modules/4.14.33-59.37.amzn2.x86_64/kernel/drivers/amazon/net/ena/ena.ko version: 1.5.0g license: GPL description: Elastic Network Adapter (ENA) author: Amazon.com, Inc. or its affiliates srcversion: 692C7C68B8A9001CB3F31D0 alias: pci:v00001D0Fd0000EC21sv*sd*bc*sc*i* alias: pci:v00001D0Fd0000EC20sv*sd*bc*sc*i* alias: pci:v00001D0Fd00001EC2sv*sd*bc*sc*i* alias: pci:v00001D0Fd00000EC2sv*sd*bc*sc*i* depends: retpoline: Y intree: Y name: ena ...

在上述 Amazon Linux 情况中,ena 模块已安装。

ubuntu:~$ modinfo ena ERROR: modinfo: could not find module ena

在上述 Ubuntu 实例中,此模块未安装,因此您必须首先安装它。有关更多信息,请参阅在 Ubuntu 上启用增强联网

实例属性 (enaSupport)

要检查实例是否设置了增强联网 enaSupport 属性,请使用以下任一命令。如果该属性已设置,则响应为 true。

  • describe-instances (AWS CLI/AWS CloudShell)

    aws ec2 describe-instances --instance-ids instance_id --query "Reservations[].Instances[].EnaSupport"
  • Get-EC2Instance(适用于 Windows PowerShell 的工具)

    (Get-EC2Instance -InstanceId instance-id).Instances.EnaSupport
映像属性(enaSupport)

要检查 AMI 是否设置了增强联网 enaSupport 属性,请使用以下任一命令。如果该属性已设置,则响应为 true。

  • describe-images (AWS CLI/AWS CloudShell)

    aws ec2 describe-images --image-id ami_id --query "Images[].EnaSupport"
  • Get-EC2Image(适用于 Windows PowerShell 的工具)

    (Get-EC2Image -ImageId ami_id).EnaSupport
网络接口驱动程序

使用以下命令验证是否在特定接口上使用了 ena 模块(替代要检查的接口名称)。如果您使用单个接口(默认设置),则它是 eth0。如果操作系统支持可预测的网络名称,这可以是 ens5 等名称。

在以下示例中,ena 模块未加载,因为列出的驱动程序是 vif

[ec2-user ~]$ ethtool -i eth0 driver: vif version: firmware-version: bus-info: vif-0 supports-statistics: yes supports-test: no supports-eeprom-access: no supports-register-dump: no supports-priv-flags: no

在此示例中,ena 模块进行加载并具有推荐的最低版本。此实例正确配置了增强联网。

[ec2-user ~]$ ethtool -i eth0 driver: ena version: 1.5.0g firmware-version: expansion-rom-version: bus-info: 0000:00:05.0 supports-statistics: yes supports-test: no supports-eeprom-access: no supports-register-dump: no supports-priv-flags: no

在 Amazon Linux AMI 上启用增强联网

Amazon Linux 2 和最新版本的 Amazon Linux AMI 包括安装了 ENA 的增强联网所需的模块并启用了 ENA 支持。因此,如果使用 HVM 版本的 Amazon Linux 在支持的实例类型上启动实例,则已为您的实例启用增强联网。有关更多信息,请参阅测试是否启用了增强联网功能

如果您使用较旧的 Amazon Linux AMI 启动了实例,并且实例尚未启用增强联网,请通过以下步骤启用增强联网。

在 Amazon Linux AMI 上启用增强联网
  1. 连接到您的 实例。

  2. 从实例运行以下命令以使用最新内核和内核模块 (包括 ena) 更新实例:

    [ec2-user ~]$ sudo yum update
  3. 使用 Amazon EC2 控制台或以下任一命令从您的本地计算机重启实例:reboot-instances(AWS CLI)、Restart-EC2Instance(AWS Tools for Windows PowerShell)。

  4. 再次连接到您的实例,并使用ena中的 modinfo ena 命令验证 测试是否启用了增强联网功能 模块是否已安装并具有推荐的最低版本。

  5. [由 EBS 支持的实例] 使用 Amazon EC2 控制台或以下任一命令从您的本地计算机停止实例:stop-instances(AWS CLI)、Stop-EC2Instance(AWS Tools for Windows PowerShell)。如果您的实例由 AWS OpsWorks 管理,则应在 AWS OpsWorks 控制台中停止该实例,以便使实例状态保持同步。

    [实例存储支持的实例] 您无法停止实例来修改属性。请执行此过程:在 Amazon Linux AMI 上启用增强联网(实例存储支持的实例)

  6. 使用以下任一命令从本地电脑启用增强联网属性:

  7. (可选) 从实例创建 AMI,如 中所述创建一个由 Amazon EBS 支持的 Linux AMI 该 AMI 从实例继承增强联网 enaSupport 属性。因此,您可以使用此 AMI 启动默认情况下启用了增强联网功能的其他实例。

  8. 使用 Amazon EC2 控制台或以下任一命令从您的本地计算机启动实例:start-instances(AWS CLI)、Start-EC2Instance(AWS Tools for Windows PowerShell)。如果您的实例由 AWS OpsWorks 管理,则应在 AWS OpsWorks 控制台中启动该实例,以便使实例状态保持同步。

  9. 连接到您的实例,并使用ena中的 ethtool -i ethn 命令验证是否在网络接口上安装并加载了 测试是否启用了增强联网功能 模块。

    如果您在启用增强联网之后无法连接到实例,请参阅对 Elastic Network Adapter (ENA) 进行问题排查

在 Amazon Linux AMI 上启用增强联网(实例存储支持的实例)

按照上述过程操作,直到您停止实例的步骤。按照创建由实例存储支持的 Linux AMI中所述创建新 AMI,确保在注册 AMI 时启用增强联网属性。

  • register-image (AWS CLI)

    aws ec2 register-image --ena-support ...
  • Register-EC2Image (AWS Tools for Windows PowerShell)

    Register-EC2Image -EnaSupport $true ...

在 Ubuntu 上启用增强联网

最新的 Ubuntu HVM AMI 包括安装了 ENA 的增强联网所需的模块并启用了 ENA 支持。因此,如果使用最新的 Ubuntu HVM AMI 在支持的实例类型上启动实例,则已为您的实例启用增强联网。有关更多信息,请参阅测试是否启用了增强联网功能

如果您使用较旧的 AMI 启动了实例,并且实例尚未启用增强联网,则可以安装 linux-aws 内核程序包以获取最新的增强联网驱动程序并更新所需的属性。

安装 linux-aws 内核程序包(Ubuntu 16.04 或更高版本)

Ubuntu 16.04 和 18.04 随附 Ubuntu 自定义内核(linux-aws 内核程序包)。要使用其他内核,请联系 AWS Support

安装 linux-aws 内核程序包(Ubuntu Trusty 14.04)
  1. 连接到您的 实例。

  2. 更新包缓存和包。

    ubuntu:~$ sudo apt-get update && sudo apt-get upgrade -y linux-aws
    重要

    如果在更新过程中系统提示您安装 grub,请使用 /dev/xvda 安装 grub,然后选择保留当前版本的 /boot/grub/menu.lst

  3. [由 EBS 支持的实例] 使用 Amazon EC2 控制台或以下任一命令从您的本地计算机停止实例:stop-instances(AWS CLI)、Stop-EC2Instance(AWS Tools for Windows PowerShell)。如果您的实例由 AWS OpsWorks 管理,则应在 AWS OpsWorks 控制台中停止该实例,以便使实例状态保持同步。

    [实例存储支持的实例] 您无法停止实例来修改属性。请执行此过程:在 Ubuntu 上启用增强联网(由实例存储支持的实例)

  4. 使用以下任一命令从本地电脑启用增强联网属性:

  5. (可选) 从实例创建 AMI,如 中所述创建一个由 Amazon EBS 支持的 Linux AMI 该 AMI 从实例继承增强联网 enaSupport 属性。因此,您可以使用此 AMI 启动默认情况下启用了增强联网功能的其他实例。

  6. 使用 Amazon EC2 控制台或以下任一命令从您的本地计算机启动实例:start-instances(AWS CLI)、Start-EC2Instance(AWS Tools for Windows PowerShell)。如果您的实例由 AWS OpsWorks 管理,则应在 AWS OpsWorks 控制台中启动该实例,以便使实例状态保持同步。

在 Ubuntu 上启用增强联网(由实例存储支持的实例)

按照上述过程操作,直到您停止实例的步骤。按照创建由实例存储支持的 Linux AMI中所述创建新 AMI,确保在注册 AMI 时启用增强联网属性。

  • register-image (AWS CLI)

    aws ec2 register-image --ena-support ...
  • Register-EC2Image (AWS Tools for Windows PowerShell)

    Register-EC2Image -EnaSupport $true ...

在 Linux 上启用增强联网

用于 Red Hat Enterprise Linux、SUSE Linux Enterprise Server 和 CentOS 的最新 AMI 包括使用 ENA 增强联网所需的模块并启用了 ENA 支持。因此,如果使用最新的 AMI 在支持的实例类型上启动实例,则已为您的实例启用增强联网。有关更多信息,请参阅测试是否启用了增强联网功能

下面的过程提供了在 Amazon Linux AMI 或 Ubuntu 之外的 Linux 发行版上启用增强联网的一般步骤。有关更多信息(如命令的详细语法、文件位置或包和工具支持),请参阅您的 Linux 发行版的文档。

对 Linux 启用增强联网
  1. 连接到您的 实例。

  2. 从位于以下网址的 GitHub 克隆您实例上的 ena 模块的源代码:https://github.com/amzn/amzn-drivers。(默认情况下,SUSE Linux Enterprise Server 12 SP2 及更高版本包含 ENA 2.02,因此不需要下载和编译 ENA 驱动程序。对于 SUSE Linux Enterprise Server 12 SP2 及更高版本,您应该提交一个请求,将您想要的驱动程序版本添加到存储内核中)。

    git clone https://github.com/amzn/amzn-drivers
  3. 在实例上编译并安装 ena 模块。这些步骤取决于 Linux 发行版。有关在 Red Hat Enterprise Linux 上编译模块的更多信息,请参阅 AWS 知识中心文章

  4. 运行 sudo depmod 命令以更新模块依赖项。

  5. 在实例上更新 initramfs 以确保在启动时加载新模块。例如,如果您的发行版支持 dracut,则可使用以下命令。

    dracut -f -v
  6. 确定您的系统是否默认使用可预测的网络接口名称。使用 systemdudev 版本 197 或更高版本的系统可以重命名以太网设备,它们不保证单个网络接口将命名为 eth0。此行为可能导致连接到实例时出现问题。要获取更多信息并查看其他配置选项,请参阅 freedesktop.org 网站上的可预测的网络接口名称

    1. 您可以使用以下命令在基于 RPM 的系统上检查 systemdudev 版本。

      rpm -qa | grep -e '^systemd-[0-9]\+\|^udev-[0-9]\+' systemd-208-11.el7_0.2.x86_64

      在以上 Red Hat Enterprise Linux 7 示例中,systemd 版本是 208,因此必须禁用可预测的网络接口名称。

    2. 通过将 net.ifnames=0 选项添加到 GRUB_CMDLINE_LINUX 中的 /etc/default/grub 行,可禁用可预测的网络接口名称。

      sudo sed -i '/^GRUB\_CMDLINE\_LINUX/s/\"$/\ net\.ifnames\=0\"/' /etc/default/grub
    3. 重新构建 grub 配置文件。

      sudo grub2-mkconfig -o /boot/grub2/grub.cfg
  7. [由 EBS 支持的实例] 使用 Amazon EC2 控制台或以下任一命令从您的本地计算机停止实例:stop-instances(AWS CLI)、Stop-EC2Instance(AWS Tools for Windows PowerShell)。如果您的实例由 AWS OpsWorks 管理,则应在 AWS OpsWorks 控制台中停止该实例,以便使实例状态保持同步。

    [实例存储支持的实例] 您无法停止实例来修改属性。请执行此过程:在 Linux 上启用增强联网(由实例存储支持的实例)

  8. 使用以下任一命令从本地计算机启用增强联网 enaSupport 属性:

  9. (可选) 从实例创建 AMI,如 创建一个由 Amazon EBS 支持的 Linux AMI 中所述。该 AMI 从实例继承增强联网 enaSupport 属性。因此,您可以使用此 AMI 启动默认情况下启用了增强联网功能的其他实例。

    重要

    如果您的实例操作系统包含 /etc/udev/rules.d/70-persistent-net.rules 文件,则必须在创建 AMI 之前将其删除。此文件包含原始实例的以太网适配器 MAC 地址。如果其他实例使用此文件启动,操作系统将找不到设备,eth0 会失败,从而导致启动问题。此文件将在下次启动过程中重新生成,从 AMI 启动的任意实例都会创建这个文件的自有版本。

  10. 使用 Amazon EC2 控制台或以下任一命令从您的本地计算机启动实例:start-instances(AWS CLI)、Start-EC2Instance(AWS Tools for Windows PowerShell)。如果您的实例由 AWS OpsWorks 管理,则应在 AWS OpsWorks 控制台中启动该实例,以便使实例状态保持同步。

  11. (可选) 连接到实例并确认已安装模块。

    如果您在启用增强联网之后无法连接到实例,请参阅对 Elastic Network Adapter (ENA) 进行问题排查

在 Linux 上启用增强联网(由实例存储支持的实例)

按照上述过程操作,直到您停止实例的步骤。按照创建由实例存储支持的 Linux AMI中所述创建新 AMI,确保在注册 AMI 时启用增强联网属性。

利用 DKMS 在 Ubuntu 上启用增强联网

此方法仅用于测试和反馈目的。它不供生产部署使用。有关生产部署,请参阅在 Ubuntu 上启用增强联网

重要

使用 DKMS 可避免您的订阅的支持协议。不得将其用于生产部署。

在 Ubuntu 上启用 ENA 增强联网 (EBS 支持的实例)
  1. 按照在 Ubuntu 上启用增强联网中的步骤 1 和 2 操作。

  2. 安装 build-essential 包以编译内核模块和 dkms 包,这样每次更新内核时都会重建 ena 模块。

    ubuntu:~$ sudo apt-get install -y build-essential dkms
  3. 从位于以下网址的 GitHub 克隆您实例上的 ena 模块的源代码:https://github.com/amzn/amzn-drivers

    ubuntu:~$ git clone https://github.com/amzn/amzn-drivers
  4. amzn-drivers 包移动到 /usr/src/ 目录,以便 DKMS 可以在每次内核更新中找到并构建该模块。将源代码的版本号 (您可在发行说明中找到当前版本号) 附加到目录名称。例如,版本 1.0.0 显示在以下示例中。

    ubuntu:~$ sudo mv amzn-drivers /usr/src/amzn-drivers-1.0.0
  5. 使用以下值创建 DKMS 配置文件(替代您的 ena 版本)。

    创建 文件。

    ubuntu:~$ sudo touch /usr/src/amzn-drivers-1.0.0/dkms.conf

    编辑文件并添加以下值。

    ubuntu:~$ sudo vim /usr/src/amzn-drivers-1.0.0/dkms.conf PACKAGE_NAME="ena" PACKAGE_VERSION="1.0.0" CLEAN="make -C kernel/linux/ena clean" MAKE="make -C kernel/linux/ena/ BUILD_KERNEL=${kernelver}" BUILT_MODULE_NAME[0]="ena" BUILT_MODULE_LOCATION="kernel/linux/ena" DEST_MODULE_LOCATION[0]="/updates" DEST_MODULE_NAME[0]="ena" AUTOINSTALL="yes"
  6. 使用 DKMS 在实例上添加、构建和安装 ena 模块。

    将该模块添加到 DKMS。

    ubuntu:~$ sudo dkms add -m amzn-drivers -v 1.0.0

    使用 dkms 命令构建该模块。

    ubuntu:~$ sudo dkms build -m amzn-drivers -v 1.0.0

    使用 dkms 安装该模块。

    ubuntu:~$ sudo dkms install -m amzn-drivers -v 1.0.0
  7. 重新构建 initramfs,以便在启动时加载正确的模块。

    ubuntu:~$ sudo update-initramfs -u -k all
  8. 使用ena中的 modinfo ena 命令验证是否安装了 测试是否启用了增强联网功能 模块。

    ubuntu:~$ modinfo ena filename: /lib/modules/3.13.0-74-generic/updates/dkms/ena.ko version: 1.0.0 license: GPL description: Elastic Network Adapter (ENA) author: Amazon.com, Inc. or its affiliates srcversion: 9693C876C54CA64AE48F0CA alias: pci:v00001D0Fd0000EC21sv*sd*bc*sc*i* alias: pci:v00001D0Fd0000EC20sv*sd*bc*sc*i* alias: pci:v00001D0Fd00001EC2sv*sd*bc*sc*i* alias: pci:v00001D0Fd00000EC2sv*sd*bc*sc*i* depends: vermagic: 3.13.0-74-generic SMP mod_unload modversions parm: debug:Debug level (0=none,...,16=all) (int) parm: push_mode:Descriptor / header push mode (0=automatic,1=disable,3=enable) 0 - Automatically choose according to device capability (default) 1 - Don't push anything to device memory 3 - Push descriptors and header buffer to device memory (int) parm: enable_wd:Enable keepalive watchdog (0=disable,1=enable,default=1) (int) parm: enable_missing_tx_detection:Enable missing Tx completions. (default=1) (int) parm: numa_node_override_array:Numa node override map (array of int) parm: numa_node_override:Enable/Disable numa node override (0=disable) (int)
  9. 继续执行在 Ubuntu 上启用增强联网中的步骤 3。

驱动程序发行说明

有关 Linux ENA 驱动程序版本的信息,请参阅 ENA Linux 内核驱动程序发行说明

问题排查

有关故障排除信息,请参阅对 Elastic Network Adapter (ENA) 进行问题排查