Kubuntu 23.04升级内核至6.2.0-26/27失败,initrd生成异常及启动故障求助
我最近在常规升级Kubuntu 23.04(根分区采用ZFS)的通用内核时遇到了严重问题:升级失败导致系统无法启动,最后只能通过ZFS回滚操作才恢复正常。
升级完成后,系统生成了vmlinuz-6.2.0-26-generic文件,但完全没有生成对应的initrd.img文件,而且我的/boot目录空间充足(剩余622208 kb)。当我手动尝试安装内核包时,出现了dpkg错误,具体操作及输出如下:
dave@dave-X570:~$ sudo apt-get install linux-image-generic [sudo] password for dave: Reading package lists... Done Building dependency tree... Done Reading state information... Done The following additional packages will be installed: linux-image-6.2.0-26-generic The following NEW packages will be installed linux-image-6.2.0-26-generic linux-image-generic 0 to upgrade, 2 to newly install, 0 to remove and 1 not to upgrade. Need to get 14.3 MB of archives. After this operation, 14.5 MB of additional disk space will be used. Do you want to continue? [Y/n] Get:1 http://mirror.ox.ac.uk/sites/archive.ubuntu.com/ubuntu lunar-updates/main amd64 linux-image-6.2.0-26-generic amd64 6.2.0-26.26 [14.3 MB] Get:2 http://mirror.ox.ac.uk/sites/archive.ubuntu.com/ubuntu lunar-updates/main amd64 linux-image-generic amd64 6.2.0.26.26 [8,224 B] Fetched 14.3 MB in 1s (10.9 MB/s) Requesting to save current system state Successfully saved as "autozsys_dfx1su" Selecting previously unselected package linux-image-6.2.0-26-generic. (Reading database ... 740023 files and directories currently installed.) Preparing to unpack .../linux-image-6.2.0-26-generic_6.2.0-26.26_amd64.deb ... Unpacking linux-image-6.2.0-26-generic (6.2.0-26.26) ... Selecting previously unselected package linux-image-generic. Preparing to unpack .../linux-image-generic_6.2.0.26.26_amd64.deb ... Unpacking linux-image-generic (6.2.0.26.26) ... Setting up linux-image-6.2.0-26-generic (6.2.0-26.26) ... I: /boot/vmlinuz is now a symlink to vmlinuz-6.2.0-26-generic I: /boot/initrd.img is now a symlink to initrd.img-6.2.0-26-generic Setting up linux-image-generic (6.2.0.26.26) ... Processing triggers for linux-image-6.2.0-26-generic (6.2.0-26.26) ... /etc/kernel/postinst.d/dkms: * dkms: running auto installation service for kernel 6.2.0-26-generic ...done. /etc/kernel/postinst.d/initramfs-tools: update-initramfs: Generating /boot/initrd.img-6.2.0-26-generic grep: /boot/config-6.2.0-26-generic: No such file or directory W: zstd compression (CONFIG_RD_ZSTD) not supported by kernel, using gzip grep: /boot/config-6.2.0-26-generic: No such file or directory E: gzip compression (CONFIG_RD_GZIP) not supported by kernel update-initramfs: failed for /boot/initrd.img-6.2.0-26-generic with 1. run-parts: /etc/kernel/postinst.d/initramfs-tools exited with return code 1 dpkg: error processing package linux-image-6.2.0-26-generic (--configure): installed linux-image-6.2.0-26-generic package post-installation script subprocess returned error exit status 1 Errors were encountered while processing: linux-image-6.2.0-26-generic ZSys is adding automatic system snapshot to GRUB menu E: Sub-process /usr/bin/dpkg returned an error code (1)
升级失败后,我的/boot目录内容如下:
total 175149 -rw-r--r-- 1 root root 275920 Jun 16 14:22 config-6.2.0-25-generic drwxr-xr-x 3 root root 512 Jan 1 1970 efi drwxr-xr-x 4 root root 512 Jan 1 1970 efi2 drwxr-xr-x 4 root root 512 Jan 1 1970 efi3 drwxr-xr-x 6 root root 9 Jul 30 15:17 grub lrwxrwxrwx 1 root root 27 Jul 30 15:06 initrd.img -> initrd.img-6.2.0-26-generic -rw-r--r-- 1 root root 147970001 Jul 12 21:37 initrd.img-6.2.0-25-generic lrwxrwxrwx 1 root root 27 Jul 30 14:39 initrd.img.old -> initrd.img-6.2.0-25-generic -rw-r--r-- 1 root root 138712 Feb 11 10:16 memtest86+ia32.bin -rw-r--r-- 1 root root 139776 Feb 11 10:16 memtest86+ia32.efi -rw-r--r-- 1 root root 144312 Feb 11 10:16 memtest86+x64.bin -rw-r--r-- 1 root root 145408 Feb 11 10:16 memtest86+x64.efi -rw------- 1 root root 8163660 Jun 16 14:22 System.map-6.2.0-25-generic lrwxrwxrwx 1 root root 24 Jul 30 15:06 vmlinuz -> vmlinuz-6.2.0-26-generic -rw------- 1 root root 13854600 Jun 16 16:47 vmlinuz-6.2.0-25-generic -rw------- 1 root root 14482632 Jul 10 21:31 vmlinuz-6.2.0-26-generic lrwxrwxrwx 1 root root 24 Jul 30 14:39 vmlinuz.old -> vmlinuz-6.2.0-25-generic
我很困惑:既然用的是ZFS根分区,但问题看起来不是DKMS导致的(至少一开始没报DKMS错误),为什么安装过程既没生成/boot/config-6.2.0-26-generic,也没生成对应的initrd.img文件?
第一次修复尝试
后来我试着把config-6.2.0-25-generic复制为config-6.2.0-26-generic(因为update-initramfs根本没生成这个文件),然后执行了以下命令:
sudo update-initramfs -v -c -k 6.2.0-26-generic
这次成功生成了/boot/initrd.img-6.2.0-26-generic,接着我运行了update-grub后重启系统。结果6.2.0-26内核启动到一半就卡住了,而6.2.0-25内核依然能正常启动。
我注意到启动过程的一个明显差异:正常启动6.2.0-25时,系统识别到双显示器后,会把启动日志输出到副屏,同时主4K屏的字体缩小——这应该是AMD显卡驱动加载后的正常行为,但6.2.0-26的启动过程完全没有这个现象。
发现DKMS异常
之后我卸载了6.2.0-26内核,继续使用6.2.0-25。但后来升级linux-firmware时,DKMS自动为6.2.0-25生成了新的内核镜像,结果这个镜像也无法启动,我只能再次用ZFS回滚恢复。
这时候我意识到问题可能出在DKMS上,于是执行sudo dkms status查看状态,得到的结果显示多个模块都存在编译版本与安装版本不一致的警告:
dave@dave-X570:/boot$ sudo dkms status [sudo] password for dave: fwts-efi-runtime-dkms/23.01.00, 5.19.0-41-generic, x86_64: installed (WARNING! Diff between built and installed module!) fwts-efi-runtime-dkms/23.01.00, 6.2.0-20-generic, x86_64: installed (WARNING! Diff between built and installed module!) fwts-efi-runtime-dkms/23.01.00, 6.2.0-23-generic, x86_64: installed (WARNING! Diff between built and installed module!) fwts-efi-runtime-dkms/23.01.00, 6.2.0-24-generic, x86_64: installed (WARNING! Diff between built and installed module!) fwts-efi-runtime-dkms/23.01.00, 6.2.0-25-generic, x86_64: installed (WARNING! Diff between built and installed module!) fwts-efi-runtime-dkms/23.01.00, 6.2.0-26-generic, x86_64: installed (WARNING! Diff between built and installed module!) v4l2loopback/0.12.7, 5.19.0-41-generic, x86_64: installed (WARNING! Diff between built and installed module!) v4l2loopback/0.12.7, 6.2.0-20-generic, x86_64: installed (WARNING! Diff between built and installed module!) v4l2loopback/0.12.7, 6.2.0-23-generic, x86_64: installed (WARNING! Diff between built and installed module!) v4l2loopback/0.12.7, 6.2.0-24-generic, x86_64: installed (WARNING! Diff between built and installed module!) v4l2loopback/0.12.7, 6.2.0-25-generic, x86_64: installed (WARNING! Diff between built and installed module!) v4l2loopback/0.12.7, 6.2.0-26-generic, x86_64: installed (WARNING! Diff between built and installed module!) zfs/2.1.9, 6.2.0-23-generic, x86_64: installed (WARNING! Diff between built and installed module!) (WARNING! Diff between built and installed module!) (WARNING! Diff between built and installed module!) (WARNING! Diff between built and installed module!) (WARNING! Diff between built and installed module!) (WARNING! Diff between built and installed module!) (WARNING! Diff between built and installed module!) (WARNING! Diff between built and installed module!) (WARNING! Diff between built and installed module!) zfs/2.1.9, 6.2.0-24-generic, x86_64: installed (WARNING! Diff between built and installed module!) (WARNING! Diff between built and installed module!) (WARNING! Diff between built and installed module!) (WARNING! Diff between built and installed module!) (WARNING! Diff between built and installed module!) (WARNING! Diff between built and installed module!) (WARNING! Diff between built and installed module!) (WARNING! Diff between built and installed module!) (WARNING! Diff between built and installed module!) zfs/2.1.9, 6.2.0-25-generic, x86_64: installed (WARNING! Diff between built and installed module!) (WARNING! Diff between built and installed module!) (WARNING! Diff between built and installed module!) (WARNING! Diff between built and installed module!) (WARNING! Diff between built and installed module!) (WARNING! Diff between built and installed module!) (WARNING! Diff between built and installed module!) (WARNING! Diff between built and installed module!) (WARNING! Diff between built and installed module!) zfs/2.1.9, 6.2.0-26-generic, x86_64: installed (WARNING! Diff between built and installed module!) (WARNING! Diff between built and installed module!) (WARNING! Diff between built and installed module!) (WARNING! Diff between built and installed module!) (WARNING! Diff between built and installed module!) (WARNING! Diff between built and installed module!) (WARNING! Diff between built and installed module!) (WARNING! Diff between built and installed module!) (WARNING! Diff between built and installed module!)
升级6.2.0-27内核仍失败
后来6.2.0-27内核发布,我再次尝试升级,这次系统正常生成了config-6.2.0-27-generic和initrd.img-6.2.0-27-generic,但重启后依然失败,只能回到6.2.0-25内核。
对比两次启动的日志:journalctl -b -1 | grep amdgpu(失败的6.2.0-27)和journalctl -b 0 | grep amdgpu(正常的6.2.0-25),我发现6.2.0-27的启动日志里完全没有amdgpu相关的条目——这说明initramfs根本没把amdgpu的固件或模块打包进对应的initrd文件里。
备注:内容来源于stack exchange,提问作者David Newman

