
1. 项目概述为什么GRUB启动项会“冗余”如果你在电脑上安装了Ubuntu尤其是和Windows组成了双系统那么开机时那个黑底白字的GRUB菜单你一定不陌生。它全称是GRand Unified Bootloader是Linux世界的“引路人”负责在电脑启动时加载操作系统内核。但有时候这个菜单会变得“不听话”——里面塞满了你早已删除的旧系统内核条目或者残留着已经卸载的Windows系统选项甚至是一些你从未见过的、莫名其妙的启动项。这不仅让开机选择变得冗长混乱更关键的是某些损坏或无效的条目可能会导致系统引导失败直接把你卡在开机界面。这个问题太常见了。我见过太多朋友在更新了几次内核或者折腾了一番双系统后GRUB菜单就变得像一本乱涂乱画的旧书有用的条目和历史的“垃圾”混在一起。手动删除这些多余的GRUB启动项并不是什么高深的黑客技术而是一项非常基础但极其重要的系统维护技能。它关乎你电脑启动的清爽与稳定。今天我就以一个过来人的身份把这里面的门道、具体操作步骤以及我踩过的那些坑给你彻底讲明白。无论你是刚接触Ubuntu的新手还是已经用了一段时间但被GRUB困扰的用户这篇内容都能让你亲手驯服这个启动管理器。2. GRUB启动项管理核心原理拆解在动手删除任何东西之前我们必须先搞清楚GRUB是怎么工作的。知其然更要知其所以然这样才能在出问题时知道从哪里救回来。2.1 GRUB 2的配置文件体系现代的Ubuntu使用的都是GRUB 2它的配置不再是一个单一的menu.lst文件而是一个灵活的脚本生成体系。理解这个体系是安全操作的前提。核心文件位于/boot/grub/和/etc/default/grub以及/etc/grub.d/目录下。/boot/grub/grub.cfg这是GRUB在启动时真正读取的最终配置文件。重要警告你永远不应该直接手动编辑这个文件因为它是被grub-mkconfig或update-grub命令自动生成的任何手动修改都会在下一次系统更新或生成配置时被覆盖。/etc/default/grub这是主要的用户配置文件。你可以在这里设置全局变量比如默认启动项、超时时间、是否显示隐藏菜单等。我们后续的一些优化操作会在这里进行。/etc/grub.d/这个目录里存放着一系列可执行脚本如10_linux,30_os-prober,40_custom等。grub-mkconfig命令会按照数字顺序执行这些脚本并将它们的输出拼接到一起最终生成/boot/grub/grub.cfg。10_linux负责扫描并添加当前系统安装的内核30_os-prober则负责探测硬盘上其他操作系统如Windows并为其生成启动项。当你执行sudo update-grub命令时系统做的就是调用grub-mkconfig根据上述脚本和配置重新生成/boot/grub/grub.cfg文件。因此我们“删除”启动项的本质其实是通过修改底层配置或清理系统文件来影响grub-mkconfig生成新菜单时的内容。2.2 启动项来源分析什么该删什么该留GRUB菜单里的条目主要来自以下几个地方搞清楚来源才能精准“打击”旧内核条目这是最常见的“垃圾”。Ubuntu在更新内核时默认会保留旧内核以防新内核启动失败。但保留2-3个就够了半年前的内核完全可以清理。已卸载系统的残留项比如你移除了Windows系统但30_os-prober脚本可能还在/boot/grub/grub.cfg里留下了它的启动项因为对应的磁盘分区或引导文件可能还在。内存测试工具memtest86这个工具通常有两个条目普通版和串口控制台版对于绝大多数桌面用户来说基本用不到可以移除。恢复模式条目每个内核都会对应一个“recovery mode”选项用于系统修复。这个绝对不能删除它是系统出问题时的救命稻草。自定义条目通过/etc/grub.d/40_custom脚本手动添加的条目。我们的清理目标主要是前三种冗余的旧内核、不存在的系统残留、以及无用的内存测试工具。3. 实战操作安全删除GRUB启动项全流程理论说完了现在进入实战环节。请跟着步骤一步一步来建议在操作前先打开一个文本编辑器记录下你当前的GRUB菜单顺序开机时拍照或快速抄录以便后续对照。3.1 方法一清理旧内核条目最推荐、最安全这是最规范、最系统的方法通过包管理器来操作能确保依赖关系完整。步骤1查看当前已安装的所有内核在终端中执行dpkg --list | grep linux-image你会看到一个列表显示所有已安装的linux-image包包括版本号和状态ii表示已安装。类似下面这样ii linux-image-5.15.0-60-generic 5.15.0-60.66... amd64 Signed kernel image generic ii linux-image-5.15.0-76-generic 5.15.0-76.83... amd64 Signed kernel image generic ii linux-image-5.15.0-91-generic 5.15.0-91.102.. amd64 Signed kernel image generic ii linux-image-generic-hwe-22.04 5.15.0.91.102... amd64 Generic Linux kernel image通常最新的内核是版本号最大的那个例如上面的5.15.0-91。linux-image-generic这类元包meta-package指向当前推荐的最新内核不要删除它。步骤2删除旧内核包假设我们要保留最新的-91内核删除更旧的-60和-76。使用apt的purge命令可以彻底删除软件包及其配置文件sudo apt purge linux-image-5.15.0-60-generic linux-image-5.15.0-76-generic关键技巧1你也可以使用sudo apt autoremove命令。它会自动移除那些因为依赖关系而安装但现在不再被任何程序需要的包。在清理旧内核后执行这个命令常常能清理掉与之关联的linux-headers内核头文件和linux-modules内核模块包让清理更彻底。步骤3更新GRUB配置删除内核包后系统文件主要是/boot目录下的vmlinuz-*和initrd.img-*文件会被清理。此时再运行sudo update-grub这个命令会重新扫描/boot目录发现旧内核文件已不存在于是在生成新的grub.cfg时就不会再为它们创建启动项了。注意事项务必确保你当前正在运行的内核不是你打算删除的那个。你可以用uname -r命令查看当前内核版本。永远保留至少一个能正常启动的内核。3.2 方法二禁用特定GRUB生成脚本如果你不想删除系统探测到的其他操作系统比如Windows但又不想让它在GRUB菜单里显示或者想隐藏memtest86可以禁用对应的生成脚本。步骤1定位并修改脚本权限GRUB的生成脚本在/etc/grub.d/目录下。这些脚本只要具有可执行权限chmod x就会被grub-mkconfig执行。我们可以通过移除可执行权限来“禁用”它。禁用其他操作系统探测如Windowssudo chmod -x /etc/grub.d/30_os-prober禁用内存测试工具sudo chmod -x /etc/grub.d/20_memtest86步骤2重新生成GRUB配置修改权限后再次执行sudo update-grub此时被禁用脚本对应的菜单项就会从新生成的配置中消失。实操心得这种方法是非破坏性的只是让脚本“沉默”。当你哪天需要重新显示这些条目时只需使用sudo chmod x /脚本名恢复其可执行权限再update-grub即可。这比直接删除脚本文件更安全。3.3 方法三手动编辑自定义脚本高级对于通过40_custom添加的自定义条目或者你想进行更精细的控制比如隐藏某个特定的、已存在的内核条目就需要手动编辑了。步骤1编辑自定义脚本打开/etc/grub.d/40_custom你可以看到你自己添加的菜单项。直接删除或注释掉在行首加#对应的menuentry段落即可。步骤2处理顽固的、不想见到的现有条目这是一个更高级的技巧。假设30_os-prober探测到了一个你不想删除但也不想在菜单里看到的系统比如另一个Linux发行版直接禁用30_os-prober会隐藏所有其他系统。这时你可以修改/etc/grub.d/30_os-prober脚本在它内部添加过滤逻辑。但我不建议新手直接修改系统脚本容易出错。一个更安全的替代方案是在/etc/default/grub中添加一行GRUB_DISABLE_OS_PROBERtrue然后运行sudo update-grub。这将完全禁用外部系统探测效果和禁用30_os-prober脚本一样但通过配置文件管理更清晰。3.4 方法四直接调整GRUB菜单显示治标不治本如果你只是觉得菜单太长想暂时简化可以修改/etc/default/grub文件sudo nano /etc/default/grub找到并修改以下两行GRUB_TIMEOUT_STYLEhidden # 隐藏倒计时菜单按Shift或Esc才显示 GRUB_TIMEOUT0 # 将超时时间设为0秒直接启动默认项或者设置一个很短的超时时间如GRUB_TIMEOUT2。修改后运行sudo update-grub生效。 这并没有真正删除启动项只是让它们不显示出来。在需要时按住Shift键BIOS系统或Esc键UEFI系统启动依然可以调出完整菜单。4. 深度优化与GRUB环境美化清理完冗余项我们还可以让GRUB用起来更顺手。4.1 设置默认启动项和超时时间编辑/etc/default/grubGRUB_DEFAULT0默认启动第一个菜单项从0开始计数。你也可以设置为saved这样GRUB会记住你上次的选择。GRUB_TIMEOUT10菜单等待选择的秒数。设为-1则无限等待。GRUB_CMDLINE_LINUX_DEFAULT这里可以添加内核启动参数例如quiet splash用于隐藏启动日志显示图形化闪屏。一个实用技巧如果你想默认启动上一次选择的系统可以设置GRUB_DEFAULTsaved GRUB_SAVEDEFAULTtrue这样每次你的选择都会被记住下次开机自动高亮上次进入的系统。4.2 手动调整菜单项顺序GRUB菜单的顺序由/etc/grub.d/目录下脚本的数字前缀决定00_10_30_40_。数字越小生成的菜单项位置越靠前。 如果你想让自定义条目40_custom显示在最前面可以把它重命名为06_custom。注意00_header和05_debian_theme这类设置头部和主题的脚本顺序不要乱动。4.3 重建GRUB到磁盘主引导记录MBR或EFI分区在极少数情况下清理后GRUB菜单正常了但系统还是无法引导比如直接跳到了Windows或者黑屏。这可能是GRUB的引导程序本身损坏或位置不对。此时需要重装GRUB到磁盘。对于传统BIOS/MBR引导sudo grub-install /dev/sdX # 请将sdX替换为你的系统磁盘如sda 不是分区 sudo update-grub对于UEFI/GPT引导sudo grub-install --targetx86_64-efi --efi-directory/boot/efi --bootloader-idUbuntu sudo update-grub/boot/efi是你的EFI系统分区ESP的挂载点通常情况是这样。5. 常见问题与故障排查实录操作过程中难免会遇到问题这里是我总结的一些常见“坑”和解决方法。5.1 问题执行sudo update-grub后已删除的启动项又回来了原因排查这几乎可以肯定是因为内核文件没有被真正删除。你用apt purge删除了内核包但/boot目录下对应的vmlinuz-*和initrd.img-*文件可能因为某些原因如权限问题残留了下来。update-grub的10_linux脚本扫描到这些文件就会再次为它们生成菜单项。解决方案手动检查并删除/boot目录下的残留文件ls /boot | grep -E \vmlinuz|initrd.img\对照你保留的内核版本删除那些版本号不对应的文件。操作前请再三确认sudo rm /boot/vmlinuz-旧版本号-generic sudo rm /boot/initrd.img-旧版本号-generic再次运行sudo update-grub。5.2 问题误删了当前正在使用的内核导致系统无法启动预防措施在执行任何删除操作前务必用uname -r确认当前内核版本并确保它不在你的删除列表里。应急修复如果已经发生别慌。在GRUB菜单界面如果还能看到的话选择一个旧版本的内核或者恢复模式recovery mode启动。进入系统后立即重新安装最新的内核sudo apt install --reinstall linux-image-generic或者从Ubuntu安装U盘启动进入“试用Ubuntu”模式然后挂载你的系统根分区用chroot进去进行修复。这是更高级的操作需要一定经验。5.3 问题双系统下删除Windows条目后GRUB直接报错或进入grub rescue模式原因分析这可能是因为你的GRUB引导信息core.img被错误地安装在了Windows的引导分区上或者grub.cfg中仍有一条指向已删除分区的启动项作为了默认项。解决方案首先尝试在GRUB菜单出现时手动选择你的Ubuntu内核启动。进入Ubuntu后检查/etc/default/grub中的GRUB_DEFAULT是否指向了一个不存在的菜单项索引。将其改为0。重新运行sudo grub-install指定正确的磁盘如/dev/sda和sudo update-grub确保GRUB被正确安装到你的主硬盘MBR或UEFI系统分区。如果问题依旧可能需要使用Ubuntu安装盘进行boot-repair工具修复这是一个图形化的强力修复工具。5.4 问题/boot分区空间不足导致内核更新失败背景如果安装Ubuntu时为/boot分配了独立分区且空间较小比如200MB在保留多个旧内核时很容易被填满。解决思路这正是我们清理旧内核的主要动机之一。按照3.1的方法清理旧内核包可以立即释放/boot分区空间。清理后可以使用df -h /boot命令查看空间释放情况。5.5 GRUB菜单美化与背景修改这属于“玩”的范畴但能让你的启动界面更个性。主要原理是替换/boot/grub/下的背景图片通常是grub.png或wallpaper.png并调整/etc/default/grub中的GRUB_THEME指向。网上有很多现成的GRUB主题包安装后运行sudo update-grub即可生效。不过要注意某些主题可能在高分辨率屏幕上显示异常。整个GRUB启动项的管理从清理、优化到排错核心逻辑就是理解其“配置生成”的工作模式。安全操作的关键在于永远通过修改源配置/etc/default/grub,/etc/grub.d/或通过包管理器操作然后让update-grub命令去生成最终的grub.cfg而不是直接对grub.cfg动刀。记住这个原则你就能从容应对大部分GRUB相关的配置问题。