当前位置:首页>Linux>《Linux(Ubuntu)固定内核的几种方法》

《Linux(Ubuntu)固定内核的几种方法》

  • 2026-10-05 13:57:15
《Linux(Ubuntu)固定内核的几种方法》

Linux(Ubuntu)固定内核的几种方法

方案一

要实现“无论内核是否更新,系统始终使用指定内核启动”,最直接有效的方法是修改GRUB引导程序的默认启动项。这样即使系统安装了新内核,启动时仍会使用您设定的旧内核。

核心操作步骤

  1. 1. 确定您要固定的内核版本
    在终端中运行:
    uname -r
    记下输出结果,例如 5.15.0-92-generic。这就是您当前正在使用的、希望以后一直使用的内核。
  2. 2. 设置GRUB默认启动此项内核
    • • 编辑GRUB配置文件:
      sudo nano /etc/default/grub
    • • 找到以 GRUB_DEFAULT= 开头的行。将其修改为以下两种格式之一:
      格式A(推荐,通过菜单标题精确匹配):
      GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 5.15.0-92-generic"
      请将 5.15.0-92-generic 替换为您第一步记下的实际版本号。
      格式B(通过菜单项序号,但序号在更新后可能变化,不推荐):
      GRUB_DEFAULT="1>2"
      这表示从主菜单选择第1项(通常是“Ubuntu高级选项”),然后在子菜单选择第2项(即您要的内核)。序号从0开始计数。
  3. 3. 使配置生效
    保存并关闭编辑器后,运行以下命令更新GRUB:
    sudo update-grub
  4. 4. 验证设置
    重启计算机。在GRUB启动菜单界面,您会看到默认高亮项已经是您指定的内核版本。

方案优势与原理

  • • 简单直接:只需修改一个文件并执行一条命令。
  • • 一劳永逸:设置后,无论未来通过 apt 手动安装还是系统自动安装了多少新内核,GRUB都会始终默认从您指定的旧内核启动。
  • • 安全灵活:您并未禁止安装新内核,安全更新仍可接收。在GRUB菜单中您仍然可以手动选择新内核启动,提供了回退和测试的灵活性。

重要提示

  • • 修改前建议备份原文件:sudo cp /etc/default/grub /etc/default/grub.bak。
  • • 确保您写入 GRUB_DEFAULT 的内核版本字符串必须与GRUB菜单中显示的完全一致(包括大小写和空格)。最可靠的方法是重启时先查看GRUB菜单中的完整条目名称。
  • • 此方法只控制默认启动项,不会阻止新内核被安装到硬盘上。

以上设定可以通过以下脚本实现

用于实现“无论内核是否更新,系统始终使用指定内核启动”:

#!/bin/bash
# 文件名: fix-kernel-boot.sh
# 功能:设置系统始终使用当前运行的内核版本启动
# 使用方法:sudo bash fix-kernel-boot.sh

# 检查是否以root权限运行
if [[ $EUID -ne 0 ]]; then
echo"错误: 此脚本需要以root权限运行。请使用sudo执行。"
echo"用法: sudo bash $0"
exit 1
fi

echo"========================================="
echo"  GRUB默认启动内核设置脚本"
echo"========================================="
echo"当前运行的内核: $(uname -r)"
echo""

# 备份原配置文件
BACKUP_FILE="/etc/default/grub.bak.$(date +%Y%m%d%H%M%S)"
cp /etc/default/grub "$BACKUP_FILE"
echo"✓ 已备份原配置文件到: $BACKUP_FILE"

# 获取当前内核版本
CURRENT_KERNEL=$(uname -r)
GRUB_ENTRY="Advanced options for Ubuntu>Ubuntu, with Linux ${CURRENT_KERNEL}"

echo"✓ 要设置的GRUB默认启动项: $GRUB_ENTRY"
echo""

# 检查是否已设置为当前内核
if grep -q "^GRUB_DEFAULT=.*${CURRENT_KERNEL}" /etc/default/grub; then
echo"⚠  GRUB已设置为当前内核: ${CURRENT_KERNEL}"
echo"   无需修改。"
else
# 删除现有的GRUB_DEFAULT行
    sed -i '/^GRUB_DEFAULT=/d' /etc/default/grub

# 添加新的GRUB_DEFAULT设置
echo"GRUB_DEFAULT=\"$GRUB_ENTRY\"" >> /etc/default/grub
echo"✓ 已更新GRUB配置文件"
fi

echo""

# 更新GRUB配置
echo"正在更新GRUB配置..."
if update-grub; then
echo"✓ GRUB配置更新成功!"
else
echo"✗ GRUB配置更新失败,请检查错误信息。"
exit 1
fi

echo""
echo"========================================="
echo"设置完成!"
echo""
echo"总结:"
echo"1. 系统将始终默认从内核 ${CURRENT_KERNEL} 启动"
echo"2. 即使安装了新内核,启动时仍会使用此内核"
echo"3. 在GRUB菜单中您仍可手动选择其他内核启动"
echo""
echo"如需恢复默认设置,请执行:"
echo"  sudo cp $BACKUP_FILE /etc/default/grub"
echo"  sudo update-grub"
echo"========================================="

使用方法:

  1. 1. 保存脚本:
    将上面的代码保存为 fix-kernel-boot.sh 文件。
  2. 2. 给予执行权限:
    chmod +x fix-kernel-boot.sh
  3. 3. 运行脚本:
    sudo ./fix-kernel-boot.sh

脚本功能说明:

  1. 1. 自动检测当前内核:脚本会自动获取当前运行的内核版本
  2. 2. 安全备份:在执行任何修改前,会自动备份原配置文件
  3. 3. 智能设置:自动构造正确的GRUB启动项字符串
  4. 4. 避免重复设置:如果已设置为当前内核,会提示无需修改
  5. 5. 自动更新GRUB:执行 update-grub 使配置生效
  6. 6. 详细输出:显示每一步的执行结果

验证方法:

重启系统后,观察GRUB启动菜单,默认高亮项应该是您设置的内核版本。

恢复方法:

如果您想恢复设置,脚本会提示您备份位置,只需执行:

sudocp /etc/default/grub.bak.xxxxxxxxxxxx /etc/default/grub
sudo update-grub

注意事项:

  1. 1. 此脚本只修改GRUB的默认启动项,不会阻止新内核的安装
  2. 2. 您仍然可以通过GRUB菜单手动选择其他内核启动
  3. 3. 如果GRUB菜单结构发生变化,可能需要手动调整设置
  4. 4. 建议在修改前查看当前GRUB菜单,确认启动项名称格式

这个脚本提供了最简单直接的方法,确保系统始终从您指定的内核启动,而不会影响新内核的安装。

方案二

关闭Ubuntu 22.04的自动内核更新的方法是锁定内核包并禁用自动更新服务。以下是具体步骤:

核心操作步骤

  1. 1. 锁定当前内核版本
    sudo apt-mark hold linux-image-$(uname -r)
    sudo apt-mark hold linux-headers-$(uname -r)
    sudo apt-mark hold linux-modules-extra-$(uname -r)
    这会将当前内核包标记为“保持”状态,防止被自动升级。
  2. 2. 禁用自动更新配置
    sudo nano /etc/apt/apt.conf.d/20auto-upgrades
    将以下两行的 "1" 改为 "0":
    APT::Periodic::Update-Package-Lists "0";
    APT::Periodic::Unattended-Upgrade "0";
    保存并退出。
  3. 3. (可选)禁用自动更新服务
    sudo systemctl disable unattended-upgrades
    sudo systemctl stop unattended-upgrades
    这会彻底停止后台自动更新服务。

验证设置

  • • 检查内核锁定状态:apt-mark showhold
  • • 检查自动更新配置:cat /etc/apt/apt.conf.d/20auto-upgrades
  • • 检查服务状态:systemctl status unattended-upgrades

注意事项

  1. 1. 安全风险:禁用内核自动更新意味着您将无法自动接收安全补丁,建议定期手动检查并安装重要更新。
  2. 2. 恢复更新:如需恢复,执行:
    sudo apt-mark unhold linux-image-$(uname -r) linux-headers-$(uname -r)
    sudo apt-mark unhold linux-modules-extra-$(uname -r)
    并将配置文件中的 "0" 改回 "1"。

此方案通过双重保障(包锁定+服务禁用)确保内核不会被自动更新,同时保持系统其他部分的更新机制不受影响。

最新文章

随机文章