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

pri*_*oni 3 linux ubuntu initrd

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

tel*_*coM 5

虽然它可能被命名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 -)
Run Code Online (Sandbox Code Playgroud)

假设 initramfs 只有两部分。

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

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

/dev/stdin: empty
Run Code Online (Sandbox Code Playgroud)

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

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

cat /boot/initrd.img-$(uname -r) | (cpio -iv; zcat | cpio -iv; zcat | cpio -iv; file -)
Run Code Online (Sandbox Code Playgroud)

如果你的 initrd 真的只有 56 个块

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

sudo update-initramfs -u
Run Code Online (Sandbox Code Playgroud)

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