Ubuntu GRUB启动项冗余清理:原理、方法与故障排查
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相关的配置问题。

相关新闻

三步玩转人体姿势搜索:pose-search 新手完整上手指南

三步玩转人体姿势搜索:pose-search 新手完整上手指南

三步玩转人体姿势搜索:pose-search 新手完整上手指南 【免费下载链接】pose-search x6ud.github.io/pose-search 项目地址: https://gitcode.com/gh_mirrors/po/pose-search 你有没有过这样的经历?明明脑子里有一幅特别清晰的画面——一个运动员腾…

2026/10/5 19:42:06 阅读更多 →
DMA与Cache一致性:嵌入式与Linux驱动开发中的核心问题与解决方案

DMA与Cache一致性:嵌入式与Linux驱动开发中的核心问题与解决方案

1. 项目概述:从一次诡异的“数据幽灵”事件说起几年前,我在调试一个高速数据采集卡时,遇到了一个至今记忆犹新的问题。硬件上,我们使用DMA(直接内存访问)将ADC采集到的海量数据直接搬运到PC主机的内存中&am…

2026/10/9 22:40:29 阅读更多 →
wpa_cli命令行工具:Linux无线网络调试与自动化管理实战指南

wpa_cli命令行工具:Linux无线网络调试与自动化管理实战指南

1. 无线网络调试的“瑞士军刀”:wpa_cli 初探如果你经常和Linux系统、嵌入式设备或者路由器固件打交道,调试无线网络连接绝对是一个绕不开的课题。当图形界面遥不可及,或者你需要编写脚本自动化处理Wi-Fi连接时,一个名为wpa_cli的…

2026/10/14 10:19:01 阅读更多 →

最新新闻

基于AT89C51的DS18B20多点温度检测系统设计

基于AT89C51的DS18B20多点温度检测系统设计

简介:面向单片机课程设计与毕业设计场景,这份基于AT89C51的多点温度检测系统设计资料,完整解决了双点温度采集、LCD显示与系统搭建等问题。方案选用Dallas DS18B20单总线数字温度传感器,结合AT89C51单片机进行数据采集&#xff0c…

2026/10/15 4:47:54 阅读更多 →
PyFlink 1.11.0 UDF实战:标量、聚合、表函数选型与避坑指南

PyFlink 1.11.0 UDF实战:标量、聚合、表函数选型与避坑指南

1. 为什么要在 PyFlink 里折腾 UDFPyFlink 从 1.11.0 版本开始,对 Python 自定义函数(UDF)的支持才算真正进入可用阶段。在此之前,想在 Flink 作业里塞一段 Python 逻辑,要么绕道 Java 侧注册,要么干脆放弃…

2026/10/15 4:47:54 阅读更多 →
RS485通讯电路设计:光耦隔离六种典型方案对比与高速可靠传输选型指南

RS485通讯电路设计:光耦隔离六种典型方案对比与高速可靠传输选型指南

简介:RS485是工业现场最常用的串行通讯方式之一,但远距离传输中光耦工作区设置、整形电路阈值、驱动输出方式等因素,直接影响通讯速率与波形稳定性。这份资源以文档形式整理分析了五种典型的RS485通讯接线方案,逐一对电路结构、理…

2026/10/15 4:47:54 阅读更多 →
RTL8370N数据手册实战:寄存器、SMI与交换芯片调试要诀

RTL8370N数据手册实战:寄存器、SMI与交换芯片调试要诀

简介:这份资源是Realtek RTL8370NI-VB-CG芯片的官方数据手册,面向网络设备研发工程师、嵌入式软件开发者以及需要了解二层管理型交换机控制器细节的技术人员。手册系统介绍了8端口10/100/1000M自适应交换控制器的功能架构、VLAN/QoS/安全机制、Web/CLI/S…

2026/10/15 4:47:54 阅读更多 →
RTSP协议深度解析:从核心原理到Python实战与避坑指南

RTSP协议深度解析:从核心原理到Python实战与避坑指南

1. 为什么值得花时间吃透RTSP协议如果你做过网络摄像头、视频监控、直播推流或者在线教育相关的项目,大概率绕不开一个词——RTSP。全称Real Time Streaming Protocol,实时流传输协议,工作在应用层,专门用来控制音视频流的传输。它…

2026/10/15 4:47:54 阅读更多 →
MIPS核心指令硬件原理与工程避坑指南

MIPS核心指令硬件原理与工程避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 4:46:53 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →