尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

GRUB启动项管理:安全删除冗余条目与优化引导菜单

GRUB启动项管理:安全删除冗余条目与优化引导菜单 1. 问题缘起当GRUB启动菜单变得臃肿时如果你和我一样是个喜欢折腾Linux和Windows双系统或者经常重装、测试不同发行版的老玩家那你一定对GRUBGRand Unified Bootloader这个老朋友又爱又恨。爱它是因为它给了我们选择操作系统的自由恨它往往是当这个启动菜单变得像一本翻不到底的旧电话簿时——里面塞满了早已不存在的系统条目、旧内核版本甚至是多年前测试留下的“幽灵”条目。最近一次我在一台老笔记本上折腾先是装了Windows 11然后又装了Ubuntu 22.04接着因为某个驱动问题回滚了内核后来又尝试了Ubuntu 24.04的每日构建版没成功。几轮操作下来开机时GRUB菜单长得让我必须滚动好几下才能找到我想进的系统。更烦人的是有些条目根本点不进去一选就黑屏或者直接跳回菜单白白浪费启动时间。这不仅仅是美观问题对于服务器或者需要快速恢复的生产环境一个混乱的启动菜单可能意味着灾难性的误操作。所以“删除Ubuntu的GRUB启动项”这个需求远不止是删掉一个名字那么简单。它背后是一系列问题的集合如何安全地清理无效条目如何区分哪些是当前系统必需的哪些是垃圾在清理过程中如何确保不会一失手成千古恨把整个引导系统搞崩导致所有系统都进不去今天我就结合自己无数次“作死”又“救活”的经验把GRUB启动项管理的里里外外、安全删除的每一步掰开揉碎讲清楚。我们的目标不仅是删掉多余的更是要理解其机制做到心中有数手上有准。2. GRUB 2启动菜单的构成与生成机制在动手删除任何东西之前我们必须先搞清楚GRUB 2现代Ubuntu默认使用的引导加载程序的菜单是从哪里来的以及它是如何被组装的。知其然更要知其所以然这是安全操作的前提。2.1 核心目录与文件结构GRUB 2的配置文件不再像古老的GRUB Legacy那样只有一个menu.lst。它的配置是模块化和动态生成的主要涉及以下几个关键位置/boot/grub/grub.cfg这是最终被GRUB读取的、我们开机时看到的那个菜单的配置文件。重要警告这个文件通常被标注为“不要手动编辑”因为它是由系统工具自动生成的。如果你直接修改它下次更新GRUB时你的修改就会被覆盖。/etc/default/grub这是用户自定义GRUB行为的主要配置文件。你可以在这里设置默认启动项、超时时间、菜单样式等。我们后续的一些操作会修改这个文件。/etc/grub.d/目录这是GRUB 2配置的“引擎室”。该目录下有一系列可执行脚本通常以数字开头如00_header,10_linux,30_os-prober等它们决定了grub.cfg文件的内容结构。10_linux负责为当前系统即你正在运行的Ubuntu生成内核启动项。它会扫描/boot目录为每个找到的vmlinuz-*内核文件创建一个菜单项。30_os-prober这是“多系统”菜单项的来源。当这个脚本运行时它会探测你硬盘上的其他分区寻找Windows、其他Linux发行版等并为它们生成启动项。我们想删除的其他系统旧条目很多就是由它“多事”地找出来并留下的历史记录。/boot分区这里存放着内核文件vmlinuz-*、初始内存盘文件initrd.img-*以及GRUB 2的核心模块。删除旧内核包时对应的文件也会从这里清理。2.2update-grub命令做了什么我们经常听到一个命令sudo update-grub。它的作用就是触发上述配置的重新生成过程。具体来说它会读取/etc/default/grub中的用户设置。按顺序执行/etc/grub.d/目录下所有可执行脚本脚本文件名前的数字决定了执行顺序。将这些脚本的输出结合一些模板最终合成一个新的/boot/grub/grub.cfg文件。所以“删除启动项”的本质就是通过某种方式让update-grub在重新生成grub.cfg时不再包含我们不想看到的那个条目。方法无非两种要么干掉条目的“源头”比如卸载旧内核要么让生成脚本如os-prober找不到它或忽略它。2.3 启动项的类型辨析在我们开始删除前需要分辨想删的到底是什么当前系统的旧内核项由10_linux脚本生成。通常命名为“Ubuntu 使用 Linux x.x.x-xx-generic”。保留最新的1-2个即可其余的可以安全清理以释放/boot分区空间。其他操作系统的残留项由30_os-prober生成。例如“Windows Boot Manager (on /dev/sda1)”。如果对应的系统或分区已经被你格式化或删除这个条目就会失效。内存测试等工具项由/etc/grub.d/目录下其他脚本如20_memtest86生成。自定义菜单项可能由用户手动创建在/etc/grub.d/40_custom中。搞清楚想删的条目属于哪一类我们才能对症下药。3. 实战安全删除各类冗余GRUB启动项现在我们进入实操环节。请记住所有操作建议在终端下进行并且修改关键文件前做好备份是一个好习惯。3.1 删除旧内核启动项最常用、最安全这是最常见的需求。Ubuntu在更新内核后默认会保留旧内核以防新内核有问题可以回退。但时间久了就会积累很多。删除它们不仅能精简菜单还能释放宝贵的/boot分区空间如果/boot是独立小分区的话这尤其重要。步骤一查看当前已安装的所有内核dpkg --list | grep linux-image你会看到一个列表包括linux-image-xxx-generic这样的包名以及它们的版本号和状态ii表示已安装。步骤二确定当前正在运行的内核uname -r记下这个版本号比如5.15.0-91-generic。绝对不要删除正在运行的内核步骤三使用apt命令删除旧内核包Ubuntu提供了相对安全的方法。你可以手动删除比当前内核旧的版本但更推荐使用apt autoremove。sudo apt autoremove --purge这个命令会尝试移除那些被自动安装、且现在已不被任何其他软件包依赖的包其中就包括旧的内核镜像和头文件。执行前它会列出将要删除的包请仔细核对确保不包括当前内核。如果你想更手动、更精确地控制可以安装ubuntu-maintenance-kit或byobu等工具包里的purge-old-kernels脚本或者使用图形化工具Synaptic新立得包管理器来搜索和标记删除旧linux-image-*和linux-headers-*包。步骤四更新GRUB配置删除内核包后对应的/boot下的文件也会被清理。此时再运行sudo update-grub你会发现10_linux脚本在生成菜单时因为找不到那些内核文件对应的启动项自然就消失了。注意有些教程会教直接删除/boot下的vmlinuz-*和initrd.img-*文件。强烈不建议这样做这会导致包管理系统dpkg/apt的记录与实际文件状态不一致可能在未来引发更复杂的问题。始终通过包管理器来管理内核。3.2 禁用或管理其他操作系统探测os-prober如果你想删除的是Windows或其他Linux发行版的残留条目而该操作系统或分区确实已经不存在了那么问题通常出在30_os-prober这个脚本上。它可能因为分区表残留信息、旧的UUID记录等原因依然“认为”那里有一个系统。方法一临时禁用 os-prober 生成项最直接的方法是让30_os-prober脚本不要执行。有两种方式移除可执行权限sudo chmod -x /etc/grub.d/30_os-prober这样update-grub时就会跳过它。当你未来需要它再次探测其他系统时只需恢复权限sudo chmod x /etc/grub.d/30_os-prober。在配置中禁用探测 编辑/etc/default/grub文件sudo nano /etc/default/grub找到并确保存在这一行如果没有就添加GRUB_DISABLE_OS_PROBERtrue然后保存退出并运行sudo update-grub。方法二清理导致误判的源头进阶如果只是不想看到某个特定的无效条目但希望os-prober继续工作以发现其他有效的系统那么禁用整个脚本就有点“一刀切”了。这时我们需要更精细的操作。但GRUB本身没有提供“黑名单”功能。一个变通的方法是手动检查os-prober可能在哪里找到了错误信息。有时格式化过的分区上残留的引导扇区或特定文件会导致误判。如果那个分区已经完全不用了可以考虑在分区工具中彻底删除该分区并重建或者用dd或wipefs命令擦除其开头的引导扇区信息此操作极其危险务必百分百确认目标分区。更安全的做法是接受这个“瑕疵”或者使用方法一在需要时临时关闭探测。3.3 删除Memtest86等工具项如果你确定不需要内存测试工具可以直接移除其生成脚本的执行权限sudo chmod -x /etc/grub.d/20_memtest86然后运行sudo update-grub。或者你也可以直接卸载memtest86这个包sudo apt remove --purge memtest863.4 处理自定义启动项如果你或某个应用程序在/etc/grub.d/40_custom或类似的自定义脚本里添加了条目直接编辑或删除这些脚本文件即可。修改后别忘了sudo update-grub。4. 深度排错当GRUB菜单出错或修改后无法启动在我们对GRUB菜单进行“手术”后最担心的事情就是系统无法启动。这一章我们专门来聊聊那些棘手的场景和救急方案。4.1 修改GRUB配置后无法进入系统假设你修改了/etc/default/grub或者调整了/etc/grub.d/下的脚本执行update-grub后重启发现GRUB菜单出不来或者选择条目后黑屏、报错。首先尝试在GRUB菜单界面进行临时修复如果菜单还能出现在GRUB菜单界面选中你的Ubuntu条目通常是第一个不要按回车而是按e键进入编辑模式。你会看到几行配置代码。找到以linux开头的那一行它指定了内核文件和启动参数。在这行的末尾在quiet splash之后你可以临时添加一些参数来尝试启动。常用的有nomodeset禁用内核模式设置常用于解决显卡驱动导致的黑屏。systemd.unitmulti-user.target强制进入纯命令行文本模式绕过图形界面。按CtrlX或F10用这些临时参数启动。如果能进入系统哪怕是命令行那么你就有机会去修正之前错误的配置。如果GRUB菜单根本出不来直接进了黑屏或grub rescue提示符这说明GRUB的核心引导代码stage1.5或环境出了问题可能是在更新过程中某些核心文件损坏或位置变更。这时你需要一个“外援”制作Ubuntu安装U盘在另一台电脑上从Ubuntu官网下载ISO镜像用Rufus、BalenaEtcher等工具制作成可启动U盘。从U盘启动在出问题的电脑上从U盘启动选择“试用Ubuntu”Try Ubuntu。挂载原系统分区并修复打开终端用sudo fdisk -l或lsblk找到你原Ubuntu系统的根/分区和/boot分区如果独立。假设根分区是/dev/sda2/boot分区是/dev/sda1。创建挂载点并挂载sudo mkdir /mnt/root sudo mount /dev/sda2 /mnt/root # 如果/boot是独立分区 sudo mount /dev/sda1 /mnt/root/boot为了使用原系统的GRUB环境还需要绑定一些虚拟文件系统sudo mount --bind /dev /mnt/root/dev sudo mount --bind /dev/pts /mnt/root/dev/pts sudo mount --bind /proc /mnt/root/proc sudo mount --bind /sys /mnt/root/sys关键一步chroot进入原系统sudo chroot /mnt/root现在你的终端环境就“切换”到了出问题的原系统内部。重新安装和配置GRUB# 重新安装GRUB到正确的磁盘例如sda grub-install /dev/sda # 更新GRUB配置 update-grub退出chroot并重启exit sudo umount -R /mnt/root sudo reboot拔出U盘看看系统是否能正常引导。4.2 彻底卸载GRUB用于切换引导管理器有些极客喜欢用systemd-boot、rEFInd等其他引导管理器。如果你想彻底移除GRUB步骤需要格外小心确保新的引导器已经就位。首先安装并配置好新的引导加载器。例如安装systemd-boot并确保它能正确引导你的内核。然后再考虑卸载GRUBsudo apt remove --purge grub-pc grub-common这个命令会移除GRUB相关的包。purge选项会同时删除配置文件。最后清理残留可选sudo apt autoremove sudo update-initramfs -u -k all并确保你的新引导器被写入磁盘的MBR/GPT引导区域。重要警告不要在没有任何替代引导方案的情况下卸载GRUB否则下次启动你将直接面对一个“无引导程序”的错误。5. 高级技巧与最佳实践掌握了基本操作和救急方法后我们来聊聊如何更优雅、更自动化地管理GRUB以及一些能提升体验的配置。5.1 自动化清理旧内核我们可以通过配置apt让它自动移除旧内核而不是手动清理。编辑/etc/apt/apt.conf.d/01autoremove文件可能需要新建sudo nano /etc/apt/apt.conf.d/01autoremove添加以下内容APT::Periodic::AutoremoveInterval 7; APT::Periodic::Unattended-Upgrade::Remove-Unused-Kernel-Packages true; APT::Periodic::Unattended-Upgrade::Remove-New-Unused-Dependencies true;这样在系统执行定期无人值守升级时就会自动清理未使用的内核包。你也可以手动触发这个清理sudo unattended-upgrade --dry-run模拟运行或直接运行相关的清理脚本。5.2 美化与优化GRUB菜单一个干净的菜单也需要好的观感。你可以通过修改/etc/default/grub来定制修改默认启动项和超时GRUB_DEFAULT0 # 0表示第一个菜单项也可以设为saved配合GRUB_SAVEDEFAULT GRUB_TIMEOUT5 # 菜单等待时间秒设为0则不显示菜单直接启动默认项 GRUB_TIMEOUT_STYLEmenu # 始终显示菜单。hidden则只在按Shift时才显示设置分辨率取消GRUB_GFXMODE的注释并设置如GRUB_GFXMODE1920x1080。使用主题安装grub2-themes包或从社区下载主题将主题文件放入/boot/grub/themes/然后在/etc/default/grub中指定GRUB_THEME/boot/grub/themes/主题名/theme.txt。每次修改/etc/default/grub后都必须运行sudo update-grub使更改生效。5.3 备份与恢复GRUB配置在进行任何重大修改前备份总是明智的。备份关键配置sudo cp /etc/default/grub /etc/default/grub.backup sudo cp -r /etc/grub.d/ /etc/grub.d.backup/ sudo cp /boot/grub/grub.cfg /boot/grub/grub.cfg.backup备份整个引导扇区极端情况sudo dd if/dev/sda of/path/to/backup/mbr.img bs512 count1这备份了磁盘前512字节的MBR包含GRUB stage1。恢复时用dd if/path/to/backup/mbr.img of/dev/sda务必确认目标磁盘正确5.4 排查启动项问题的通用思路当你遇到一个奇怪的、删不掉的启动项时可以按以下思路排查溯源运行sudo update-grub观察终端输出。它会显示正在运行的脚本和找到的条目。看看那个讨厌的条目是由哪个脚本10_linux,30_os-prober等生成的。审查脚本去/etc/grub.d/目录下查看对应的脚本理解它的查找逻辑。例如30_os-prober会调用哪些命令来探测系统检查源头根据脚本逻辑检查对应的分区、文件或系统标识是否存在。例如是不是有一个空分区还留着旧的EFI系统分区标识隔离测试临时重命名或禁用可疑的脚本sudo mv /etc/grub.d/30_os-prober /etc/grub.d/30_os-prober.disabled然后更新GRUB看问题是否消失。这能快速定位问题脚本。管理GRUB启动项就像打理一个花园。定期除草清理旧内核修剪枝叶移除无效条目并了解花园的布局理解配置文件结构才能让它既整洁美观又功能完好。整个过程的核心是谨慎和知其所以然。每次修改前问自己一句这个操作会影响什么最坏的情况是什么我有没有退路想清楚这几个问题再加上今天的知识你就能从容地驾驭GRUB让它为你服务而不是带来麻烦。
返回列表