我正在定制 Ubuntu 20.04 ISO,在此过程中,我必须编辑目录内initrd
file内的文件casper
Ubuntu20.04-ISO/casper/initrd
如何重新编译此文件类型的 CPIO-archive (application/x-cpio)
我可以使用以下命令解压其内容。
unmkinitramfs initrd .
但我无法重新编译它,我怎样才能实现这一目标?
寻找一个实用的逐步答案,我的意思是复制粘贴文件initrd
到新目录并重新编译它,并证明可以使用这个新创建的myinitrd
文件启动。
答案1
根据目标设备/配置initrd
可能有不同的格式,您可以使用以下方式检查其格式:
binwalk ./initrd
根据您的交叉帖子,您的 initrd 所需的格式是与压缩一起cpio
格式化的,因此识别方法如下......newc
lzma
请注意,这只是为了解释如何识别 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
您可以使用以下步骤来解压并重新打包它(来源:您的超级用户的质量保证):
# 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
和压缩:newc
lzma
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
选项。我尝试过一次,没有成功。它无需压缩即可工作。