gpt4 book ai didi

linux - 从压缩的内核镜像中获取内核版本

转载 作者:IT王子 更新时间:2023-10-29 01:00:22 32 4
gpt4 key购买 nike

我正在编写 shell 脚本。我有一个预建的 zImage。是否可以知道创建此 zImage 的内核版本?

我已经尝试使用更新的命令@ Getting uname information from a compressed kernel image , 但两个命令都失败了。

$ dd if=zImage bs=1 skip=$(LC_ALL=C grep -a -b -o $'\x1f\x8b\x08\x00\x00\x00\x00\x00' zImage | \
cut -d ':' -f 1) | zcat | grep -a 'Linux version'

dd: unrecognized operand `3165585'
Try `dd --help' for more information.

gzip: stdin: unexpected end of file

$ dd if=zImage bs=1 skip=$(LC_ALL=C grep -a -b -o $'\xFD\x37\x7A\x58\x5A\x00' zImage | \
head -n 1 | cut -d ':' -f 1) | xzcat | grep -a 'Linux version'

xzcat: (stdin): File format not recognized

你能指导我从 zImage 识别内核版本吗?

最佳答案

检查内核压缩算法

您的 zImage 很可能是使用 LZMA 压缩器压缩的。您可以在下一个文件中检查它:

  • .config 文件中(如果您自己构建内核)
  • /boot/config-`uname -r` 文件中(如果您正在使用您的发行版)
  • /proc/config.gz 文件中(如果启用了 CONFIG_IKCONFIG_PROC)

寻找 CONFIG_KERNEL_* 参数:

$ cat .config | grep '^CONFIG_KERNEL_[^_]\+='

如果您设置了 CONFIG_KERNEL_LZMA=y,则表示使用了 LZMA 压缩器。

解压zImage

LZMA 格式 has 5d 00 00 header 签名。因此可以通过这种方式在 zImage 文件中找到压缩的 Image 文件的位置:

$ grep -P -a -b -m 1 --only-matching '\x5D\x00\x00' zImage | cut -f 1 -d :

提取压缩的图像:

$ pos=$(grep -P -a -b -m 1 --only-matching '\x5D\x00\x00' zImage | cut -f 1 -d :)
$ dd if=arch/arm/boot/zImage of=piggy.lzma bs=1 skip=$pos

现在确保 piggy.lzma 实际上是 LZMA 存档:

$ file piggy.lzma 

piggy.lzma: LZMA compressed data, streamed

解压piggy.lzma:

$ unlzma -c piggy.lzma > Image

查找Linux版本

现在你已经解压了 Image,你可以使用 strings 工具找到 Linux 版本:

$ strings Image | grep 'Linux version'

它应该给你这样的东西:

Linux version 4.4.11-188843-g94c4bf5-dirty (joe@joe-laptop) (gcc version 4.8 (GCC) ) #1 SMP PREEMPT Thu May 26 20:55:27 EEST 2016

关于linux - 从压缩的内核镜像中获取内核版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37672417/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com