Как достать конфиг из образа ядра [?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
- Для комментирования войдите или зарегистрируйтесь
