Как достать конфиг из образа ядра [?SOLVED?]
Доброго дня!
Из образа ядра можно достать его конфиг без запуска этого ядра. Конечно при сборке должны быть указаны соответствующие опции.
Для этого есть скрипт:
{kernel_source}/scripts/extract-ikconfig
Но вот беда, скрипт понимает только gzip-архивы. Поэтому скрипт был немного доработан.
Суть его работы следующая:
1. ищет заветные символы IKCFG_ST начала конфига ядра в образе ядра, считая, что образ не архивирован;
2. если нашел, выдирает gzip-архив, который начинается сразу после заветных символов, и распаковывает через zcat, если не нашел шаг 3.
3. если образ архивирован, ищет заветные строчки заголовка архива в зависимости от типа архива
4. если нашел начало архива, выдирает его и распаковывает -> получаем неупакованный образ ядра (видно по заветным ELF в начале файла)
5. далее опять шаг 1.
Пример использования:
extract-ikconfig /boot/kernel-genkernel-x86_64-2.6.31-gentoo-r10_amd64 bz2 > config
К сожелению LZMA-архивы не тестились, но должно работать, если не будет нужно подправить переменную lz1.
Собственно сам скрипт:
#!/bin/sh # ---------------------------------------------------------------------- # extract-ikconfig - Extract the .config file from a kernel image # # This will only work when the kernel was compiled with CONFIG_IKCONFIG. # # The obscure use of the "tr" filter is to work around older versions of # "grep" that report the byte offset of the line instead of the pattern. # # (c) 2009, Dick Streefland <dick@streefland.net> # Licensed under the terms of the GNU General Public License. # ---------------------------------------------------------------------- # 0x1F8B08 -- header of gzip archive. See `hexedit <anyfile.gz>` gz1='\037\213\010' # 0x425A58 -- header of bzip2 archive. See `hexedit <anyfile.bz2>` bz1='\102\132\150' # 0x5D0000 -- header of lzma archive. See `hexedit <anyfile.lzma>`. !!!!!!!!!Need testing!!!!!!!!!!! lz1='\135\000\000' gz2='01' cf1='IKCFG_ST\037\213\010' cf2='0123456789' dump_config() { if pos=`tr "$cf1\n$cf2" "\n$cf2=" < "$1" | grep -abo "^$cf2"` then pos=${pos%%:*} tail -c+$(($pos+8)) "$1" | zcat -q exit 0 fi } # Check invocation: me=${0##*/} img=$1 if [ $# -le 1 -o ! -s "$img" ] then echo "Usage: $me <kernel-image> [ gz | bz2 | lzma ]" >&2 echo "lzma option not tested" exit 2 fi # Initial attempt for uncompressed images or objects: dump_config "$img" z1=$gz1 if [ -n $2 ] then case "$2" in gz) z1=$gz1 ;; bz2) z1=$bz1 ;; lzma) z1=$lz1 ;; esac fi # That didn't work, so decompress and try again: imgtmp=/tmp/imgtmp$$ tmp=/tmp/ikconfig$$ trap "rm -f $imgtmp" 0 trap "rm -f $tmp" 0 for pos in `tr "$z1\n$gz2" "\n$gz2=" < "$img" | grep -abo "^$gz2"` do pos=${pos%%:*} tail -c+$pos "$img" > "$imgtmp" case "$z1" in "$gz1") zcat "$imgtmp" 2> /dev/null > $tmp ;; "$bz1") bzip2 -c -d "$imgtmp" 2> /dev/null > $tmp ;; "$lz1") lzma -c -d "$imgtmp" 2> /dev/null > $tmp ;; esac dump_config $tmp done # Bail out: echo "$me: Cannot find kernel config." >&2 exit 1
- Для комментирования войдите или зарегистрируйтесь