我正在尝试更新用于将 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 压缩,但还有其他内容,但没有记录……