如何固定linux 内核
在 Linux 系统中,固定(锁定)内核版本可以防止系统在更新时自动升级到新内核,从而保持系统稳定性。以下是几种常见的方法:
方法 1:使用 apt-mark
锁定内核(推荐)
适用于 Debian/Ubuntu 系统,使用 apt-mark
阻止内核自动升级:
1. 查看已安装的内核
dpkg --list | grep linux-image
或
apt list --installed | grep linux-image
2. 锁定当前内核版本
sudo apt-mark hold linux-image-<version> linux-headers-<version> linux-modules-<version>
例如:
sudo apt-mark hold linux-image-6.8.0-59-generic linux-headers-6.8.0-59-generic linux-modules-6.8.0-59-generic
3. 检查锁定状态
apt-mark showhold
4. 解锁内核(如需恢复更新)
sudo apt-mark unhold linux-image-<version> linux-headers-<version> linux-modules-<version>
方法 2:修改 /etc/apt/apt.conf.d/
阻止内核更新
适用于 Debian/Ubuntu,手动配置 APT 忽略内核更新:
1. 创建或编辑 APT 配置文件
sudo nano /etc/apt/apt.conf.d/99-hold-kernel
2. 添加以下内容
Package: linux-image-*
Pin: version *
Pin-Priority: -1
Package: linux-headers-*
Pin: version *
Pin-Priority: -1
Package: linux-modules-*
Pin: version *
Pin-Priority: -1
3. 保存并退出(Ctrl + X
→ Y
→ Enter
)
然后运行:
sudo apt update
方法 3:手动删除新内核(不推荐)
如果已经安装了新内核,可以手动删除并保留旧内核:
1. 查看所有内核
dpkg --list | grep linux-image
2. 删除不需要的内核
sudo apt remove linux-image-<unwanted-version> linux-headers-<unwanted-version>
例如:
sudo apt remove linux-image-6.8.0-40-generic linux-headers-6.8.0-40-generic
3. 更新 GRUB
sudo update-grub
方法 4:使用 yum/dnf
锁定内核(RHEL/CentOS/Fedora)
适用于 RHEL/CentOS/Fedora 系统:
1. 查看已安装的内核
rpm -qa | grep kernel
2. 锁定内核
sudo yum versionlock add kernel-<version>
或(Fedora/CentOS 8+)
sudo dnf versionlock add kernel-<version>
3. 检查锁定状态
sudo yum versionlock list
或
sudo dnf versionlock list
4. 解锁内核
sudo yum versionlock delete kernel-<version>
或
sudo dnf versionlock delete kernel-<version>
总结
方法 | 适用系统 | 推荐度 |
---|---|---|
apt-mark hold | Debian/Ubuntu | ⭐⭐⭐⭐⭐ |
APT 配置文件 | Debian/Ubuntu | ⭐⭐⭐⭐ |
手动删除内核 | 所有 Linux | ⭐⭐(不推荐) |
yum/dnf versionlock | RHEL/CentOS/Fedora | ⭐⭐⭐⭐⭐ |
推荐使用 apt-mark hold
或 dnf versionlock
,因为它们不会影响其他软件更新,仅锁定内核版本。
如果只是想防止自动升级,方法 1 或 方法 2 是最安全的选择。
如何切换内核
在 Linux 系统中,你可以手动切换内核版本,通常是在 GRUB 启动菜单 中选择不同的内核,或者 永久更改默认启动的内核。以下是具体方法:
方法 1:临时切换(GRUB 启动菜单)
适用于 单次启动 选择不同内核:
- 重启电脑,在 BIOS/UEFI 界面后,按住
Shift
(BIOS)或Esc
(UEFI) 进入 GRUB 菜单。 - 选择
Advanced options for Ubuntu
(或类似选项)。 - 选择你想要启动的内核版本(如
6.8.0-40-generic
或6.8.0-59-generic
)。 - 按
Enter
启动,系统会临时使用该内核,下次重启仍会恢复默认内核。
方法 2:永久切换默认内核
适用于 长期使用某个内核,修改 GRUB 默认启动项:
1. 查看当前可用内核
awk -F\' '/menuentry / {print $2}' /boot/grub/grub.cfg | grep -i "linux"
或
grep -A100 "menuentry 'Ubuntu" /boot/grub/grub.cfg | grep "linux"
输出示例:
Ubuntu, with Linux 6.8.0-59-generic
Ubuntu, with Linux 6.8.0-59-generic (recovery mode)
Ubuntu, with Linux 6.8.0-40-generic
Ubuntu, with Linux 6.8.0-40-generic (recovery mode)
2. 查看当前默认内核
grub-editenv list | grep saved_entry
或
cat /proc/cmdline | grep -o "BOOT_IMAGE=[^ ]*"
3. 修改 GRUB 默认启动项
方法 A:使用 grub-set-default
(推荐)
sudo grub-set-default "Ubuntu, with Linux 6.8.0-40-generic" # 替换成你要的内核
然后更新 GRUB:
sudo update-grub
方法 B:手动编辑 /etc/default/grub
sudo nano /etc/default/grub
找到 GRUB_DEFAULT
,修改为:
GRUB_DEFAULT="Ubuntu, with Linux 6.8.0-40-generic" # 替换成你要的内核
保存后更新 GRUB:
sudo update-grub
4. 重启生效
sudo reboot
方法 3:卸载不需要的内核(可选)
如果某个内核不再需要,可以卸载它(谨慎操作!):
sudo apt remove linux-image-6.8.0-59-generic linux-headers-6.8.0-59-generic # 替换成要卸载的版本
然后更新 GRUB:
sudo update-grub
总结
方法 | 适用场景 | 命令示例 |
---|---|---|
临时切换 | 单次测试不同内核 | 在 GRUB 菜单手动选择 |
永久切换(推荐) | 长期使用某个内核 | sudo grub-set-default "Ubuntu, with Linux 6.8.0-40-generic" + sudo update-grub |
卸载旧内核 | 清理不再使用的内核 | sudo apt remove linux-image-6.8.0-59-generic |
注意事项
• 不要卸载所有旧内核,至少保留一个备用内核以防新内核启动失败。
• 如果新内核启动失败,可以在 GRUB 菜单选择旧内核进入系统。
• 某些服务器可能需要调整 GRUB_TIMEOUT
让菜单显示更长时间(默认 5 秒)。
最新的切换内核的方法
出现报错
Sourcing file `/etc/default/grub'
Sourcing file `/etc/default/grub.d/init-select.cfg'
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-6.8.0-59-generic
Found initrd image: /boot/initrd.img-6.8.0-59-generic
Found linux image: /boot/vmlinuz-6.8.0-40-generic
Found initrd image: /boot/initrd.img-6.8.0-40-generic
Warning: Please don't use old title `Ubuntu, with Linux 6.8.0-40-generic' for GRUB_DEFAULT, use `Advanced options for Ubuntu>Ubuntu, with Linux 6.8.0-40-generic' (for versions before 2.00) or `gnulinux-advanced-0d453e5b-866c-4b5a-b9dc-467f6d324695>gnulinux-6.8.0-40-generic-advanced-0d453e5b-866c-4b5a-b9dc-467f6d324695' (for 2.00 or later)
Found memtest86+ image: /boot/memtest86+.elf
Found memtest86+ image: /boot/memtest86+.bin
Warning: os-prober will not be executed to detect other bootable partitions.
Systems on them will not be added to the GRUB boot configuration.
Check GRUB_DISABLE_OS_PROBER documentation entry.
done
从你的 update-grub
输出可以看到,系统检测到了两个内核:
• 6.8.0-59-generic
(当前默认)
• 6.8.0-40-generic
但 GRUB 警告你 不要直接使用 Ubuntu, with Linux 6.8.0-40-generic
作为 GRUB_DEFAULT
,而是应该使用 完整的 GRUB 菜单路径(因为 GRUB 2.00+ 版本使用了更复杂的 ID 机制)。
如何正确切换默认内核?
方法 1:使用 grub-set-default
(推荐)
-
查看所有可用的 GRUB 菜单项:
sudo grep -P "menuentry |submenu " /boot/grub/grub.cfg
输出示例:
menuentry 'Ubuntu' --class ubuntu ... submenu 'Advanced options for Ubuntu' ... menuentry 'Ubuntu, with Linux 6.8.0-59-generic' ... menuentry 'Ubuntu, with Linux 6.8.0-59-generic (recovery mode)' ... menuentry 'Ubuntu, with Linux 6.8.0-40-generic' ... menuentry 'Ubuntu, with Linux 6.8.0-40-generic (recovery mode)' ...
-
设置默认启动项:
• 如果你想默认启动6.8.0-40-generic
,运行:sudo grub-set-default 'Advanced options for Ubuntu>Ubuntu, with Linux 6.8.0-40-generic'
• 或者使用 GRUB 2.00+ 的完整 ID(从警告信息中复制):
sudo grub-set-default 'gnulinux-advanced-0d453e5b-866c-4b5a-b9dc-467f6d324695>gnulinux-6.8.0-40-generic-advanced-0d453e5b-866c-4b5a-b9dc-467f6d324695'
-
更新 GRUB:
sudo update-grub
-
验证是否生效:
grub-editenv list | grep saved_entry
应该显示你刚刚设置的默认内核。
方法 2:手动编辑 /etc/default/grub
-
打开配置文件:
sudo nano /etc/default/grub
-
修改
GRUB_DEFAULT
:
• 方式 1(推荐):使用>
GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 6.8.0-40-generic"
• 方式 2:使用 GRUB 2.00+ 的完整 ID(从警告信息复制)
GRUB_DEFAULT="gnulinux-advanced-0d453e5b-866c-4b5a-b9dc-467f6d324695>gnulinux-6.8.0-40-generic-advanced-0d453e5b-866c-4b5a-b9dc-467f6d324695"
-
保存并更新 GRUB:
sudo update-grub
如何验证当前运行的内核?
uname -r
输出示例:
6.8.0-59-generic # 当前运行的内核
总结
方法 | 适用场景 | 命令示例 |
---|---|---|
grub-set-default | 推荐方式 | sudo grub-set-default 'Advanced options for Ubuntu>Ubuntu, with Linux 6.8.0-40-generic' |
手动编辑 /etc/default/grub | 需要精确控制 | 修改 GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 6.8.0-40-generic" |
验证当前内核 | 检查是否生效 | uname -r |
注意事项
• 不要直接使用 Ubuntu, with Linux x.x.x-xx-generic
,必须包含 Advanced options for Ubuntu>
前缀。
• 如果修改后无法启动,可以在 GRUB 菜单手动选择旧内核进入系统并修复配置。
• 建议保留至少一个旧内核作为备用。
根据你的 update-grub
输出,系统检测到两个可用的 Linux 内核:
• 6.8.0-59-generic
(较新版本)
• 6.8.0-40-generic
(较旧版本)
以下是几种管理内核的方法:
- 查看当前运行的内核
uname -r
- 查看所有已安装的内核
dpkg --list | grep linux-image
-
临时选择不同内核(下次启动时)
重启时在 GRUB 菜单中选择: -
重启电脑
-
在 BIOS/UEFI 界面后按住
Shift
(传统 BIOS)或Esc
(UEFI)进入 GRUB 菜单 -
选择 “Advanced options for Ubuntu”
-
选择你想要的内核版本
-
永久更改默认内核(两种方法)
方法一:使用 grub-set-default(推荐)
sudo grub-set-default "Advanced options for Ubuntu>Ubuntu, with Linux 6.8.0-40-generic"
sudo update-grub
方法二:编辑 GRUB 配置文件
sudo nano /etc/default/grub
修改:
GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 6.8.0-40-generic"
然后:
sudo update-grub
- 删除不需要的内核(谨慎操作)
sudo apt purge linux-image-6.8.0-59-generic linux-headers-6.8.0-59-generic
sudo update-grub
- 锁定内核版本(防止自动更新)
sudo apt-mark hold linux-image-6.8.0-40-generic linux-headers-6.8.0-40-generic
注意事项:
- 始终保留至少一个可用的内核
- 更改默认内核后建议重启验证
- 如果遇到启动问题,可以在 GRUB 菜单中选择旧内核进入系统
需要更详细的帮助可以告诉我你想实现的具体目标。