从压缩的内核映像中获取内核版本

时间:2016-06-07 06:53:31

标签: linux shell linux-kernel embedded-linux

我正在开发一个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中识别内核版本吗?

1 个答案:

答案 0 :(得分:8)

检查内核压缩算法

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

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

寻找CONFIG_KERNEL_* param:

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

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

解压缩zImage

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

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

提取压缩的Image

$ 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压缩数据,流式传输

解压缩piggy.lzma

$ unlzma -c piggy.lzma > Image

找到Linux版本

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

$ strings Image | grep 'Linux version'

应该给你这样的东西:

  

Linux版本4.4.11-188843-g94c4bf5-dirty(joe @ joe-laptop)(gcc版本4.8(GCC))#1 SMP预览5月26日星期五20:55:27 EEST 2016