initrd 压缩问题

initrd 压缩问题

配置文件上启用了 initrd 压缩,但内核映像未被压缩。

hkk@hkk-NUC7CJYH:~$ grep COMPRESS /etc/initramfs-tools/initramfs.conf
COMPRESS=gzip

hkk@hkk-NUC7CJYH:/boot$ file initrd.img-5.8.0-43-generic
initrd.img-5.8.0-43-generic: ASCII cpio archive (SVR4 with no CRC)

Ubuntu VERSION="20.04.2 LTS (Focal Fossa)"

我只是想知道我是否需要执行任何额外的配置来压缩内核映像。非常感谢您的帮助!

答案1

首先,正如提到的。你想要初始化文件不是内核映像压缩。并且您已正确配置了压缩所需的一切。

您说得也对,它不是 100% 压缩的,甚至看起来根本没有压缩,因为 initrd 的第一部分是一个完整的 CPIO 档案,它是未压缩的。正如您所发现的,这个未压缩的 CPIO 是英特尔微代码更新数据。然而,第一个 CPIO 档案之后的数据将是另一个压缩的 CPIO,即主 initrd 档案。

Linux 内核可以读取多个连接在一起的 initrd 档案,即使有些是压缩的,有些不是。根据最近的 Linux 内核,initrd 格式如下:

*       is used to indicate "0 or more occurrences of"
(|)     indicates alternatives
+       indicates concatenation
GZIP()  indicates the gzip(1) of the operand
ALGN(n) means padding with null bytes to an n-byte boundary

initramfs  := ("\0" | cpio_archive | cpio_gzip_archive)*

cpio_gzip_archive := GZIP(cpio_archive)

cpio_archive := cpio_file* + (<nothing> | cpio_trailer)

cpio_file := ALGN(4) + cpio_header + filename + "\0" + ALGN(4) + data

cpio_trailer := ALGN(4) + cpio_header + "TRAILER!!!\0" + ALGN(4)

不过,我认为这也不是最新的,因为支持的压缩不止 gzip。另外,我相信内核中有一个错误,未压缩的 CPIO 存档无法跟在压缩的存档后面。另一件需要注意的事情是,如果各个 initrd 中有重复的路径,则将使用最后一个路径的数据。

相关内容