我正在尝试解压 Ubuntu Desktop 的初始 ramdisk ( initrd.lz
) 来检查一些 casper 组件。
这楼主格式确实很有趣,但更让我惊讶的是 RedHat 记录的解包方法(对我有用)这里。
那么在打包/解包时,这组命令实际上做了什么?它形成一个名为 initrd 的文件,然后将此文件打包到 initrd.lz 中。它与我所知道的其他命令行方法非常不同:
xz/LZMA 格式 - 提取/解压缩:
解压并提取 /boot/ 目录中的映像内容:
xz -dc < /boot/initrd-$(uname -r).img | cpio -idmv
我使用的命令:
xz -dc < initrd.lz | cpio -idmv
xz/LZMA 格式 - 重新打包/重新压缩:
查找 . 2>/dev/null | cpio -c -o | xz -9 --format=lzma > /boot/new.img
我使用的命令:
find . 2>/dev/null | cpio -c -o | xz -9 --format=lzma > initrd.lz
我理解这2>/dev/null
意味着发送任何错误流null
以便它们不会出现在终端中,但是其他命令链呢?
答案1
打包和解包分为两个步骤:打包时,整个目录存储在一个未压缩的单个文件中,可能带有一个索引,指示哪个段来自哪个文件。接下来,压缩这个单个文件。
cpio 不会创建中间文件,而是将这个未压缩的单个文件发送到 stdout,然后压缩器通过 stdin 接收它。
类似地,解包将解压的文件通过其标准输出发送到 cpio 的标准输入,从而导致 cpio 解包其标准输入。
管道符号 | 表示前一个程序的标准输出是下一个程序的标准输入。
阅读 xz 和 cpio 的手册页了解详细信息,例如哪些选项导致程序使用 stdin 和 stdout 而不是文件。