@snownstone

解决:Ubuntu 升级 22.04.2 后重启报错“Initramfs unpacking failed”

Published on

问题描述:

将 Ubuntu 从 20.04 升级到 22.04 后重启系统黑屏开不了机,报错:Initramfs unpacking failed: invalid magic at start of compressed archive;关机再重启会进入 Grub,如下图所示,如果选最上方的 *Ubuntu 会再次以正常的模式重启然后失败报错;点击 *Advanced options for Ubuntu* 会进入 恢复模式(recovery mode)

Grub

(我没有拍照,图片来自网络)

我的系统里装有 5.4 和 5.8 两个内核,因为问题就出在 5.8 内核的配置上,所以只有选择更低级的 5.4 内核且在恢复模式下才能进入系统。如下图所示,恢复模式 下可以有这些辅助解决问题的操作:

恢复模式

(图片同样来自网络)

如果选择第一项 resume 是可以开机的,但是进去后鼠标、触摸板、网络、蓝牙全都不能用,而且按上图提示文件系统也是只读状态,所以基本没用。

关键是倒数第二个选项 root,选中这一项可以通过命令行对系统做各种关键操作,一是备份数据到移动硬盘(其实升级系统前就应该做的!大意了,这次就是教训,虽然问题解决的过程中没有威胁到数据,但重要数据备份后再折腾还是踏实很多),二就是解决问题了。

问题解决:

注:因为是在以 root 身份输入命令,所以权限很高,不用 sudo,且对文件系统的读/写权限也都具备

cd /etc/initramfs-tools
nano initramfs.conf

如下图所示,系统升级后,默认的压缩方式是 zstdCOMPRESS=zstd,但是我的系统里没有 zstd这种压缩算法,把这个参数改为我有的 gzip 就可以了。

注:我先是跟着某位网友改成了 lz4,但我的系统里其实也没有 lz4 压缩算法,改为自己有的就可以了。怎么知道我没有 lz4 呢,因为改成这个之后再 update-initramfs(如下方命令所示) 系统会提示说没有 lz4 所以自动用了 gzip

initramfs.conf

总之就是修改 initramfs.conf 配置文件然后保存退出并更新:

update-initramfs
update-grub
reboot

警告:

我看到的经验贴都说做一个 Ubuntu 系统 U 盘,开机时通过 U 盘 boot,然后以 chroot 的方式对破坏掉的系统做修改补救。

我研究了,U 盘也做了,但是想着既然恢复模式下可以凭 root 身份直接修改文件,这不更省事直接嘛,就怀着试试看的心情做了以上的尝试和修改,结果顺利开机、新系统正常用了起来。

前面还感觉洋洋得意,自己以更简单的方式解决了问题。但现在想来其实这样做或许并不好,因为我在直接修改系统内核,好像相比 chroot 的方法有更高的风险因为误操作进一步破坏内核。

备注:

关于这个 initramfs,我现在的理解就是系统启动时会用到的一个小的临时替代性的文件系统,在系统真正的文件系统被正式挂载前,它先临时被提取到内存中,被内核用来启动 init 进程、完成后继开机所需的准备和操作。

0828 更新:根据《精通 Linux》讲解,‵initramfs‵ 是 gzip 压缩的 cpio 归档文件。开机时小部分内核需要的驱动模块和工具被加载引导程序 GRUB 提前加载到内存中,内核启动后,将这些文档内容读入一个临时的 initramfs,挂载到 / 上,将用户模式切换给 initramfs 上的 init,使用其中的工具让内核加载 root 文件系统需要的驱动模块,最后这些工具挂载真正的 root 文件系统,启动真正的 init。

参考: