我必须找出压缩类型我的 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 一直使用
gzip
Linux 2.6.30 进行压缩,引入了更多算法。尽管人们普遍误解该bz
前缀意味着使用 bzip2 压缩(bzip2 包通常与带有 、 等前缀的工具一起分发)bz
,但事实并非如此。bzless
bzcat
有没有办法在我自己的机器上证明一下?或者在这种情况下理论本身是“经验性的”?
答案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://en.wikipedia.org/wiki/Vmlinux
讽刺的是,该网页说很多人将扩展名与 bzip2 混淆了,如下所示:
在某些较旧的系统上会创建一个名为 zImage 文件的已编译内核,并在较新的系统上保留以实现向后兼容性。 zImage 和 bzImage 都压缩为压缩包。不同的是zImage解压到低内存(即前640kB),bzImage解压到高内存(超过1MB)。有一个常见的误解是bz图像使用 bzip2 实用程序进行压缩;事实上,b只是代表大。
我希望这些信息对您有所帮助。