如何打包提取的 initrd(x-cpio 存档)?

如何打包提取的 initrd(x-cpio 存档)?

我正在定制 Ubuntu 20.04 ISO,在此过程中,我必须编辑目录内initrdfile内的文件casperUbuntu20.04-ISO/casper/initrd

如何重新编译此文件类型的 CPIO-archive (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、等xzgzip您应该能够发现使用的格式,从而在提取后根据使用的压缩重新创建它。

请注意,该cpio -H选项确定存档格式,这可以是以下格式之一,crc newc odc bin ustar tar具体取决于目标格式。

由于您提取的内容initrd包含:

~/test$ ls
early  early2  main

您可以使用以下步骤来解压并重新打包它(来源:您的超级用户的质量保证):

# 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选项。我尝试过一次,没有成功。它无需压缩即可工作。

相关内容