はじめに

このメモについて

kernel 2.6から稼働中のkernelとkernelイメージファイル(bzImageとか)からkernelの設定情報(/usr/src/linux/.configにあたるもの)が取り出せるようになりました。
今まで17回ぐらい「前のkernelイメージからkernel設定が取れたらいいなぁ」と思ったことがあるので、ちと調べてやってみたメモです。

目的

  1. 稼働中のkernel設定を取得する。
  2. 稼働中かどうかに関わらず、kernelイメージからkernel設定を取得する。

kernel設定を得るためのkernelの設定

それぞれの目的を実現するために、以下のkernel設定を有効にしてkernelをビルドします。

CONFIG_IKCONFIG
make menuconfigでいうと、 General setup → Kernel .config support がそれ。
Kconfigはinit/Kconfig
これを有効にするとkernel設定の内容がkernelイメージに含まれるようになる。
CONFIG_IKCONFIG_PROC
make menuconfigでいうと、 General setup → Enable access to .config through /proc/config.gz がそれ。前項を有効にしないと選択できない。
Kconfigはinit/Kconfig
これを有効にすると/proc/config.gzで稼働中のkernel設定が見られるようになる。

make V=0 clean bzImage modules modules_installなどでkernelをビルドしたのち、そのkernelでブートする。

kernel設定を取得する方法

無事、新しいkernelで起動したら早速試してみましょ。

稼働中のkernel設定を取得する

/proc/config.gzというファイルがあれば成功です。

% zcat /proc/config.gz | less

なり

% zcat /proc/config.gz > ~/config

するなりぞうぞ。rootになる必要はなく、一般ユーザーでOKです。

kernelイメージからkernel設定を取得する

kernelイメージからkernel設定を取り出すには2つのプログラムが必要なので準備します。

一つはextract-ikconfigで、これは/usr/src/linux/scripts/extract-ikconfigにありシェルスクリプトなのでどこかPATHの通ったところにコピーすればOKです。

もう一つはbinoffsetです。ソースコードが同じく/usr/src/linux/scripts/binoffset.cにあるのですがシェルスクリプトではなくCのソースコードなので、

# cd /usr/src/linux/scripts
# make binoffset

とすればbinoffsetができあがるので、PATHの通ったところにコピーします。

準備ができたらextract-ikconfigを使ってkernel設定を取り出します。

% cp /boot/bzImage-2.6.3 ~/
% extract-ikconfig ~/bzImage-2.6.3
filesize: 1776579
number of pattern matches = 1
19564
Kernel configuration written to /home/hirose31/bzImage-2.6.3.oldconfig.5823
%

これでkernelイメージがあったディレクトリに、 IMAGE.oldconfig.PID というファイルができているはずです。

注意点は、 extract-ikconfigが内部でbinoffsetを実行してるが、パス指定していないのでextract-ikconfig実行時にPATHの通ったところにbinoffsetがある必要があるのと、 元のkernelイメージがあった場所にkernel設定をファイル出力するので、イメージファイルを/bootなど一般ユーザーが書き込み権限がない場所から書き込める場所にコピーしてからそのイメージファイルに対してextract-ikconfigを実行することぐらいです。
後者はrootで実行すれば関係ありませんが、rootでする必要のないことはrootですべきではないので。

目次