我的initrd只有一个目录,解压后就是'kernel'

我的initrd只有一个目录,解压后就是'kernel'

该文件显示 56 个块的大小。我使用的是Ubuntu 16.04系统,我需要一个不需要我更新内核的解决方案。

答案1

虽然它可能被命名为initrd,但它实际上是一个initramfs.这意味着,它可以是一个级联多个cpio档案,每个档案可能会也可能不会被压缩。您可能只提取了第一部分。

提取 initramfs 文件的正确过程

更具体地说,第一个 cpio 部分通常是“早期微代码更新”,对于英特尔处理器来说,它有一个路径名kernel/x86/microcode/GenuineIntel.bin。如果您只是运行cpio -iv /boot/initrd.img-<kernel version>,这就是您提取的全部内容。 (微代码通常不会被压缩,因为它是加密的,因此根本不会压缩太多。)

要在 Debian/Ubuntu 系统中完全提取现代 initramfs,您应该使用该unmkinitramfs命令。

如果该命令由于某种原因不可用,您可以像这样手动执行:

mkdir /some/temporary/directory
cd /some/temporary/directory
cat /boot/initrd.img-$(uname -r) | (cpio -iv; zcat | cpio -iv; file -)

假设 initramfs 只有两部分。

思路是,该cat命令将把从头到尾的内容输出到括号内的命令中。在其中,第一个cpio将获取文件的开头并提取早期的微代码更新。完成后,下一个命令将从第一个命令停止的地方继续。当第二个压缩的 cpio 存档结束时,该file -命令会检查是否还有更多存档。

如果提取输出的最后一行是不是

/dev/stdin: empty

...然后您就会知道 initramfs 文件中还有更多部分,并且file命令输出会告诉您它是否被压缩。然后在命令之前的括号内添加另一个cpio -iv;或元素。zcat | cpio -iv;file

例如,要在早期微代码更新后提取包含两个压缩部分的三部分 initramfs:

cat /boot/initrd.img-$(uname -r) | (cpio -iv; zcat | cpio -iv; zcat | cpio -iv; file -)

如果你的 initrd 大小确实只有 56 个块

在这种情况下,initrd 创建过程可能会失败。您可以使用

sudo update-initramfs -u

告诉系统根据您当前的内核和模块重新生成它。这也是一个在任何配置更改之后运行的好命令,这些更改可能会影响系统启动早期(在挂载真正的根文件系统之前)需要发生的事情。

相关内容