将 iso 解压到单独的目录中

将 iso 解压到单独的目录中

我正在尝试更新用于将 Ubuntu 18.04 安装映像重新制作为 20.04 的过程,并在提取 initrd 存档时遇到问题。使用的命令是cpio -id --no-absolute-filenames。当我使用相同的命令从 20.04 映像中提取 initrd 映像时,它会提取kernel/x86/microcode/AuthenticAMD.bin并停止。

检查 initrd 文件内容时,我可以看到“TRAILER”部分,显示文件中有多个存档。正如其他关于 cpio 存档的线程中所建议的那样,我尝试提取复合存档,如下所示:cat initrd | while cpio -id --no-absolute-filenames; do :; done。在这种情况下,第一个条目被提取,但随后它有一堆“0 块”,并且没有提取任何其他内容。

有人知道这个档案是如何创建的或者如何提取它吗?

答案1

/usr/sbin/update-initramfs 调用 /usr/sbin/mkinitramfs,后者调用

cpio --quiet -R 0:0 --reproducible -o -H newc | lz4 -9 -l

其中 lz4 来自 /etc/initramfs-tools/initramfs.conf

将其反转为

cat /boot/initrd.img-5.4.0-26-generic | unlz4 -9 -l | cpio -i -H newc

但失败了。

cat /boot/initrd.img-5.4.0-26-generic | file -
    /dev/stdin: ASCII cpio archive (SVR4 with no CRC)

一直坚持认为这是一个 cpio 档案,但是

cat /boot/initrd.img-5.4.0-26-generic | cpio -i -H newc

最终仍会得到相同的 AuthenticAMD.bin。也许其他人可以在此基础上进行构建?

编辑:不。根据https://unix.stackexchange.com/a/511224/44864 答案是

 unmkinitramfs -v initrd.img-5.4.0-26-generic .

答案2

同样的问题——解决方案是不使用 unmkinitramfs 解压 Ubuntu 版本 20.04。

我创建了一个可启动的 USB,并将我的机器启动到 Ubuntu 20——unmkinitramfs 随后能够解压 initrd。我仍在寻找构建新的可启动 USB 的方法,它不会自动登录(但可以与 casper-rw 正常工作)。

如果您想进一步了解 unmkinitramfs 的功能,它是一个 bash 脚本。与 Bionic 和 Focal 相比,Bionic 不支持 lz4 压缩。

答案3

我目前正在基于 Ubuntu 20.04 live CD 创建自定义 live CD。一切都很好,直到我尝试修改 initrd。我的意思是位于 iso 的 casper 目录中的 initrd。

据我所知,构建 Live CD 的标准方法是首先。

将 iso 解压到单独的目录中

将 squashfs 文件系统提取到单独的目录中

在 squashfs 目录上进行 chroot 之前,先挂载 proc sys dev ..

# 在 squahfs 目录上创建 chroot

您可以根据需要开始修改 squashfs 文件系统。

# 进行修改

离开 chroot 之前

# 执行更新 initramfs (update-initramfs -k all -u)

重建 squashfs 映像

将其复制到 iso 目录中

重建 iso 映像。

我注意到一件事,update-initramfs 不会修改 initrd。

就我而言,我正在改变普利茅斯主题。

  • 因此,我尝试基于位于 /casper 下的原始 initrd 创建一个新的 initrd。

mkdir temp;cd temp unmkinitramfs../initrd.#(casper)mkinitramfs.-o../initrd.new

对我来说,这应该创建一个与原始大小相同的 initrd.new。

但事实并非如此!新的更大

否则,我尝试了其他方法 -----------------------

binwalk initrd .. 3492528 0x354AB0 ASCII cpio 存档(无 CRC 的 SVR4),文件名:“TRAILER!!!”,文件名长度:“0x0000000B”,文件大小:“0x00000000” 3492864 0x354C00 LZ4 压缩数据,旧版

就在 TRAILER 行之后(获取 lz4 大小,这里是 3492864)

dd if=../initrd bs=3492864 skip=1 | unlz4 -c | cpio -id

现在重建 initrd

查找 | cpio -H newc -o | lz4 -c > ../initrd.partial.lz4

最后将微码文件和新的 initrd (initrd.partial.lz) 连接起来

计数是块大小除以 512

dd if=../initrd of=../initrd.microcode bs=512 count=6822

重建新的initrd

cat ../initrd.microcode ../initrd.partial.lz4 > ../initrd.new

#------------------------------------------------------------------------

它们的皮的尺寸不一样!

看起来,focal 的 initrd 格式已经发生了一些变化。focal 中确实添加了 lz4 压缩,但还有其他内容,但没有记录……

相关内容