Grub Filter Not Found 修复:系统升级后的引导修复

文章目录

症状

如果你在服务器启动时遇到了提示 Grub Filter Not Found 并自动进入 Grub Rescue(救援模式)的问题,本文给出了 完整的解决方案。

昨天晚上我对时隔三五年没有更新过的服务器进行了升级, 把 Debian 10 经过两次更新升级到了 Debian 12。 随着系统更新,PHP 也从 7.4 升级到了 8.2Nginx1.15 升级到了 1.22.1

升级之后,系统运行一切正常,所有网站也都能正常访问。 为了保证长期运行的稳定性(我的服务器常年不重启),我打算 在服务器升级后顺道重启一次。结果这下可好,重启后直接无法使用了。

首先是 SSH 无法连接,然后通过云服务器的 Web 终端登录后, 发现屏幕显示内容如下:

error: symbol 'grub_file_filters' not found. 
Entering rescue mode... 
grub rescue>

原因分析

迅速分析和查阅了相关的资料,发现这个问题应该是在系统更新 过程中破坏了引导的 grub 配置造成的。网上大部分的资料都 需要挂载系统恢复光盘镜像来执行 grub-install,来完成引导 的修复。但对于云服务器,这是不可行的, 因为你无法插入 修复光盘镜像。

如果你和我一样无法挂载系统恢复光盘镜像,我提供两个解决思路。

方法一:云盘挂载在救援主机

阿里云、AWS 等服务器支持挂载云盘到其他主机。而有些云服务器, 例如青云,提供了救援主机功能。你可以利用这些功能把受损的 系统盘挂载在一个可以正常启动的服务器上,然后在这个服务器上修复 你的引导。

具体步骤如下:

# 切换到 root 权限
sudo su

# 查询被挂载的损坏的系统盘的盼复
fdisk -l

# 把损坏的系统盘的一些内容挂载到可以正常启动的服务器
# 这里假设你在 fdisk 中查询到的系统盘符为 sdc,
# 且系统挂载在其中的 sdc1:
mount /dev/sdc1 /mnt
mount --bind /dev /mnt/dev
mount --bind /dev/pts /mnt/dev/pts
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys

chroot /mnt

# 执行引导修复
grub-install /dev/sda

假如一切顺利,系统会提示:

Installation finished. No error reported.

此时别忘了取消挂载:

# 退出 chroot
exit

# 取消挂载
umount /mnt/dev/pts
umount /mnt/dev
umount /mnt/proc
umount /mnt/sys
umount /mnt

然后把云盘重新挂载回损坏的主机,重启该主机,应该可以进入系统。

方法二:手工引导系统

如果你和我一样倒霉,在运行 grub-install 时不成功,或者你没法 挂载系统盘到其他可用的主机,还有一个办法,那就是手工通过 grub 引导 进入系统,然后在系统内修复 grub 安装。

首先运行你的主机,在出现下面的提示时:

error: symbol 'grub_file_filters' not found. 
Entering rescue mode... 
grub rescue>

又或者你进入的是 grub 命令行,而不是 grub rescue,也是可以的:

grub>

小心地按照下列步骤执行命令。

首先执行一个可以让长输出进行分页的指令:

grub> set pager=1

不要有多余的空格。

然后列出自己的磁盘:

grub> ls
(hd0) (hd0,msdos2) (hd0,msdos1)

怎么出来了一个 msdos?这说明你的磁盘使用的是以前的 MS-DOS 分区模式,而不是 GPT 模式。这不重要。

我们的重点是找到你的启动盘。比如我们尝试 (hd0,1) 这个盘:

grub> ls (hd0,1)/
lost+found/ bin/ boot/ cdrom/ dev/ etc/ home/  lib/
lib64/ media/ mnt/ opt/ proc/ root/ run/ sbin/ 
srv/ sys/ tmp/ usr/ var/ vmlinuz vmlinuz.old 
initrd.img initrd.img.old

通过 ls 指令,你可以确认这个盘的内容以分析它是不是我们的启动盘。 你也可以通过 cat 指令进一步确认系统的版本号:

grub> cat (hd0,1)/etc/issue
Ubuntu 14.04 LTS n l

假如你有多个系统或者多个盘符,一定不要搞错。

接下来手工引导系统(先别急着复制执行,看解释):

# 看完解释后再执行哦
grub> set root=(hd0,1)
grub> linux /boot/vmlinuz-3.13.0-29-generic root=/dev/sda1
grub> initrd /boot/initrd.img-3.13.0-29-generic
grub> boot

注意:

  • 这里的 (hd0,1) 是你要修复引导的实际磁盘,要反复核实清楚;
  • 这里的 /boot/vmlinuz-3.13.0-29-generic 只是一个实例, 你执行的时候,打出 /root/vmlinuz,然后按 Tab 键选出你 实际的 linux 内核版本号,不要照抄。如果有多个内核版本,一般 选最新的。
  • 这里 /boot/initrd.img-3.13.0-29-generic 同上。

现在你应该可以进入系统了。

注意,这时候别急着高兴,赶紧修复 grub 引导,不然下次重启还是无法正常进入:

# 更新 grub
> update-grub
# 系统可能输出类似内容:
# Generating grub configuration file ...
# Found background: /usr/share/images/grub/Apollo_17_The_Last_Moon_Shot_Edit1.tga
# Found background image: /usr/share/images/grub/Apollo_17_The_Last_Moon_Shot_Edit1.tga
# Found linux image: /boot/vmlinuz-3.13.0-29-generic
# Found initrd image: /boot/initrd.img-3.13.0-29-generic
# Found linux image: /boot/vmlinuz-3.13.0-27-generic
# Found initrd image: /boot/initrd.img-3.13.0-27-generic
# Found linux image: /boot/vmlinuz-3.13.0-24-generic
# Found initrd image: /boot/initrd.img-3.13.0-24-generic
# Found memtest86+ image: /boot/memtest86+.elf
# Found memtest86+ image: /boot/memtest86+.bin
# done

# 重新安装 grub
> grub-install /dev/sda
# 可能的输出:
# Installing for i386-pc platform.
# Installation finished. No error reported.

这时候你的系统应该完全恢复了。

参考资料: Classic SysAdmin: How to Rescue a Non-booting GRUB 2 on Linux

题外话:我帮你整理了包括 AI 写作、绘画、视频(自媒体制作)零门槛 AI 课程 + 国内可直接顺畅使用的软件。想让自己快速用上 AI 工具来降本增效,辅助工作和生活?限时报名

当前页阅读量为: