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
答え1
/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でコンパイルすることもできます。
これは、少なくともRedHat対応のディストリビューション(Fedoraなど)からdracutで作成されたinitrdイメージを抽出する場合に必要です。 「early_cpio」というファイルをイメージに入れるので、以前に知られている一般的な方法でinitramfsを抽出すると機能しません。
答え2
gunzipは一度だけ実行し(すべての入力を消費します)、cpioは次のように含まれる各アーカイブに対して一度だけ実行する必要があります。
gunzip -c <input.cgz | while cpio -i; do :; done
答え3
これは手動で行うことができます。dd skip=
。私のUbuntu 20.04では、次を使用して最初の部分(オフセット0ブロック)を表示できます。
# dd if=/boot/initrd.img-5.4.0-45-generic skip=0 | file -
/dev/stdin: ASCII cpio archive (SVR4 with no CRC)
それでは内容を見てください
# dd if=/boot/initrd.img-5.4.0-45-generic skip=0 | cpio -it
.
kernel
kernel/x86
kernel/x86/microcode
kernel/x86/microcode/AuthenticAMD.bin
62 blocks
パート2 62ブロックさらに進む
# dd if=/boot/initrd.img-5.4.0-45-generic skip=62 | file -
/dev/stdin: ASCII cpio archive (SVR4 with no CRC)
今回も単純なcpioアーカイブですが、今回はさらに大きくなりました。
# dd if=/boot/initrd.img-5.4.0-45-generic skip=62 | cpio -it
kernel
kernel/x86
kernel/x86/microcode
kernel/x86/microcode/.enuineIntel.align.0123456789abc
kernel/x86/microcode/GenuineIntel.bin
5868 blocks
今5868 + 62
ブロックをinitramfsにスキップします。
# dd if=/boot/initrd.img-5.4.0-45-generic skip=5930 | file -
/dev/stdin: LZ4 compressed data (v0.1-v0.9)
今回は圧縮ストリームなので
# dd if=/boot/initrd.img-5.4.0-45-generic skip=5930 | lz4cat | file -
/dev/stdin: ASCII cpio archive (SVR4 with no CRC)
もう一度、私たちは次の(そして最終的な)cpioアーカイブを見つけました。
# dd if=/boot/initrd.img-5.4.0-45-generic skip=5930 | lz4cat | cpio -it
... lots of output
usr/share/plymouth/themes/spinner/watermark.png
usr/share/plymouth/ubuntu-logo.png
var
var/cache
var/cache/fontconfig
var/cache/fontconfig/383ee5b3-5437-4bdc-87f6-cf314658a7c0-le64.cache-7
var/cache/fontconfig/575cffd4-ae01-4067-914f-7545fe566c1b-le64.cache-7
var/cache/fontconfig/CACHEDIR.TAG
var/cache/fontconfig/c467a813-186f-476e-880a-3770402989a9-le64.cache-7
var/cache/fontconfig/d912fc4e-f5b6-456d-a86d-e4c3ccbbefe9-le64.cache-7
var/lib
var/lib/dhcp
450460 blocks
ただし、これは最初のストリームが圧縮されていない場合にのみ機能します。それ以外の場合、cpioはinitramfsにサイズを報告せず、代わりに圧縮されていない部分のサイズを報告します。
答え4
amd64-microcode
パッケージ/パッケージがインストールされた Debian は、CPU マイクロコードを含むintel-microcode
一種の汚れた非圧縮アーカイブと、実際の initrd コンテンツを含む圧縮アーカイブを使用するようです。私がそれを抽出できる唯一の方法は()を使用することですが、両方とも構造を正しくリストします。cpio
gzip
cpio
binwalk
apt install binwalk
binwalk /path/to/initrd
出力例:
host ~ # binwalk /boot/initrd.img-5.10.0-15-amd64
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 ASCII cpio archive (SVR4 with no CRC), file name: "kernel", file name length: "0x00000007", file size: "0x00000000"
120 0x78 ASCII cpio archive (SVR4 with no CRC), file name: "kernel/x86", file name length: "0x0000000B", file size: "0x00000000"
244 0xF4 ASCII cpio archive (SVR4 with no CRC), file name: "kernel/x86/microcode", file name length: "0x00000015", file size: "0x00000000"
376 0x178 ASCII cpio archive (SVR4 with no CRC), file name: "kernel/x86/microcode/.enuineIntel.align.0123456789abc", file name length: "0x00000036", file size: "0x00000000"
540 0x21C ASCII cpio archive (SVR4 with no CRC), file name: "kernel/x86/microcode/GenuineIntel.bin", file name length: "0x00000026", file size: "0x00455C00"
4546224 0x455EB0 ASCII cpio archive (SVR4 with no CRC), file name: "TRAILER!!!", file name length: "0x0000000B", file size: "0x00000000"
4546560 0x456000 gzip compressed data, has original file name: "mkinitramfs-MAIN_dTZaRk", from Unix, last modified: 2022-06-14 14:02:57
37332712 0x239A6E8 MySQL ISAM compressed data file Version 9
個々の部品を抽出します。
binwalk -e /path/to/initrd
出力例:
host ~ # binwalk -e /boot/initrd.img-5.10.0-15-amd64
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 ASCII cpio archive (SVR4 with no CRC), file name: "kernel", file name length: "0x00000007", file size: "0x00000000"
120 0x78 ASCII cpio archive (SVR4 with no CRC), file name: "kernel/x86", file name length: "0x0000000B", file size: "0x00000000"
244 0xF4 ASCII cpio archive (SVR4 with no CRC), file name: "kernel/x86/microcode", file name length: "0x00000015", file size: "0x00000000"
376 0x178 ASCII cpio archive (SVR4 with no CRC), file name: "kernel/x86/microcode/.enuineIntel.align.0123456789abc", file name length: "0x00000036", file size: "0x00000000"
540 0x21C ASCII cpio archive (SVR4 with no CRC), file name: "kernel/x86/microcode/GenuineIntel.bin", file name length: "0x00000026", file size: "0x00455C00"
4546224 0x455EB0 ASCII cpio archive (SVR4 with no CRC), file name: "TRAILER!!!", file name length: "0x0000000B", file size: "0x00000000"
4546560 0x456000 gzip compressed data, has original file name: "mkinitramfs-MAIN_dTZaRk", from Unix, last modified: 2022-06-14 14:02:57
37332712 0x239A6E8 MySQL ISAM compressed data file Version 9
これにより、別々のファイルに別々のセクションが提供され、最終的に正しいcpio
アーカイブを抽出できます。
host ~ # ls -l _initrd.img-5.10.0-15-amd64.extracted
insgesamt 187M
drwxr-xr-x 3 root root 4,0K 14. Jun 17:53 cpio-root/
-rw-r--r-- 1 root root 114M 14. Jun 17:53 mkinitramfs-MAIN_dTZaRk
-rw-r--r-- 1 root root 39M 14. Jun 17:53 0.cpio
-rw-r--r-- 1 root root 35M 14. Jun 17:53 mkinitramfs-MAIN_dTZaRk.gz
host ~/_initrd.img-5.10.0-15-amd64.extracted # mkdir extracted
host ~/_initrd.img-5.10.0-15-amd64.extracted # cd extracted
host ~/_initrd.img-5.10.0-15-amd64.extracted/extracted # cat ../mkinitramfs-MAIN_dTZaRk | cpio -idmv --no-absolute-filenames
[...]
host ~/_initrd.img-5.10.0-15-amd64.extracted/extracted # ll
insgesamt 28K
lrwxrwxrwx 1 root root 7 14. Jun 17:55 bin -> usr/bin/
drwxr-xr-x 3 root root 4,0K 14. Jun 17:55 conf/
drwxr-xr-x 7 root root 4,0K 14. Jun 17:55 etc/
lrwxrwxrwx 1 root root 7 14. Jun 17:55 lib -> usr/lib/
lrwxrwxrwx 1 root root 9 14. Jun 17:55 lib32 -> usr/lib32/
lrwxrwxrwx 1 root root 9 14. Jun 17:55 lib64 -> usr/lib64/
lrwxrwxrwx 1 root root 10 14. Jun 17:55 libx32 -> usr/libx32/
drwxr-xr-x 2 root root 4,0K 14. Jun 16:02 run/
lrwxrwxrwx 1 root root 8 14. Jun 17:55 sbin -> usr/sbin/
drwxr-xr-x 8 root root 4,0K 14. Jun 17:55 scripts/
drwxr-xr-x 8 root root 4,0K 14. Jun 17:55 usr/
-rwxr-xr-x 1 root root 6,2K 14. Jan 2021 init*