Ubuntu从20.04升级到22.04后出现Initramfs解压失败及内核panic问题(LUKS+LVM环境)
看起来你在升级Ubuntu后碰到了挺头疼的启动故障:Initramfs解压失败直接触发内核panic,而且你已经试过常规的initramfs和grub更新操作却没解决问题。我来帮你梳理下可能的原因,以及几个针对性的排查修复步骤。
首先先明确你遇到的错误日志:
[ 0.187279] Initramfs unpacking failed: invalid magic at start of compressed archive [ 0.373537] Kernel panic - not syncing: UFS: Unable to mount root fs on unknown-block(0,0) [ 0.373601] CPU: 0 PID: 1 Comm: swapper/0 Tainted: 5.4.0-146-generic #163-Ubuntu [ 0.373661] Hardware name: To Be Filled By O.E.M. To Be Filled By O.E.M./AB350 Pro4, BIOS P5.80 06/14/2019 [ 0.373724] Call Trace: [ 0.373777] dump_stack+0x6d/0x8b [ 0.373829] panic+0x101/0x2e3 [ 0.373880] mount_block_root+0x23f/0x2e8 [ 0.373933] mount_root+0x38/0x3a [ 0.373984] prepare_namespace+0x13f/0x194 [ 0.374036] kernel_init_freeable+0x265/0x289 [ 0.374090] ? rest_init+0xb0/0xb0 [ 0.374141] kernel_init+0xe/0x110 [ 0.374192] ret_from_fork+0x35/0x100 [ 0.374263] Kernel Offset: 0x31200000 from 0xffffffff81000000 (relocation range: 0xffffffff80000000-0xffffffffbfffffff) [ 0.374334] ---[ end Kernel panic - not syncing: UFS: Unable to mount root fs on unknown-block(0,0) ]---
你已经完成的修复操作整理如下:
# 从Live CD打开LUKS加密分区 sudo cryptsetup luksOpen /dev/sdc5 sda5_crypt # 挂载LVM根分区到/mnt sudo mount /dev/mapper/ubuntu--vg-root /mnt # 绑定必要的系统目录,保证chroot环境正常 sudo mount --bind /dev /mnt/dev sudo mount --bind /dev/pts /mnt/dev/pts sudo mount --bind /proc /mnt/proc sudo mount --bind /sys /mnt/sys # 挂载boot分区 sudo mount /dev/sdc1 /mnt/boot # 进入chroot环境 sudo chroot /mnt # 更新所有内核的initramfs update-initramfs -u -k all # 重新生成grub配置 update-grub
接下来可以试试这些额外的排查修复步骤:
检查Initramfs文件的完整性与压缩格式
在chroot环境下,先查看出问题的initramfs文件类型:file /boot/initrd.img-5.4.0-146-generic正常情况下应该显示类似
gzip compressed data或者xz compressed data的结果,如果显示异常(比如文件损坏、未知格式),说明生成过程中出了问题。可以尝试指定压缩格式重新生成:update-initramfs -u -k 5.4.0-146-generic -o gzip有时候升级后默认的压缩格式可能和内核不兼容,指定gzip这种兼容性好的格式可能解决问题。
验证LUKS与LVM的配置正确性
升级过程中可能会导致设备路径或UUID变化,先检查/etc/crypttab和/etc/fstab的配置:- 运行
blkid查看/dev/sdc5的UUID,对比/etc/crypttab里对应的UUID是否一致; - 检查
/etc/fstab里根分区的UUID或设备路径是否和/dev/mapper/ubuntu--vg-root匹配。
如果配置有误,修改后记得重新生成initramfs和grub。
- 运行
确认Initramfs包含必要的内核模块
LUKS和LVM的内核模块必须包含在initramfs里才能正常解密挂载分区,运行以下命令检查:lsinitramfs /boot/initrd.img-5.4.0-146-generic | grep -E '(crypt|lvm)'如果看不到
dm-crypt、lvm2相关的模块,需要手动添加到/etc/initramfs-tools/modules文件中,然后重新执行update-initramfs -u -k 5.4.0-146-generic。尝试降级到旧内核启动
从你的grub日志来看,系统里还保留着5.4.0-144-generic内核,重启后在GRUB菜单的「Advanced options for Ubuntu」里选择这个旧内核启动。如果能正常进入系统,说明问题出在新内核的initramfs生成上,可以先使用旧内核,再逐步排查新内核的问题(比如清理旧内核、重新安装新内核包)。检查boot分区的空间与文件权限
- 运行
df -h /boot查看boot分区剩余空间,如果空间不足,会导致initramfs生成不完整,可以用apt autoremove --purge清理无用的旧内核文件; - 检查boot目录下的内核和initramfs文件权限:
正常权限应该是ls -l /boot/vmlinuz-* /boot/initrd.img-*-rw-r--r--,所有者是root:root,如果权限不对,用chmod 644 /boot/vmlinuz-* /boot/initrd.img-*修正。
- 运行
备注:内容来源于stack exchange,提问作者viiprogrammer

