Alibaba Cloud Linux 3 AI Extension Edition修改启动项和内核命令行参数

本文介绍如何在Alibaba Cloud Linux 3 AI Extension Edition操作系统中,使用grubby工具添加或删除内核启动参数。

了解启动配置文件结构

  • 启动项配置文件:GRUB所有的启动项配置在 /boot/loader/entries/ 目录下。文件名由machine-id(/etc/machine-id )和内核版本组合而成,例如 c8742e47872643a6839300623c28b57c-5.10.134-19.101.al8.x86_64.conf

  • 配置文件示例:

    title Alibaba Cloud Linux (5.10.134-19.101.al8.x86_64) 3 (OpenAnolis Edition)
    version 5.10.134-19.101.al8.x86_64
    linux /boot/vmlinuz-5.10.134-19.101.al8.x86_64
    initrd /boot/initramfs-5.10.134-19.101.al8.x86_64.img $tuned_initrd
    options $kernelopts $tuned_params
    id alinux-20250707132428-5.10.134-19.101.al8.x86_64
    grub_users $grub_users
    grub_arg --unrestricted
    grub_class kernel

    其中,options 行决定了内核启动时接收的参数。默认情况下,它会引用一个名为 kernelopts 的变量。这个变量定义了适用于所有启动项的通用内核参数。它的值存储在 /boot/grub2/grubenv 文件中。通过修改这个变量,可以实现对所有内核版本的全局参数管理。

推荐工具

手动编辑上述配置文件,存在格式错误导致系统无法启动的风险。推荐使用 grubby 命令行工具来管理内核启动项。grubby 能够自动处理复杂的配置文件更新,确保操作的原子性和正确性。

前提条件

在开始操作前,请确保满足以下条件:

  • 权限准备: 使用具有 root 权限的用户登录到目标ECS实例。

  • 数据备份(推荐): 对于生产环境,建议您在操作前为实例创建快照,以便在出现意外时能够快速恢复。

  • AI增强镜像特殊配置: Alibaba Cloud Linux 3 AI增强镜像中若需修改内核命令行参数或者修改启动项,在执行任何grubby修改命令之前,必须先执行一次以下命令。

    efibootmgr -q && test -f /boot/efi/EFI/alinux/grubenv && ln -sf ../efi/EFI/alinux/grubenv /boot/grub2/grubenv # 该命令仅需执行一次,重复执行无害
重要

此操作用于确保grubenv环境被正确链接,否则您的修改将不会生效。

使用grubby修改启动参数

本章节提供两种修改内核启动参数的核心方法。请根据您的具体需求选择合适的方法。

全局修改所有启动项的参数

当您需要将一个参数(例如,为适配某种硬件而添加 nvme_core.io_timeout=4294967295)应用到所有已安装的内核版本上时,应使用此方法。

  • 原理: grubby 会直接修改 /boot/grub2/grubenv 文件中 kernelopts 变量的值,所有引用该变量的启动项都会受到影响。

  • 操作命令:

    • 添加参数

      grubby --update-kernel=ALL --args="<NEW_PARAMETER>"   
      # 将 <NEW_PARAMETER> 替换为您要添加的实际参数,例如:"nvme_core.io_timeout=4294967295"
    • 删除参数

      grubby --update-kernel=ALL --remove-args="<PARAMETER_TO_REMOVE>" 
       # 将 <PARAMETER_TO_REMOVE> 替换为您要删除的实际参数,例如:"quiet"

修改单个启动项的内核命令行参数

当您只想为一个特定的内核版本(例如,为当前运行的内核)添加或删除一个测试性参数,而不希望影响其他内核版本或未来的全局修改时,可使用此方法。

  • 原理: 修改单个启动项的内核命令行参数,kernelopts变量会被展开,并保存到相应的启动项配置文件/boot/loader/entries/<RELEVANT_KERNEL_BOOT_ENTRY.conf>中。

    说明

    后续如果需要继续修改该启动项的内核命令行参数,需要指定启动项修改,因为启动项配置文件中不再包含kernelopts变量。

  • 操作命令:

    • 添加参数

      grubby --update-kernel=/boot/vmlinuz-$(uname -r) --args="<NEW_PARAMETER>"
      # 将 <NEW_PARAMETER> 替换为您要添加的实际参数 
    • 删除参数

      grubby --update-kernel=/boot/vmlinuz-$(uname -r) --remove-args="<PARAMETER_TO_REMOVE>"
      # 将 <PARAMETER_TO_REMOVE> 替换为您要删除的实际参数