我试图提取casper/initrd
Ubuntu 18.10 的 initrd,得到了意想不到的结果。我没有看到根文件系统和文件,而只是一个名为kernel
.
我做了什么
首先,我想知道是否应该解压缩 initrd 或直接提取存档,所以我发出了以下命令:
$ file initrd
initrd: ASCII cpio archive (SVR4 with no CRC)
我得到了什么
根据输出,它应该是一个 cpio 存档,我曾经cpio
提取过存档。
$ cpio -id < initrd
56 blocks
$ ls
initrd kernel
如果我去看看目录kernel
,我得到了
kernel/
└── x86
└── microcode
└── AuthenticAMD.bin
2 directories, 1 file
我的期望
应该有文件和文件夹,如init
、etc
、usr
等。例如:
bin conf cryptroot etc init lib lib64 run sbin scripts usr var
我发现 Ubuntu 18.10 的 initrd 的存档方式与以前的版本不同。在以前的版本中,initrd 通常是一个 lzma(或者更早版本的 gzip)压缩的 cpio 存档。18.10 的 initrd 是由多个不同格式的二进制文件组成的存档。
要深入了解存档,您可能需要
binwalk
(或其他类似工具。您可以binwalk
通过sudo apt install binwalk
)。一旦你得到binwalk
,发出命令binwalk initrd
:您可以看到有两个微码二进制文件和一个 LZMA 压缩数据文件。后者是我们想要的:lzma 压缩的 initrd。
让我们通过以下方式获得 lzma 压缩的 initrd
您将获得问题中提到的预期文件。编辑要更改的文件。使用以下命令重新打包二进制文件:
最后通过以下方式连接微码文件和新的 initrd (initrd.partial.lz)
现在重命名
initrd.new
为 beinitrd
并将其放回casper/initrd
. 您可以使用新的 initrd 引导您的实时系统。我的回答受到这篇文章的启发https://unix.stackexchange.com/questions/163346/why-is-it-that-my-initrd-only-has-one-directory-namely-kernel