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

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

我必须找出压缩类型我的 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

从理论来看,我发现bzImage必须被 压缩gzip (z),但我无法证明这一点:

bzImage 一直使用gzipLinux 2.6.30 进行压缩,引入了更多算法。尽管人们普遍误解该bz前缀意味着使用 bzip2 压缩(bzip2 包通常与带有 、 等前缀的工具一起分发)bz,但事实并非如此。bzlessbzcat

有没有办法在我自己的机器上证明一下?或者在这种情况下理论本身是“经验性的”?

答案1

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

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

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

  • 检查结果(如果有)是否是 ELF 图像。

我已经改编了剧本这里这样它只报告压缩类型。我不将其包含在此处,因为它仅根据 GPL 2 获得许可。

答案2

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

在这里,我使用 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

答案3

VMlinuz 已被压缩为 gzip,如以下链接所示:

http://www.linfo.org/vmlinuz.html

https://www.ibm.com/developerworks/community/blogs/mhhaque/entry/anatomy_of_the_initrd_and_vmlinuz?lang=en

https://en.wikipedia.org/wiki/Vmlinux

讽刺的是,该网页说很多人将扩展名与 bzip2 混淆了,如下所示:

在某些较旧的系统上会创建一个名为 zImage 文件的已编译内核,并在较新的系统上保留以实现向后兼容性。 zImage 和 bzImage 都压缩为压缩包。不同的是zImage解压到低内存(即前640kB),bzImage解压到高内存(超过1MB)。有一个常见的误解是bz图像使用 bzip2 实用程序进行压缩;事实上,b只是代表大。

我希望这些信息对您有所帮助。

相关内容