Linux内核升级失败后回退

今天在不定期检查服务器运行状态时候,看到提示说有很多个包可以更新,于是想着今天相对不那么忙,顺便更新一下服务器的软件包吧。这样的操作经常做的,很多时候是为了安全的考虑,在功能使用上没啥特别大的需求,整个过程也没啥特别的地方,于是熟练地输入下列命令更新软件包列表:

sudo apt update
Hit:1 http://archive.ubuntu.com/ubuntu focal InRelease
Get:2 http://archive.ubuntu.com/ubuntu focal-updates InRelease [114 kB]
Get:3 http://archive.ubuntu.com/ubuntu focal-backports InRelease [108 kB]
Get:4 http://archive.ubuntu.com/ubuntu focal-security InRelease [114 kB]
Get:5 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages [2,465 kB]
Get:6 http://archive.ubuntu.com/ubuntu focal-updates/main Translation-en [420 kB]
Fetched 3,221 kB in 1s (2,312 kB/s)
Reading package lists... Done
Building dependency tree
Reading state information... Done
101 packages can be upgraded. Run 'apt list --upgradable' to see them.

半年时间有101个包有更新,又熟练地输入下列命令开始升级:

sudo apt upgrade

输入Y开始,升级需要一会儿时间,看着进度条一点一点完成。

可是到了进度条中后期的时候,开始报一些error,在升级完成后最后显示有如下错误:

update-initramfs: Generating /boot/initrd.img-5.4.0-135-generic
Error 24 : Write error : cannot write compressed block
E: mkinitramfs failure cpio 141 lz4 -9 -l 24
update-initramfs: failed for /boot/initrd.img-5.4.0-135-generic with 1.
dpkg: error processing package initramfs-tools (--configure):
installed initramfs-tools package post-installation script subprocess returned error exit status 1
Processing triggers for linux-image-5.4.0-146-generic (5.4.0-146.163) ...
No apport report written because MaxReports is reached already
/etc/kernel/postinst.d/initramfs-tools:
update-initramfs: Generating /boot/initrd.img-5.4.0-146-generic
Error 24 : Write error : cannot write compressed block
E: mkinitramfs failure cpio 141 lz4 -9 -l 24
update-initramfs: failed for /boot/initrd.img-5.4.0-146-generic with 1.
run-parts: /etc/kernel/postinst.d/initramfs-tools exited with return code 1
dpkg: error processing package linux-image-5.4.0-146-generic (--configure):
installed linux-image-5.4.0-146-generic package post-installation script subprocess returned error exit status 1
No apport report written because MaxReports is reached already
Processing triggers for ca-certificates (20211016ubuntu0.20.04.1) ...
Updating certificates in /etc/ssl/certs...
0 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.
Errors were encountered while processing:
linux-firmware
linux-image-generic
linux-generic
initramfs-tools
linux-image-5.4.0-146-generic
E: Sub-process /usr/bin/dpkg returned an error code (1)

可看到在升级Linux内核5.4.0-146的时候发生错误,通过前边的Log可看到新的内核信息又写入了grub,这就是悲剧的开始。我同时操作两个服务器,遇到了同样的问题,关键我还没太仔细看这些Log,然后我重启了我的两个服务器来加载新内核,于是,于是我再也不能通过SSH连接上我的服务器了。两台服务器同时失联,这让我也突然间紧张起来,大事不妙。

我上服务器管理页面,这两个服务器来自不同的供应商,但是都提供了网页版VNC服务。我看现在服务器启动都爆出了相同的内核错误:

[ end kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)]

还真是与刚才报错有关,并且还是个内核级错误,我遇到个首个kernel panic,有点慌的同时,又感觉了不得了了不得了。

然后开始了查资料看咋回事,按道理升级稳定版的软件包以及内核,遇到失败的概率是很低的,我两个服务器还是完全一样的现象,同时我也不是第一次升级软件包和内核,之前多少年都没问题,这次非常怀疑是Linux的Bug,通过关键字问Google还真的是!看上边日期是昨天,我第一次遇到了Linux的内核Bug,并且还如此新鲜热乎着!

https://bugs.launchpad.net/ubuntu/+source/linux/+bug/2013194

这个网页只告诉我了这是新版本内核的Bug并且Linux已经确认了这件事,但是没讲太多解决办法。我之前玩Linux也编译过内核也升级内核从而把系统搞崩溃过,也无意中卸载过内核把实验室公共服务器给弄崩过,所以我相对还是有一些思路的。我知道刚刚我升级了新内核,但是我还并没来得及卸载旧的内核。理论上我可以切换会旧的内核然后把这个有问题新内核卸载掉就好。但是我是远程服务器,切换内核这一步遇到了很大的麻烦。

我搞坏了两个服务器,其中一个服务器官方提供snapshot,我也是第一次用到这个功能,我用昨天一个自动保存的镜像恢复然后几分钟就把系统恢复到昨天的,问题就解决了。但是另外一个系统没有shnapshot,我唯一的选择就是自己将这个有bug的内核解决掉。

还好这两个服务器提供商都提供VNC连接,一家叫做VNC而另一家叫做Root shell – interactive但是是一回事。在打开VNC窗口后,通过服务器供应商后台按钮重启服务器,然后在VNC窗口按上下键,激活GNU GRUB菜单,选择第二项Advanced options for Ubuntu,

 

然后可以看到默认是启动了我们升级失败有Bug的内核 Linux 5.4.0-146-generic,所以会启动失败报错。在这里我们选择老版本内核,在我这里是Linux 5.4.0-135-generic。点击回车后应该可以正常启动。

输入用户名密码后我们可以成功登录到系统。现在我们可以通过下面命令将有bug没安装完毕的新内核删掉:

sudo apt remove *5.4.0-146*

通过星号*通配符可以将最新内核相关的包都删干净,在我这里有5个包:

点击Y开始删除,通过日志也可看到这个内核在卸载时候也是有报错,这个过程中同时更新了GRUB配置,所里理论上下次启动可以自动启动旧内核了。

然后我们reboot看下效果,成功进入系统,问题解决。由于是软件包的问题,并且官方也在上边链接内确认,所以我们可以等等之后修复bug后新的内核再升级,就可以避免这个问题了。

回顾一下今天遇到的有点惊险的事情,常规软件包和内核升级通常来讲是风险概率很低的,我这么些年也就遇到过这么一次。但是一旦内核升级失败那很可能是灭顶之灾。在这种情况下如果有snapshot的话那是最方便的解决办法,可以说一键修复。但是假如是自己的物理机,或者说即使是云服务器但是像我一样是穷人没买服务,那就只能是寄希望于VNC连接然后调用旧内核启动了。我尝试了三家供应商提供的VNC连接服务,在启动阶段通过上下键呼出GRUB菜单并没有那么容易,我的一个被我弄坏的服务器我尝试了好多次才成功呼出这个菜单,然后赶紧把服务器修好,因为我在这家没有snapshot。另外的一家VNC功能还挺好用,基本上每次启动时候按上下键都能呼出。而第三家我一次都没成功,幸好我的这台服务器没被我搞坏。。。

总之内核升级还是挺危险的,虽然概率上比较低,但是后果上那是相当严重。另外snapshot这个服务能买还是买一个吧,关键时刻是救命的。最差最差那就选一个VNC好用一点的服务器供应商吧。

 

Reference:

https://bugs.launchpad.net/ubuntu/+source/linux/+bug/2013194

 

Leave a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.