Linux(Ubuntu)固定内核的几种方法
方案一
要实现“无论内核是否更新,系统始终使用指定内核启动”,最直接有效的方法是修改GRUB引导程序的默认启动项。这样即使系统安装了新内核,启动时仍会使用您设定的旧内核。
核心操作步骤
- 1. 确定您要固定的内核版本
在终端中运行:uname -r
记下输出结果,例如 5.15.0-92-generic。这就是您当前正在使用的、希望以后一直使用的内核。 - • 编辑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. 使配置生效
保存并关闭编辑器后,运行以下命令更新GRUB:sudo update-grub
- 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. 保存脚本:
将上面的代码保存为 fix-kernel-boot.sh 文件。 - 2. 给予执行权限:
chmod +x fix-kernel-boot.sh
- 3. 运行脚本:
sudo ./fix-kernel-boot.sh
脚本功能说明:
- 1. 自动检测当前内核:脚本会自动获取当前运行的内核版本
- 2. 安全备份:在执行任何修改前,会自动备份原配置文件
- 3. 智能设置:自动构造正确的GRUB启动项字符串
- 4. 避免重复设置:如果已设置为当前内核,会提示无需修改
- 5. 自动更新GRUB:执行
update-grub 使配置生效
验证方法:
重启系统后,观察GRUB启动菜单,默认高亮项应该是您设置的内核版本。
恢复方法:
如果您想恢复设置,脚本会提示您备份位置,只需执行:
sudocp /etc/default/grub.bak.xxxxxxxxxxxx /etc/default/grub
sudo update-grub
注意事项:
- 1. 此脚本只修改GRUB的默认启动项,不会阻止新内核的安装
- 2. 您仍然可以通过GRUB菜单手动选择其他内核启动
- 3. 如果GRUB菜单结构发生变化,可能需要手动调整设置
- 4. 建议在修改前查看当前GRUB菜单,确认启动项名称格式
这个脚本提供了最简单直接的方法,确保系统始终从您指定的内核启动,而不会影响新内核的安装。
方案二
关闭Ubuntu 22.04的自动内核更新的方法是锁定内核包并禁用自动更新服务。以下是具体步骤:
核心操作步骤
- 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. 禁用自动更新配置
sudo nano /etc/apt/apt.conf.d/20auto-upgrades
将以下两行的 "1" 改为 "0":APT::Periodic::Update-Package-Lists "0";
APT::Periodic::Unattended-Upgrade "0";
保存并退出。 - 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. 安全风险:禁用内核自动更新意味着您将无法自动接收安全补丁,建议定期手动检查并安装重要更新。
- 2. 恢复更新:如需恢复,执行:
sudo apt-mark unhold linux-image-$(uname -r) linux-headers-$(uname -r)
sudo apt-mark unhold linux-modules-extra-$(uname -r)
并将配置文件中的 "0" 改回 "1"。
此方案通过双重保障(包锁定+服务禁用)确保内核不会被自动更新,同时保持系统其他部分的更新机制不受影响。