

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 用户提供的内核
<a name="UserProvidedKernels"></a>

如果您的 Amazon EC2 实例上需要自定义内核，您可以从接近于您想要的内核的 AMI 开始，在您的实例上编译自定义内核，并更新引导加载程序以指向新内核。该过程根据您的AMI所使用的虚拟化类型而异。有关更多信息，请参阅 *Amazon EC2 用户指南*中的 [Linux AMI 虚拟化类型](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/virtualization_types.html)。

**Topics**
+ [HVM AMIs (GRUB)](#HVM_instances)
+ [半虚拟化 AMI () PV-GRUB](#Paravirtual_instances)

## HVM AMIs (GRUB)
<a name="HVM_instances"></a>

HVM 实例卷就像是物理磁盘。引导过程类似于带分区磁盘和引导加载程序的裸机操作系统，使它能够在当前支持的所有 Linux 发行版中工作。最常见的引导加载程序是 GRUB 或 GRUB2。

默认情况下，GRUB 不会将其输出发送到实例控制台，因为它会造成额外启动延迟。有关更多信息，请参阅《Amazon EC2 用户指南》**中的[实例控制台输出](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/troubleshoot-unreachable-instance.html#instance-console-console-output)。如果要安装自定义内核，则应考虑启用 GRUB 输出。

无需指定后备内核，但是我们建议您在测试新内核时准备好后备内核。如果新内核发生故障时，GRUB 可以退回到另一个内核。如果有后备内核，实例即使没有找到新内核也能进行引导。

旧版 GRUB for Amazon Linux 使用 `/boot/grub/menu.lst`。GRUB2 适用于 AL2 用途`/etc/default/grub`。有关更新引导加载程序中的默认内核的更多信息，请参阅 Linux 发行版的文档。

## 半虚拟化 AMI () PV-GRUB
<a name="Paravirtual_instances"></a>

使用半虚拟化 (PV) 虚拟化的 AMI 使用在启动*PV-GRUB*过程中调用的系统。 PV-GRUB 是一个半虚拟化引导加载程序，它运行 GNU GRUB 0.97 的补丁版本。启动实例时， PV-GRUB 启动启动过程，然后链式加载映像`menu.lst`文件指定的内核。

PV-GRUB 理解标准`grub.conf`或`menu.lst`命令，这使其能够与当前支持的所有Linux发行版一起使用。较旧发行版（如 Ubuntu 10.04 LTS、Oracle Enterprise Linux 或 CentOS 5.x）需要特殊的“ec2”或“xen”内核软件包，而较新发行版在默认内核软件包中包含所需驱动程序。

大多数现代半虚拟化 AM PV-GRUB I 默认使用 AKI（包括 Amazon EC2 Launch Wizard 快速入门菜单中所有可用的半虚拟化 Linux AMI），因此，只要您要使用的内核与您的发行版兼容，您无需采取其他步骤即可在实例上使用不同的内核。在实例上运行自定义内核的最佳方式是从接近于您想要的内核的 AMI 开始，然后在实例上编译自定义内核并修改 `menu.lst` 文件以使用该内核进行引导。

您可以验证 AMI 的内核映像是否为 A PV-GRUB KI。运行以下 [describe-images](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html) 命令（替换为您的内核映像 ID），并检查 `Name` 字段是否以 `pv-grub` 开头：

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

**Topics**
+ [的局限性 PV-GRUB](#pv-grub-limitations)
+ [Configuring GRUB](#configuringGRUB)
+ [亚马逊 PV-GRUB 内核映像 ID](#AmazonKernelImageIDs)
+ [更新 PV-GRUB](#UpdatingPV-GRUB)

### 的局限性 PV-GRUB
<a name="pv-grub-limitations"></a>

PV-GRUB 有以下限制：
+ 不能使用 64 位版本的 PV-GRUB 来启动 32 位内核，反之亦然。
+ 使用 A PV-GRUB KI 时，您无法指定亚马逊虚拟硬盘映像 (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 Elastic Block Store (Amazon EBS) 卷使用逻辑卷管理 (LVM)，则需要在 LVM 外有一个独立的引导分区。然后，您可以通过 LVM 创建逻辑卷。

### 为半虚拟化 AMIs 配置 GRUB
<a name="configuringGRUB"></a>

要启动 PV-GRUB，映像中必须存在 GRUB `menu.lst` 文件；该文件最常见的位置是`/boot/grub/menu.lst`。

以下是使用 A PV-GRUB KI 启动 AMI 的`menu.lst`配置文件示例。在此示例中，有两个内核条目可供选择：Amazon Linux 2018.03（此 AMI 的原始内核）和 Vanilla Linux 4.16.4（Vanilla Linux 内核的较新版本）。[https://www.kernel.org/](https://www.kernel.org/)Vanilla 条目是从此 AMI 的原始条目复制的，`kernel` 和 `initrd` 路径已更新为新位置。`default 0` 参数将引导加载程序指向其发现的第一个条目 (在此例中为 Vanilla 条目)，`fallback 1` 参数在引导第一个条目的过程中发生问题时，将引导加载程序指向下一个条目。

```
default 0
fallback 1
timeout 0
hiddenmenu

title Vanilla Linux 4.16.4
root (hd0)
kernel /boot/vmlinuz-4.16.4 root=LABEL=/ console=hvc0
initrd /boot/initrd.img-4.16.4

title Amazon Linux 2018.03 (4.14.26-46.32.amzn1.x86_64)
root (hd0)
kernel /boot/vmlinuz-4.14.26-46.32.amzn1.x86_64 root=LABEL=/ console=hvc0
initrd /boot/initramfs-4.14.26-46.32.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 及更早版本仅检查此列表中前两个位置中的一个。

### 亚马逊 PV-GRUB 内核映像 ID
<a name="AmazonKernelImageIDs"></a>

PV-GRUB AKI 在所有 Amazon EC2 区域都可用，亚太地区（大阪）除外。同时存在适用于 32 位和 64 位架构类型的 AKI。大多数现代 AMI 默认使用 A PV-GRUB KI。

我们建议您始终使用最新版本的 PV-GRUB AKI，因为并非所有版本的 PV-GRUB AKI 都与所有实例类型兼容。使用以下 d [escribe-images](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html) 命令获取当前区域 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 的区域，我们将继续提供 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、US East (N. Virginia)**  

| 映像 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-West)**  

| 映像 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
<a name="UpdatingPV-GRUB"></a>

我们建议您始终使用最新版本的 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`。

1. 查看该内核 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 版本不是最新版本（如所示[亚马逊 PV-GRUB 内核映像 ID](#AmazonKernelImageIDs)），则应使用以下步骤对其进行更新。

**更新您的 PV-GRUB 版本**

如果您的实例使用的是的旧版本 PV-GRUB，则应将其更新到最新版本。

1. 从中识别适用于您所在地区和处理器架构的最新 A PV-GRUB KI [亚马逊 PV-GRUB 内核映像 ID](#AmazonKernelImageIDs)。

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

   ```
   aws ec2 stop-instances --instance-ids {{instance_id}} --region {{region}}
   ```

1. 修改用于您的实例的内核映像。

   ```
   aws ec2 modify-instance-attribute --instance-id {{instance_id}} --kernel {{kernel_id}} --region {{region}}
   ```

1. 重新启动您的实例。

   ```
   aws ec2 start-instances --instance-ids {{instance_id}} --region {{region}} 
   ```