Linux

提取連接的 cpio 檔案

  • February 28, 2021

Linux 上的 initramfs 存檔可以包含一系列連接的 gzip 壓縮 cpio 文件。

給定這樣一個檔案,如何提取所有嵌入的檔案,而不是只提取第一個?

以下是一個模式範例,雖然它似乎有可能工作,但僅提取第一個存檔:

while gunzip -c | cpio -i; do :; done <input.cgz

我還嘗試了dracut 中的 skipcpio 幫助器將文件指針移過第一個 cpio 圖像,但以下結果導致將損壞的流(不在輸入中的正確點)發送到 cpio:

# this isn't ideal -- presumably would need to rerun with an extra skipcpio in the pipeline
# ...until all files in the archive have been reached.
gunzip -c <input.cgz | skipcpio /dev/stdin | cpio -i

gunzip 只需要執行一次(消耗所有輸入),而 cpio 應該在每個嵌入式存檔中執行一次,如下所示:

gunzip -c <input.cgz | while cpio -i; do :; done
/usr/lib/dracut/skipcpio $your-initrd-img | zcat | cpio -id --no-absolute-file-names

要不然

/usr/lib/dracut/skipcpio $your-img | gunzip -c | cpio -id

(在 FreeBSD 中,cpio 沒有 –no-absolute-file-names 選項)

這個小程序skipcpio是 dracut 包的一部分。但是您可以下載程式碼 (skipcpio.c) 並在 FreeBSD 下編譯它。

在提取 dracut 創建的 initrd 映像時,您需要這個,至少在 RedHat 驅動的發行版(如 Fedora)下。它將一個名為“early_cpio”的文件放入圖像中,因此以以前已知的正常方式提取您的 initramfs 將不起作用。

引用自:https://unix.stackexchange.com/questions/266089