如何在实践中演示内核压缩的类型?

bal*_*lon 10 linux compression linux-kernel

我必须找出我的arch linux系统的linux内核的压缩类型,但我找不到比理论更多的方法:现在是bzip2(bz),以前是gzip(z)。

在我的电脑上,我运行命令:

$ file /boot/vmlinuz-linux
/boot/vmlinuz-linux: Linux kernel x86 boot executable bzImage, version 5.3.11-arch1-1 (linux@archlinux) #1 SMP PREEMPT Tue, 12 Nov 2019 22:19:48 +0000, RO-rootFS, swap_dev 0x5, Normal VGA
Run Code Online (Sandbox Code Playgroud)

看理论,我看到bzImage必须被压缩gzip (z),但我无法证明:

bzImage 使用 gzip 压缩,直到 Linux 2.6.30 引入了更多算法。虽然有流行的误解,认为 bz 前缀意味着使用 bzip2 压缩(bzip2 包中经常带有以 bz 为前缀的工具,例如 bzless、bzcat 等),但事实并非如此。

有什么办法可以在我自己的机器上证明吗?或者在这种情况下,理论本身是“经验性的”?

Ste*_*itt 8

你的维基百科引用

尽管人们普遍认为bz前缀意味着使用 bzip2 压缩 [...],但事实并非如此。

说与你的理论相反:bzinbzImage与 无关bzip2,并且bzImage不必用 压缩bzip2。事实上,内核的默认压缩模式仍然是gzip,现在几乎没有理由使用bzip2它——它比 LZMA 慢,xz但也不压缩。

要最终确定给定内核映像使用了什么压缩,而无需运行它或查找其配置,您可以按照内核自己的extract-vmlinux脚本使用的方法:

  • 在图像中查找压缩器的签名:

    • gunzip\037\213\010
    • xz\3757zXZ\000
    • bzip2BZh
    • lzma\135\0\0\0
    • lzo\211\114\132
    • lz4\002!L\030
    • zstd(\265/\375
  • 尝试从图像中提取数据,从您找到的任何签名的偏移量开始;

  • 检查结果(如果有的话)是一个 ELF 图像。

我在这里修改了脚本以便它只报告压缩类型。我没有在这里包括它,因为它仅在 GPL 2 下获得许可。


And*_*ton 5

您可以查看您的内核支持哪些压缩方法。只能选择一个,这样就可以证明是哪一个了。

在这里,我使用 gzip:

$ zgrep CONFIG_KERNEL_ /proc/config.gz
CONFIG_KERNEL_GZIP=y
# CONFIG_KERNEL_BZIP2 is not set
# CONFIG_KERNEL_LZMA is not set
# CONFIG_KERNEL_XZ is not set
# CONFIG_KERNEL_LZO is not set
# CONFIG_KERNEL_LZ4 is not set
Run Code Online (Sandbox Code Playgroud)

  • 如果选择了“XZ”,那么“XZ”就是你所拥有的。“正常”是相对的。 (2认同)