2016-06-07 13 views
3

Ich arbeite an einem Shell-Skript. Ich habe ein vorinstalliertes zImage. Ist es möglich, die Kernel-Version zu kennen, von der dieses zImage erstellt wurde?Kernel-Version aus dem komprimierten Kernel-Image

Ich habe versucht, mit den Befehlen aktualisiert @Getting uname information from a compressed kernel image, aber beide Befehle sind fehlgeschlagen.

$ 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 

Können Sie mir helfen, die Kernel-Version von zImage zu identifizieren.

+0

Für ARM Ziele, die [Makefile] (http://lxr.free-electronics.com/source/arch/arm/boot/compressed/Makefile) gibt an, dass ein zImage mit den Methoden gzip, lzo, lzma, xz oder lz4 komprimiert werden kann. Sie haben nur zwei (gzip und xz) der fünf möglichen Methoden ausprobiert. – sawdust

Antwort

3

prüfen Kernel Kompressionsalgorithmus

Wahrscheinlich Ihre zImage komprimiert wurde LZMA Kompressor verwendet wird. Sie können es in der nächsten Dateien überprüfen:

  • in .config Datei (wenn Sie Kernel selbst gebaut)
  • in /boot/config-`uname -r` Datei (wenn Sie Ihre Distribution verwenden)
  • in /proc/config.gz Datei (falls CONFIG_IKCONFIG_PROC aktiviert ist
  • )

Suchen Sie nach CONFIG_KERNEL_* param:

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

Wenn Sie CONFIG_KERNEL_LZMA=y eingestellt haben, bedeutet dies, dass LZMA-Kompressor verwendet wird.

auspacken zImage

LZMA-Format has5d 00 00 Header-Signatur. So kann man Position von komprimierter Image Datei in zImage-Datei auf diese Weise:

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

Um die Wiedergabe komprimierter zu extrahieren 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 

jetzt sicher, dass piggy.lzma ist eigentlich LZMA-Archiv:

$ file piggy.lzma 

piggy.lzma: LZMA komprimierte Daten, gestreamte

Dekomprimieren piggy.lzma:

$ unlzma -c piggy.lzma > Image 

die Version Linux finden

Nun, da Sie Image entpackt haben, können Sie die Linux-Version mit strings Tool finden:

$ strings Image | grep 'Linux version' 

die sollte geben Sie etwas wie folgt:

Linux-Version 4.4.11-188843-g94c4bf5-schmutzig (Joe @ Joe-Laptop) (gcc Version 4.8 (GCC)) # 1 SMP PREEMPT Do 26. Mai 20:55:27 EEST 2016

+0

danke für die details hat es geklappt. Ist es möglich zu wissen, welche Komprimierungstechnik für die Komprimierung von zImage verwendet wurde? – Ravi

+2

1. Verwenden Sie das Tool "binwalk" (sollte sich in Ihrem Distro-Repository befinden). 2. Sie können auch versuchen, Ihr Bild mit dem "Datei" -Tool zu überprüfen. 3. Sie können versuchen, "Piggy" -Datei mit allen bekannten Kernel-Kompressionsalgorithmen (und entsprechende magische Zahl im Header) zu extrahieren, dann "Piggy" -Datei mit "Datei" -Tool überprüfen, sollte es Ihnen sagen, ob es komprimierte Datei erwartet. Ansonsten kenne ich keinen einfachen Weg, den Kompressionsalgorithmus zu verstehen. –