Grub Filter Not Found 修复:系统升级后的引导修复
文章目录
症状
如果你在服务器启动时遇到了提示 Grub Filter Not Found
并自动进入 Grub Rescue(救援模式)的问题,本文给出了
完整的解决方案。
昨天晚上我对时隔三五年没有更新过的服务器进行了升级,
把 Debian 10
经过两次更新升级到了 Debian 12
。
随着系统更新,PHP
也从 7.4
升级到了 8.2
;
Nginx
从 1.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 工具来降本增效,辅助工作和生活?限时报名。
© 转载需附带本文链接,依据 CC BY-NC-SA 4.0 发布。