Ubuntu でカーネルビルドをしよう!の巻

Ubuntu でカーネルビルドをして、カーネルを今のマシンに最適化するテスト。

事前準備

カーネルビルドに必要なパッケージをインストール。

# apt-get install build-essential
# apt-get install kernel-package

カーネルソースの取得

現時点での最新版、 2.6.35 をダウンロード。

# apt-get install linux-source-2.6.35

コンパイルの準備

カーネルソースを取得したら /usr/src に tar.bz2 ができてるので、/usr/src に移動して解凍する。

# cd /usr/src
# tar xf linux-source-2.6.35.bz2

.config という名前の設定ファイルが必要なので、既存のものをコピーして使う。

# cp /boot/config-2.6.35-28-generic .config
# make oldconfig

コンパイル

それではコンパイル。と行きたいところだが、このままコンパイルすると以下のエラーで怒られる。

ld: cannot find /ubuntu/omnibook/sections.lds: No such file or directory

見ての通り /ubuntu/omnibook/sections.lds が無いことが原因。これらのファイルはダウンロードしたカーネルソース内にあるので、シンボリックリンクを作成する。

# ln -s /usr/src/linux-source-2.6.35/ubuntu /ubuntu

参考:https://bugs.launchpad.net/ubuntu/+source/linux/+bug/505420


ではいよいよコンパイル。

# make-kpkg --initrd kernel_image

環境変数 CONCURRENCY_LEVEL に数値をいれておくと、同時にその数値分のファイルを並列コンパイルしてくれるという記述があったものの手元の環境では有意な差は見られなかった。

# env CONCURRENCY_LEVEL=2 <- 有意な差は無し。

Core2Duo E8500, Mem 4GB のマシンでビルドに40分程度。並列コンパイルが出来ているのかどうか不明なため、もっとビルド時間を減らすチューニングの余地はありそう。

インストール

コンパイルが終了すると /usr/src に .deb ファイルが作成される。これを dpkg -i でインストール。

# cd /usr/src
# sudo dpkg -i linux-image-2.6.35.11_2.6.35.11-10.00.Custom_i386.deb

これでマシンを再起動すれば自前ビルドのカーネルが使用できる。

まとめるとこれだけ。apt-get は初回のみ必要なので、これらを除けばかなり少ない手順でカーネルビルドが行えることがわかる。

# apt-get install build-essential
# apt-get install kernel-package
# apt-get install linux-source-2.6.35
# cd /usr/src
# tar xf linux-source-2.6.35.tar.bz2
# cp /boot/config-2.6.35-28-generic .config
# make oldconfig
# ln -s /usr/src/linux-source-2.6.35/ubuntu /ubuntu
# make-kpkg --initrd kernel_image
# cd /usr/src
# dpkg -i linux-image-2.6.35.11_2.6.35.11-10.00.Custom_i386.deb

それでは良いカーネルビルドライフを!