在给我的ThinkPad X201T安装Manjaro的时候,由于这台电脑年代久远,不支持UEFI(至少从X220系列才开始支持),所以我首先选择MBR分区表。
但随后,安装程序竟然建议我使用GPT分区表。它特地说明,GPT同时兼容BIOS和UEFI,在BIOS下只需分配一个8MB的主分区,并给分区加上bios_boot
即可。这一切都可以在图形安装程序下进行。
喜欢尝鲜的我,果断尝试GPT,给硬盘分了两个区,继续安装,最后成功引导进入安装后的系统:
分区 | 大小 | 文件系统 | 用途 |
---|---|---|---|
/dev/sda1 |
8MB | Grub core.img (引导程序) |
Grub引导分区 |
/dev/sda2 |
119GB | F2FS | 主分区,根目录 |
然而,我高兴得太早了。
最后修订:2022年9月6日
Grub无法引导!
随后的使用中,Grub偶尔会出现无法引导系统的故障,回退到Grub Rescue控制台。
进入控制台不是坏事,它只是说明Grub无法找到安装文件(通常位于/boot/grub/
,或独立启动分区的grub
子目录)。只要还能在Rescue控制台中访问到主分区,就能救活。
结果,路被堵死了。尝试使用ls
命令来访问硬盘上的F2FS分区,例如ls (hd0,gpt1)/
,也始终提示Unknown filesystem.
。
我感到非常纳闷。真是奇怪,明明Grub能够引导F2FS主分区上的Linux啊!
看来,只能使用LiveCD来重新安装Grub了。
使用grub-install
来重新安装引导
准备任意一款Linux发行版的LiveCD,如Manjaro、Ubuntu,引导系统。这里我使用Manjaro。
通常LiveCD为了安装系统,会预装Grub的配置工具。打开终端,运行以下命令:
1 |
|
结果,发生了以下错误:
1 |
|
这一错误的“罪魁祸首”就是Live环境。Live是临时性的环境,在只读的SquashFS根分区上建立overlay,以允许用户作出临时性的修改(例如下载、安装软件等)。grub-install
工具默认会安装在当前系统中,然而此时此刻,它尝试访问的并不是真实的磁盘,而是overlay,显然操作失败。
那么,对策是?
解决方案就是借助chroot
,切换到我们先前安装好的系统(后文称为“目标系统”)里再操作。
第一步,挂载F2FS系统分区:
1 |
|
第二步,把/dev
、/sys
、/proc
等目录绑定到目标系统中,让grub-install
能正确识别设备信息:
1 |
|
第三步,chroot,并立即开始安装引导:
1 |
|
操作一切顺利!重启电脑,终于摆脱了烦人的Grub Rescue。
进一步:预装相关模块以防止错误
为了预防梅开二度,可以在安装Grub时,让Grub预先加载F2FS模块。
只需对上一节中的grub-install
命令作出修改即可:
1 |
|
问题还在,那就继续解决!
然而没过多久,同样的问题再度出现,也太坑了吧!
起初,我怀疑是BIOS+GPT与Grub的兼容性导致。但当我折腾一番,把分区换成MBR之后(利用Timeshift来备份、恢复系统),问题还是如期而至,而且甚至连我另一台使用MBR的笔记本ThinkPad R400也中招了。
那么,就只能继续排查了。
在重装Grub的时候,我留意到以下一些异常情况:
grub-install
的返回结果不确定,有时成功,有时显示Unknown filesystem
;grub-mkconfig
失败。**其中一个环节是运行grub-probe
,结果报错:Unknown filesystem
**。
grub-probe
的出错,就是解决问题的突破口!果断运行它试试看:
1 |
|
输出结果如下:
1 |
|
可见,grub-probe
会尝试猜遍指定分区的文件系统。由于现在的Grub早已完整支持F2FS,因此它也能识别出来。
只是,识别出错了:
1 |
|
看样子是F2FS的日志出错了,导致无法识别分区。这就不难解释为什么故障是间歇性的了!
至于如何修复日志错误,彻底根治F2FS的毛病,还有待进一步探究。本文先到这里。
猜测
会不会是Swapfile的问题?
有别于通常的swap分区,我改用swapfile来作交换文件。出问题的ThinkPad X201T采用的就是swapfile。
而,接着出问题的ThinkPad R400曾一直采用swap分区,且主分区使用F2FS,一直没有该故障。直到我把swap分区移除并换成swapfile后,故障开始出现。
莫非,swapfile的读写破坏了F2FS的日志?
参考资料
- 本文作者: 爱拼安小匠
- 本文链接: https://anclark.github.io/2022/09/01/Struggle_with_Linux/修复BIOS+GPT引导/
- 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-ND 3.0(署名-非商用-禁止演绎 3.0) 许可协议。转载请注明出处!