연결된 cpio 파일 추출

연결된 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

답변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 옵션이 없습니다)

이 애플릿은 skipcpiodracut 패키지의 일부입니다. 그러나 코드(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패키지 / 패키지 가 설치된 데비안은 CPU 마이크로코드가 포함된 intel-microcode일종의 지저분한 비압축 아카이브와 실제 initrd 내용이 포함된 압축 아카이브를 사용하는 것 같습니다. 내가 그것을 추출할 수 있었던 유일한 방법은 ( )를 사용하는 것인데, 둘 다 구조를 올바르게 나열합니다.cpiogzipcpiobinwalkapt 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*

관련 정보