2010/01/25

Debian Lennyでのカーネルコンパイル

alix上でのコンパイルは負荷が高いのでUbuntu 8.04 LTS上のVMWare Workstationにlennyを準備してカーネルのコンパイルができるようにしました。

Debian lennyでのカーネルコンパイル

Debianではカーネルの構築用にいくつかのツールが提供されていますが、今回はmake-kpkgコマンドを使っています。

基本的な手順

make-kpkgを使う時に使う典型的な手順は次の通りです。

2010/03/01追記:
カーネルをビルドする前に、いくつかのパッケージの導入が必要です。 余計なものが入るかもしれませんが、次のようなコマンドラインは便利かもしれません。
$ sudo apt-get install kernel-package bzip2 build-essential

$ sudo tar xvjf linux-2.6.31.1.tar.bz2 
$ cd linux-2.6.31.1
$ cp -i /boot/config-2.6.26-2-686 .config
$ yes "" | sudo make oldconfig
$ sudo make-kpkg clean
$ sudo INSTALL_MOD_STRIP=1 CONCURRENCY_LEVEL=3 make-kpkg --initrd --append-to-version=-686-mybuild kernel_image kernel_headers

もし既存の.configファイルが存在してcpコマンドが質問をしてきた場合にはC-cやnを入力します。 また既にlinux-2.6.30.10などをコンパイルしている場合には、そこで使った.configファイルを持ってきます。 ただし副作用がわからないので2.6.32など、より新しいバージョンの.configファイルは使わないようにしています。

-686-mybuildの部分は、適当に自分に都合に合わせて変更します。

大抵はエラーがでると思いますが、下記のように対応して直近のmake-kpkg ... kernel_imageコマンドを再び実行します。

カーネルバージョン毎に必要な対応手順

lennyでコンパイルするという条件の元では、より新しいカーネルを構築する際にエラーになる場合があります。 その対応方法をまとめました。

2.6.31以降で遭遇するエラー

lenny上で2.6.31以降をコンパイルした時のエラーメッセージ

lguest.c:21:25: error: sys/eventfd.h: No such file or directory
lguest.c: In function ‘create_thread’:
lguest.c:1027: warning: implicit declaration of function ‘eventfd’

2.6.31カーネルをlenny上でコンパイルするためのTipsに従ってMakefileを修正し、無事にカーネルがビルドできました。

$ sudo vi Documentation/lguest/Makefile

修正個所のMakefile抜粋

_FORTIFY_SOURCE

all: 
2.6.33以降で遭遇するエラー

lguestの他の原因で、make-kpkgコマンドが途中で止ってしまいます。

lenny上でのエラーメッセージ

The UTS Release version in include/linux/version.h
	   "" 
does not match current version:
	   "2.6.33-rc5-686-yabuild" 
Please correct this.

対応方法はUbuntuのKernel Master Threadのコメントの中にあります。

$ sudo cp -i include/generated/utsrelease.h include/generated/compile.h include/linux/

debパッケージのインストール

この後で再びmake-kpkgコマンドを走らせると、続きから始まりパッケージが終了します。 一つ上の../ディレクトリにdebパッケージが作成されるので、これをalixにコピーするなどして実行します。

$ sudo dpkg -i linux-image-2.6.32.4-686-yabuild_2.6.32.4-686-yabuild-10.00.Custom_i386.deb

2 件のコメント:

shibata さんのコメント...

通りすがりのものです。たいへん参考になる情報をいただきありがとうございます。
2.6.33でmake-kpkgコマンドが途中で止ってしまう件ですが、utsrelease.h が generated ディレクトリ下に移ってしまったのが原因のようで、対処方法が
http://www.ubuntu-se.org/phpBB3/viewtopic.php?f=54&t=46475&start=0

http://ubuntuforums.org/showthread.php?p=8625722
にあることを見つけましたのでお知らせしたいと思いました

YasuhiroABE さんのコメント...

情報ありがとうございます。

ファイルをコピーする以外にも対応方法がいろいろあるんですね。