Linux
提取連接的 cpio 檔案
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 將不起作用。