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