Amazon Elastic Compute Cloud
Linux 实例用户指南
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

用户提供的内核

如果您的 Amazon EC2 实例上需要自定义内核,您可以从与您所需最接近的AMI开始,在您的实例上编译自定义内核,并修改 menu.lst 文件以指向新内核。该过程根据您的AMI所使用的虚拟化类型而异。有关更多信息,请参阅 Linux AMI 虚拟化类型

HVM AMI (GRUB)

HVM 实例卷就像是物理磁盘。启动过程类似于具有分区磁盘和启动加载程序的裸金属操作系统,使它能够与当前支持的所有 Linux 分发配合使用。最常见的启动加载程序是 GRUB,以下部分对配置 GRUB 以使用自定义内核进行了说明。

针对 HVM AMI 配置 GRUB

以下是针对 HVM AMI 的 menu.lst 配置文件的示例。在此示例中,可在两个内核条目中进行选择:Amazon Linux 2017.09 (此 AMI 的原始内核),以及 Vanilla Linux 4.13.4 (来自 https://www.kernel.org/ 的较新 Vanilla Linux 内核版本)。Vanilla 条目是从此 AMI 的原始条目复制的,kernelinitrd 路径已更新为新位置。default 0 参数将引导加载器指向其发现的第一个条目 (在此例中为 Vanilla 条目),fallback 1 参数在引导第一个条目的过程中发生问题时,将引导加载器指向下一个条目。

默认情况下,GRUB 不会将其输出发送到实例控制台,因为它会造成额外启动延迟。有关更多信息,请参阅 实例控制台输出。如果您安装自定义内核,您应该考虑通过删除 hiddenmenu 行并将 serialterminal 行添加到 /boot/grub/menu.lst 以启用 GRUB 输出,如下例中所示。

重要

避免在启动过程打印大量调试信息;连续控制台不支持高速数据传输。

default=0 fallback=1 timeout=5 serial --unit=0 --speed=9600 terminal --dumb --timeout=5 serial console title Vanilla Linux 4.13.4 root (hd0) kernel /boot/vmlinuz-4.13.4 root=LABEL=/ console=tty1 console=ttyS0 initrd /boot/initrd.img-4.13.4 title Amazon Linux 2017.09 (4.9.51-10.52.amzn1.x86_64) root (hd0,0) kernel /boot/vmlinuz-4.9.51-10.52.amzn1.x86_64 root=LABEL=/ console=tty1 console=ttyS0 initrd /boot/initramfs-4.9.51-10.52.amzn1.x86_64.img

无需在 menu.lst 文件中指定后备内核,但是我们建议您在测试新内核时准备好后备内核。如果新内核发生故障时,GRUB 可以退回其他内核。如果有后备内核,实例即使没有找到新内核也能进行引导。

如果您的新 vanilla Linux 内核发生故障,则输出类似于以下示例。

^M Entry 0 will be booted automatically in 3 seconds. ^M Entry 0 will be booted automatically in 2 seconds. ^M Entry 0 will be booted automatically in 1 seconds. Error 13: Invalid or unsupported executable format [ 0.000000] Initializing cgroup subsys cpuset

半虚拟化 AMI (PV-GRUB)

使用半虚拟化 (PV) 的 Amazon 系统映像 会在启动过程中使用名为 PV-GRUB 的系统。PV-GRUB 是半虚拟化启动加载器,运行经过修补的 GNU GRUB 0.97 版本。当您启动实例时,PV-GRUB 会开始启动过程,然后链式加载映像的 menu.lst 文件指定的内核。

PV-GRUB 理解标准 grub.confmenu.lst 命令,可与当前支持的所有 Linux 分发版本配合使用。较旧发布版 (如 Ubuntu 10.04 LTS、Oracle Enterprise Linux 或 CentOS 5.x) 需要特殊的“ec2”或“xen”内核软件包,而较新发布版在默认内核软件包中包含所需驱动程序。

大多数新半虚拟化 AMI 在默认情况下使用 PV-GRUB AKI (包括 Amazon EC2 启动向导快速启动菜单中提供的所有半虚拟化 Linux AMI),无需执行额外步骤即可在实例上使用不同的内核,前提是要使用的内核与您的发布版兼容。在实例上运行自定义内核的最佳方式是从接近于您所需内容的 AMI 开始,然后在实例上编译自定义内核并修改 menu.lst 文件 (如Configuring GRUB 所示) 以使用该内核启动。

可以通过使用 Amazon EC2 命令行工具执行以下 describe-images 命令 (换入要检查的内核映像 ID),验证 AMI 的内核映像是否为 PV-GRUB AKI:

aws ec2 describe-images --filters Name=image-id,Values=aki-880531cd

检查 Name 字段是否以 pv-grub 开头。

PV-GRUB 的限制

PV-GRUB 具有以下限制:

  • 您不能使用 64 位版本的 PV-GRUB 来启动 32 位的内核,反之亦然。

  • 当您使用 PV-GRUB AKI 时,不能指定 Amazon Ramdisk Image (ARI)。

  • AWS 经测试确认 PV-GRUB 可与以下文件系统格式配合使用:EXT2、EXT3、EXT4、JFS、XFS 和 ReiserFS。其他文件系统格式可能不适用。

  • PV-GRUB 可以引导使用 gzip、bzip2、lzo 和 xz 压缩格式压缩的内核。

  • 集群 AMI 不支持也不需要 PV-GRUB,因为它们使用完全硬件虚拟化 (HVM)。当半虚拟化实例使用 PV-GRUB 来启动时,HVM 实例卷用作实际磁盘,并且启动过程与带已分区磁盘和启动加载程序的裸金属操作系统的类似。

  • PV-GRUB 版本 1.03 及更低版本不支持 GPT 分区;它们仅支持 MBR 分区。

  • 如果您计划通过 Amazon EBS 卷使用逻辑卷管理 (LVM),则需要在 LVM 外有一个独立的启动分区。然后,您可以通过 LVM 创建逻辑卷。

为半虚拟化 AMI 配置 GRUB

要引导 PV-GRUB,GRUB menu.lst 文件必须存在于映像中;此文件的最常见位置是 /boot/grub/menu.lst

以下是用于启动带 PV-GRUB AKI 的 AMI 的 menu.lst 配置文件示例。在该示例中,可在两个内核条目中进行选择:Amazon Linux 2017.09 (此 AMI 的原始内核),以及 Vanilla Linux 4.13.4 (来自 https://www.kernel.org/ 的较新 Vanilla Linux 内核版本)。Vanilla 条目是从此 AMI 的原始条目复制的,kernelinitrd 路径已更新为新位置。default 0 参数将引导加载器指向其发现的第一个条目 (在此例中为 Vanilla 条目),fallback 1 参数在引导第一个条目的过程中发生问题时,将引导加载器指向下一个条目。

default 0 fallback 1 timeout 0 hiddenmenu title Vanilla Linux 4.13.4 root (hd0) kernel /boot/vmlinuz-4.13.4 root=LABEL=/ console=hvc0 initrd /boot/initrd.img-4.13.4 title Amazon Linux 2017.09 (4.9.51-10.52.amzn1.x86_64) root (hd0) kernel /boot/vmlinuz-4.9.51-10.52.amzn1.x86_64 root=LABEL=/ console=hvc0 initrd /boot/initramfs-4.9.51-10.52.amzn1.x86_64.img

无需在 menu.lst 文件中指定后备内核,但是我们建议您在测试新内核时准备好后备内核。如果新内核发生故障,PV-GRUB 可以回退到其他内核。如果有后备内核,实例即使没有找到新内核也能进行引导。

PV-GRUB 检查以下位置是否存在 menu.lst,使用找到的第一项:

  • (hd0)/boot/grub

  • (hd0,0)/boot/grub

  • (hd0,0)/grub

  • (hd0,1)/boot/grub

  • (hd0,1)/grub

  • (hd0,2)/boot/grub

  • (hd0,2)/grub

  • (hd0,3)/boot/grub

  • (hd0,3)/grub

请注意,PV-GRUB 1.03 及更低版本仅检查此列表中的前两个位置。

Amazon PV-GRUB Kernel Image ID

PV-GRUB AKI 在所有 Amazon EC2 区域中都可用。同时存在适用于 32 位和 64 位架构类型的 AKI。大多数新 AMI 在默认情况下使用 PV-GRUB AKI。

我们建议您始终使用最新版本的 PV-GRUB AKI,因为并不是所有的 PV-GRUB AKI 版本都能与全部实例类型兼容。使用以下 describe-images 命令可获取当前区域的 PV-GRUB AKI 列表:

aws ec2 describe-images --owners amazon --filters Name=name,Values=pv-grub-*.gz

请注意,PV-GRUB 是 ap-southeast-2 区域中唯一可用的 AKI。您应验证要复制到此区域的任何 AMI 是否使用此区域中可用的 PV-GRUB 版本。

以下是每个区域的当前 AKI ID。使用 hd0 AKI 注册新 AMI。

注意

在之前提供 hd00 AKI 的地区,我们将继续提供,以实现向后兼容性。

ap-northeast-1,亚太区域(东京)

映像 ID 映像名称
aki-f975a998 pv-grub-hd0_1.05-i386.gz
aki-7077ab11 pv-grub-hd0_1.05-x86_64.gz

ap-southeast-1、亚太区域(新加坡)

映像 ID 映像名称
aki-17a40074 pv-grub-hd0_1.05-i386.gz
aki-73a50110 pv-grub-hd0_1.05-x86_64.gz

ap-southeast-2、亚太区域(悉尼)

映像 ID 映像名称
aki-ba5665d9 pv-grub-hd0_1.05-i386.gz
aki-66506305 pv-grub-hd0_1.05-x86_64.gz

eu-central-1、欧洲(法兰克福)

映像 ID 映像名称
aki-1419e57b pv-grub-hd0_1.05-i386.gz
aki-931fe3fc pv-grub-hd0_1.05-x86_64.gz

eu-west-1、欧洲(爱尔兰)

映像 ID 映像名称
aki-1c9fd86f pv-grub-hd0_1.05-i386.gz
aki-dc9ed9af pv-grub-hd0_1.05-x86_64.gz

sa-east-1、南美洲(圣保罗)

映像 ID 映像名称
aki-7cd34110 pv-grub-hd0_1.05-i386.gz
aki-912fbcfd pv-grub-hd0_1.05-x86_64.gz

us-east-1、美国东部(弗吉尼亚北部)

映像 ID 映像名称
aki-04206613 pv-grub-hd0_1.05-i386.gz
aki-5c21674b pv-grub-hd0_1.05-x86_64.gz

us-gov-west-1、AWS GovCloud (US)

映像 ID 映像名称
aki-5ee9573f pv-grub-hd0_1.05-i386.gz
aki-9ee55bff pv-grub-hd0_1.05-x86_64.gz

us-west-1、美国西部(加利福尼亚北部)

映像 ID 映像名称
aki-43cf8123 pv-grub-hd0_1.05-i386.gz
aki-59cc8239 pv-grub-hd0_1.05-x86_64.gz

us-west-2、美国西部(俄勒冈)

映像 ID 映像名称
aki-7a69931a pv-grub-hd0_1.05-i386.gz
aki-70cb0e10 pv-grub-hd0_1.05-x86_64.gz

更新 PV-GRUB

我们建议您始终使用最新版本的 PV-GRUB AKI,因为并不是所有的 PV-GRUB AKI 版本都能与全部实例类型兼容。较旧版本的 PV-GRUB 也并非在所有区域都可用,因此如果您将使用较旧版本的 AMI 复制到不支持该版本的区域,则无法引导从该 AMI 启动的实例,直至您更新内核映像。使用以下过程可检查您的实例的 PV-GRUB 版本并在必要时更新它。

检查您的 PV-GRUB 版本

  1. 查找您的实例的内核 ID。

    aws ec2 describe-instance-attribute --instance-id instance_id --attribute kernel --region region { "InstanceId": "instance_id", "KernelId": "aki-70cb0e10" }

    此实例的内核 ID 是 aki-70cb0e10

  2. 查看该内核 ID 的版本信息。

    aws ec2 describe-images --image-ids aki-70cb0e10 --region region { "Images": [ { "VirtualizationType": "paravirtual", "Name": "pv-grub-hd0_1.05-x86_64.gz", ... "Description": "PV-GRUB release 1.05, 64-bit" } ] }

    该内核映像是 PV-GRUB 1.05。如果您的 PV-GRUB 版本不是最新版本 (如 Amazon PV-GRUB Kernel Image ID 所示),则应使用以下过程更新它。

更新您的 PV-GRUB 版本

如果您的实例使用较旧版本的 PV-GRUB,则您应将它更新为最新版本。

  1. 通过 Amazon PV-GRUB Kernel Image ID 确定您区域和处理器架构的最新 PV-GRUB AKI。

  2. 停止您的实例。您的实例必须停止才能修改所使用的内核映像。

    aws ec2 stop-instances --instance-ids instance_id --region region
  3. 修改用于您的实例的内核映像。

    aws ec2 modify-instance-attribute --instance-id instance_id --kernel kernel_id --region region
  4. 重新启动您的实例。

    aws ec2 start-instances --instance-ids instance_id --region region