如何在不删除内核的情况下从GRUB中排除指定Oracle内核
我完全理解你的困扰——那个作为NVIDIA驱动依赖的Oracle内核莫名其妙跑到GRUB菜单最上面,双系统切换时还要手动选内核确实麻烦,而且你既不想删掉它(毕竟是驱动必需的依赖),也不想手动固定默认内核导致错过系统更新。下面给你两个实用的方案,都能精准满足你的需求:
方案一:用dpkg-divert隐藏内核文件(推荐)
这个方法的核心是把Oracle内核的镜像文件“转移”到GRUB扫描不到的位置,但内核文件本身还留在系统里,完全不会影响NVIDIA驱动的依赖关系。
先找到你要排除的Oracle内核版本号,运行下面的命令列出所有内核:
ls /boot/vmlinuz-*你会看到类似
vmlinuz-5.15.0-1047-oracle的条目,记下完整的版本号(比如5.15.0-1047-oracle)。用
dpkg-divert把内核镜像和initrd文件重命名为GRUB不会扫描的后缀:sudo dpkg-divert --divert /boot/vmlinuz-<你的Oracle版本号>.hidden --rename /boot/vmlinuz-<你的Oracle版本号> sudo dpkg-divert --divert /boot/initrd.img-<你的Oracle版本号>.hidden --rename /boot/initrd.img-<你的Oracle版本号>替换成实际版本号的示例:
sudo dpkg-divert --divert /boot/vmlinuz-5.15.0-1047-oracle.hidden --rename /boot/vmlinuz-5.15.0-1047-oracle sudo dpkg-divert --divert /boot/initrd.img-5.15.0-1047-oracle.hidden --rename /boot/initrd.img-5.15.0-1047-oracle更新GRUB配置让修改生效:
sudo update-grub现在重启系统,你会发现那个Oracle内核已经从GRUB的「Advanced options」菜单里消失了,默认启动项也会自动指向最新的系统内核。
如果以后需要恢复显示这个内核,只需要撤销divert操作:
sudo dpkg-divert --rename --remove /boot/vmlinuz-<你的Oracle版本号> sudo dpkg-divert --rename --remove /boot/initrd.img-<你的Oracle版本号> sudo update-grub
方案二:修改GRUB脚本过滤特定内核
这个方法是通过修改GRUB的配置生成脚本,让它自动过滤掉包含「oracle」关键词的内核。优点是如果以后有新的Oracle内核更新,不需要重复操作;缺点是系统更新GRUB包时,修改的脚本可能被覆盖,需要重新设置。
打开GRUB的内核扫描脚本:
sudo nano /etc/grub.d/10_linux找到循环扫描内核的起始行,大概是这样:
for i in /boot/vmlinuz-* /vmlinuz-* /boot/kernel-* ; do在这行下面添加一行过滤逻辑,跳过包含「oracle」的内核文件:
if echo "$i" | grep -q "oracle"; then continue; fi保存并退出编辑器(nano里按
Ctrl+O回车,再按Ctrl+X)。更新GRUB配置:
sudo update-grub
为了避免系统更新GRUB时覆盖你的修改,建议把修改后的脚本备份并替换为自定义版本:
sudo cp /etc/grub.d/10_linux /etc/grub.d/10_linux_custom sudo chmod +x /etc/grub.d/10_linux_custom sudo mv /etc/grub.d/10_linux /etc/grub.d/10_linux.bak
这样GRUB会优先使用你的自定义脚本,系统更新时也不会被覆盖。
不管用哪个方案,都建议保留你当前的GRUB_DEFAULT=saved配置,这样重启时会记住你上次选的内核,双系统切换时如果需要临时选其他内核也没问题,平时则自动启动最新的系统内核。
备注:内容来源于stack exchange,提问作者Des Cuddlebat

