

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

# 正在更新 Linux 内核 AL2023
<a name="kernel-update"></a>

**Topics**
+ [Linux 内核版本开启 AL2023](#al2023-kernels)
+ [更新 AL2023 到较新的内核版本](#kernelup)
+ [AL2023 内核-常见问题解答](#al2023-kernel-faq)

## Linux 内核版本开启 AL2023
<a name="al2023-kernels"></a>

AL2023 定期包括基于 Linux 内核的长期支持 (LTS) 版本的新内核版本。

AL2023 最初于 2023 年 3 月发布，内核为 6.1。

2025 年 4 月， AL2023 增加了对 Linux 内核 6.12 的支持。该内核增加了新功能，包括 EEVDF 调度、FUSE 直通 I/O 支持、新的 Futex API 以及 eBPF 的改进。内核 6.12 还允许用户空间程序在运行时使用用户空间影子栈和内存密封来保护自身。

2026 年 3 月， AL2023 增加了对 Linux 内核 6.18 的支持。更新后的内核 6.18 在处理器支持、虚拟化、安全性和性能方面带来了更多改进。值得注意的功能包括改进的跨架构的 IOMMU 功能以及用于管理 CPU 漏洞缓解措施的攻击向量控制。性能增强来自密码学优化、更快的 FSCRYPT 操作、内存管理改进以及引入 Sheaves 作为新的可选的、基于每个 CPU 阵列的缓存层。

## 更新 AL2023 到较新的内核版本
<a name="kernelup"></a>

从 2026 年 6 月开始， AL2023 将每年更新默认内核。这[`al2023-ami-kernel-default`](ec2.md#launch-via-aws-cli)组 AMIs 将更新到最新的 LTS 内核，因此新启动的实例将自动提供新的内核版本——这是了解最新安全修复和性能改进的最简单方法。

如果您更喜欢选择特定的内核版本，则可以通过选择预装了所需内核的 AMI 或升级现有的 AL2023 EC2 实例来运行带有内核 6.12 或 6.18 的 AL2023。AL2023 AL2023

### 运行具有特定内核版本的 AL2023 AMI
<a name="kernelup-ami"></a>

您可以选择通过 AWS 控制台或查询 SSM 以获取特定参数来运行预装了特定内核的 AL2023 AMI。要查询的 SSM 密钥以 `/aws/service/ami-amazon-linux-latest/` 开头，后跟以下之一

#### 适用于内核 6.12
<a name="kernel6.12-ami"></a>
+ `al2023-ami-kernel-6.12-arm64`，适用于 arm64 架构
+ `al2023-ami-minimal-kernel-6.12-arm64`，适用于 arm64 架构（AMI 最低版本）
+ `al2023-ami-kernel-6.12-x86_64`，适用于 x86\$164 架构
+ `al2023-ami-minimal-kernel-6.12-x86_64`，适用于 x86\$164 架构（AMI 最低版本）

#### 适用于内核 6.18
<a name="kernel6.18-ami"></a>
+ `al2023-ami-kernel-6.18-arm64`，适用于 arm64 架构
+ `al2023-ami-minimal-kernel-6.18-arm64`，适用于 arm64 架构（AMI 最低版本）
+ `al2023-ami-kernel-6.18-x86_64`，适用于 x86\$164 架构
+ `al2023-ami-minimal-kernel-6.18-x86_64`，适用于 x86\$164 架构（AMI 最低版本）

有关选择[AL2023 使用 SSM 参数启动和 AWS CLI](ec2.md#launch-via-aws-cli)的详细信息，请参阅 AL2023 AMIs。

### 将 AL2023 实例更新到更新的内核
<a name="kernel-ipu"></a>

您可以通过以下步骤将正在运行的 AL2023 实例就地升级到内核 6.12 或 6.18：

1. 检测当前内核并设置目标版本：

   ```
   # Automatically detect current kernel version BEFORE upgrade
   $ CURRENT_KERNEL=$(uname -r)
   $ SOURCE_VERSION=""
   
   $ if [[ $CURRENT_KERNEL == *"6.12"* ]]; then
       SOURCE_VERSION="6.12"
   else
       SOURCE_VERSION=""
   fi
   
   # Save the source version to a persistent location for use after reboot
   $ echo "${SOURCE_VERSION}" | sudo tee /var/lib/source_kernel_version > /dev/null
   ```

   ```
   # Set your target version (change this to your desired kernel: 6.12 or 6.18)
   $ TARGET_VERSION="6.12"
   ```

   ```
   $ echo "Current kernel: ${SOURCE_VERSION:-6.1}"
   $ echo "Upgrading to kernel ${TARGET_VERSION}"
   ```

1. 安装目标内核软件包：

   ```
   $ sudo dnf install -y kernel${TARGET_VERSION}
   ```

1. 获取目标内核包的最新版本：

   ```
   $ version=$(rpm -q --qf '%{version}-%{release}.%{arch}\n' kernel${TARGET_VERSION} | sort -V | tail -1) 
   ```

1. 将新内核设为默认内核：

   ```
   $ sudo grubby --set-default "/boot/vmlinuz-$version" 
   ```

1. 重启系统：

   ```
   $ sudo reboot 
   ```

1. 卸载之前的内核：

   ```
   # Read the source kernel version from the saved file
   $ SOURCE_VERSION=$(sudo cat /var/lib/source_kernel_version)
   
   # Uninstall the source kernel
   $ sudo dnf remove -y kernel${SOURCE_VERSION}
   ```

1. 将多余的内核包替换为目标内核等效包：

   ```
   # Set your target version (change this to your desired kernel: 6.12 or 6.18)
   $ TARGET_VERSION="6.12"
   ```

   ```
   $ declare -A pkgs
   $ pkgs=(
   [bpftool${SOURCE_VERSION}]=bpftool${TARGET_VERSION}
   [kernel${SOURCE_VERSION}-debuginfo]=kernel${TARGET_VERSION}-debuginfo
   [kernel${SOURCE_VERSION}-debuginfo-common]=kernel${TARGET_VERSION}-debuginfo-common
   [kernel${SOURCE_VERSION}-headers]=kernel${TARGET_VERSION}-headers
   [kernel${SOURCE_VERSION}-libbpf]=kernel${TARGET_VERSION}-libbpf
   [kernel${SOURCE_VERSION}-libbpf-devel]=kernel${TARGET_VERSION}-libbpf-devel
   [kernel${SOURCE_VERSION}-libbpf-static]=kernel${TARGET_VERSION}-libbpf-static
   [kernel${SOURCE_VERSION}-modules-extra-common]=kernel${TARGET_VERSION}-modules-extra-common
   [kernel${SOURCE_VERSION}-tools]=kernel${TARGET_VERSION}-tools
   [kernel${SOURCE_VERSION}-tools-devel]=kernel${TARGET_VERSION}-tools-devel
   [perf${SOURCE_VERSION}]=perf${TARGET_VERSION}
   [python3-perf${SOURCE_VERSION}]=python3-perf${TARGET_VERSION}
   )
   $ for pkg in "${!pkgs[@]}"; do 
     rpm -q $pkg && sudo dnf -y swap $pkg "${pkgs["$pkg"]}" ;
   done
   ```

1. （可选）卸载先前内核版本的 kernel-devel：

   ```
   $ rpm -q kernel${SOURCE_VERSION}-devel && sudo dnf remove -y kernel${SOURCE_VERSION}-devel 
   ```

### 降级到较早的内核版本
<a name="kernel-downgrade"></a>

如果您在任何时候需要降级回较早的内核版本，请使用以下步骤：

1. 检测当前内核并设置目标版本：

   ```
   # Automatically detect current kernel version BEFORE downgrade
   $ CURRENT_KERNEL=$(uname -r)
   $ SOURCE_VERSION=""
   
   $ if [[ $CURRENT_KERNEL == *"6.12"* ]]; then
       SOURCE_VERSION="6.12"
   elif [[ $CURRENT_KERNEL == *"6.18"* ]]; then
       SOURCE_VERSION="6.18"
   fi
   
   # Save the source version to a persistent location for use after reboot
   $ echo "${SOURCE_VERSION}" | sudo tee /var/lib/source_kernel_version > /dev/null
   ```

   ```
   # Set your target version (change this to your desired kernel)
   # Use "" for kernel 6.1, "6.12" for kernel 6.12
   $ TARGET_VERSION=""
   ```

   ```
   $ echo "Downgrading from kernel ${SOURCE_VERSION:-6.1} to kernel ${TARGET_VERSION:-6.1}"
   ```

1. 将多余的内核包替换为目标内核等效包：

   ```
   $ declare -A pkgs
   $ pkgs=(
   [bpftool${TARGET_VERSION}]=bpftool${SOURCE_VERSION}
   [kernel${TARGET_VERSION}-debuginfo]=kernel${SOURCE_VERSION}-debuginfo
   [kernel${TARGET_VERSION}-debuginfo-common]=kernel${SOURCE_VERSION}-debuginfo-common
   [kernel${TARGET_VERSION}-headers]=kernel${SOURCE_VERSION}-headers
   [kernel${TARGET_VERSION}-libbpf]=kernel${SOURCE_VERSION}-libbpf
   [kernel${TARGET_VERSION}-libbpf-devel]=kernel${SOURCE_VERSION}-libbpf-devel
   [kernel${TARGET_VERSION}-libbpf-static]=kernel${SOURCE_VERSION}-libbpf-static
   [kernel${TARGET_VERSION}-modules-extra-common]=kernel${SOURCE_VERSION}-modules-extra-common
   [kernel${TARGET_VERSION}-tools]=kernel${SOURCE_VERSION}-tools
   [kernel${TARGET_VERSION}-tools-devel]=kernel${SOURCE_VERSION}-tools-devel
   [perf${TARGET_VERSION}]=perf${SOURCE_VERSION}
   [python3-perf${TARGET_VERSION}]=python3-perf${SOURCE_VERSION}
   )
   $ for pkg in "${!pkgs[@]}"; do 
     rpm -q "${pkgs["$pkg"]}" && sudo dnf -y swap "${pkgs["$pkg"]}" $pkg ;
   done
   ```

1. 安装目标内核软件包：

   ```
   $ sudo dnf install -y kernel${TARGET_VERSION}
   ```

1. 获取目标内核包的最新版本：

   ```
   $ version=$(rpm -q --qf '%{version}-%{release}.%{arch}\n' kernel${TARGET_VERSION} | sort -V | tail -1) 
   ```

1. 将目标内核设为默认内核：

   ```
   $ sudo grubby --set-default "/boot/vmlinuz-$version" 
   ```

1. 重启系统：

   ```
   $ sudo reboot 
   ```

1. 卸载源内核：

   ```
   # Read the source kernel version from the saved file
   $ SOURCE_VERSION=$(sudo cat /var/lib/source_kernel_version)
   
   # Uninstall the source kernel
   $ sudo dnf remove -y kernel${SOURCE_VERSION}
   ```

## AL2023 内核-常见问题解答
<a name="al2023-kernel-faq"></a>

### 1. 内核更新后是否需要重启？
<a name="w2aac37c19b9b3"></a>

对运行中内核的任何更改都需要重启。

### 2. 如何 up-to-date跨多个实例保留内核？
<a name="w2aac37c19b9b5"></a>

Amazon Linux 不提供管理实例集的工具。我们建议您使用诸如 [AWS Systems Manager](https://aws.amazon.com/systems-manager/) 等工具为大型实例集打补丁。

### 3. 如何检查当前运行的内核版本？
<a name="w2aac37c19b9b7"></a>

在您的 AL2023 实例上执行以下命令：

```
$ uname -r 
```

### 4. AL2023 推荐我使用哪个内核？
<a name="w2aac37c19b9b9"></a>

建议在所有其他 AL2023 内核仍受支持的情况下升级到最新的 AL2023 内核 6.18。建议客户在升级之前对其工作负载进行测试。

### 5. 我现有的应用程序可以与任何 AL2023 内核一起使用吗？
<a name="w2aac37c19b9c11"></a>

AL2023 支持更新的内核（6.12 或 6.18），就像内核 6.1 一样。应用程序将起作用，并且正在幕后进行改进。无论如何，在切换到更新的内核之前，客户都应测试其特定工作负载。

### 6. 如何为内核 6.12 或 6.18 安装内核头文件、开发包和额外模块？
<a name="w2aac37c19b9c13"></a>

请运行：

```
$ version=$(uname -r | grep -oP '^\d+\.\d+')
$ sudo dnf install -y kernel${version}-modules-extra-$(uname -r) kernel${version}-headers-$(uname -r) kernel${version}-devel-$(uname -r)
```

### 7. 内核 6.12 和 6.18 将支持多长时间？
<a name="w2aac37c19b9c15"></a>

在亚马逊 Linux 2023 的计划生命周期结束之前，也就是 2029-06-30，将一直支持内核 6.12 和 6.18。