추출된 initrd(x-cpio 아카이브)를 패키지하는 방법은 무엇입니까?

추출된 initrd(x-cpio 아카이브)를 패키지하는 방법은 무엇입니까?

initrdUbuntu 20.04 ISO를 사용자 정의하고 있으며 이 프로세스 중에 디렉터리 파일 내의 파일을 편집해야 합니다.casperUbuntu20.04-ISO/casper/initrd

이 파일 형식에 대해 CPIO 아카이브(application/x-cpio)를 다시 컴파일하는 방법

다음 명령을 사용하여 내용의 압축을 풀 수 있습니다.

unmkinitramfs initrd .

하지만 다시 컴파일할 수 없습니다. 어떻게 해야 합니까?

실용적인 단계별 답변을 찾으려면 파일을 initrd새 디렉터리에 복사하여 붙여넣고 다시 컴파일하여 myinitrd새로 생성된 파일로 시작할 수 있음을 증명하는 것입니다.

답변1

대상 장치/구성에 따라 initrd형식이 다를 수 있습니다 . 다음을 사용하여 형식을 확인할 수 있습니다.

binwalk ./initrd

크로스 포스트에 따르면 initrd에 필요한 형식은 cpio압축 형식이므로 식별은 다음과 같습니다.newclzma이는 단지 initrd를 식별하는 방법을 설명하기 위한 것입니다.:

binwalk initrd

#DECIMAL    HEXADECIMAL     DESCRIPTION
#------------------------------------------
# 0         0x0             LZMA compressed data

cp initrd compressedinit.xz
xz -d compressedinit.xz
binwalk compressedinit

#DECIMAL    HEXADECIMAL     DESCRIPTION
#------------------------------------------
# 0         0x0             ASCII cpio archive...
# 112       0x70            ASCII cpio archive...
# ...

이를 통해 initrd형식화 cpio되고 압축된 newc파일을 인식할 수 있습니다 lzma. 포장/재포장은 initrd형식에 따라 다릅니다. binwalk등을 사용하면 xz사용 gzip된 형식을 검색하고 사용된 압축을 기반으로 추출한 후 다시 생성할 수 있어야 합니다.

이 옵션은 대상 형식에 따라 cpio -H다음 형식 중 하나일 수 있는 아카이브 형식을 결정합니다 .crc newc odc bin ustar tar

추출한 콘텐츠에는 다음이 initrd포함되어 있습니다.

~/test$ ls
early  early2  main

다음 단계를 사용하여 포장을 풀고 다시 포장할 수 있습니다(출처: Super User's품질 보증):

# Extract and prepare the working directories
# -------------------------------------------

mkdir /tmp/tmp/
mkdir /tmp/tmp/extracted/
cp initrd /tmp/tmp/
cd /tmp/tmp
unmkinitramfs initrd ./extracted
cd extracted

# Add the first microcode firmware
# --------------------------------

cd early
find . -print0 | cpio --null --create --format=newc > /tmp/tmp/newinitrd

# Add the second microcode firmware
# ---------------------------------

cd ../early2
find kernel -print0 | cpio --null --create --format=newc >> /tmp/tmp/newinitrd

# Add the ram fs file system
# --------------------------

cd ../main
find . | cpio --create --format=newc | xz --format=lzma >> /tmp/tmp/newinitrd

# Verify both initrds 
# -------------------

cd /tmp/tmp
binwalk initrd
binwalk newinitrd

initrd이 방법은 귀하의 경우에 적합하며, 다른 경우에는 서식 지정 cpio및 압축을 사용할 수 있습니다 .newclzma

cd /extracted/initrd
find . | cpio -o -H newc | xz --format=lzma > ../newinitrd

답변2

이것은 syslinux 4.06(라이브 부팅)용 xz initramfs를 다시 패키지하는 데 사용한 것입니다.

#!/bin/bash

find . 2>/dev/null | cpio --create --format='newc' > ../initrfs.img.cpio
xz --check=crc32 --lzma2=,dict=2048kiB ../initrfs.img.cpio
mv ../initrfs.img.cpio.xz ../initrfs.img

답변3

cpio: 옵션에는 인수가 필요합니다 - 'H'

-H newc이 옵션 이 필요합니다 . 한 번 시도했지만 성공하지 못했습니다. 압축 없이 작동합니다.

관련 정보