カーネルをコンパイルしよう

以下はUbuntuの英語フォーラムTutorial of the Weekの翻訳です。原文「Master Kernel Thread」はユーザー master_kernelによって執筆されています。英語フォーラムにおける投稿はCreative Commons Attribution 3.0です。この文章自体はCreative Commons Attribution Share Alike 3.0とします。当該エントリーは頻繁に更新されているので最新版については原文を参照ください。文章の雰囲気から、このチュートリアルはである調で訳しました。本文中の色分けについては割愛します。

Master Kernel Threadにようこそ

このチュートリアルは現在の安定版2.6.30を対象に書かれている。最後にアップデートされたのは2009年8月17日だ。

カーネルをコンパイルする方法についてかいたポストやブログはそこら中にある。ではこのポストの何がそれらと違っているのだろう。実際のところ、それら全てにリンクをしているというだけで、カーネルをコンパイルする方法については何も変わらない。もちろん、多少簡単かもしれないし、もっと頻繁に更新されているかもしれない。じゃあ何でこんなスレッドがあるのか。それは私がこのチュートリアルを書くことでLinuxコミュニティー全体に何か還元したいと思っているからだ。私はユーザーに長い起動時間や遅いデスクトップに苦しむことなくLinuxを使いつづけて欲しいと思っている。このスレッドが作られたのはまさにそれらを実現するためだ。コンパイルするカーネルを最適化するためにチュートリアルはこちらにある。このチュートリアルはこのスレッドに基づいている。スレッドを立てたxXx 0wn3d xXxにここで感謝の意を表しておこう。

参考:私が開発しているソフトウェアで現在バージョン1.2.5であるKernelCheckはこちらからダウンロードできる。KernelCheckはこのチュートリアルに書かれた方法で最新版のカーネルを自動的にコンパイルしインストールする。KernelCheckのスクリーンレットはこちらで、専用のスレッドはこちらだ。このプログラムはEnvyNGを通してプロプライエタリなビデオドライバの自動インストールもできる。

手順

1. カーネルの設定に必要なツールのインストール

sudo apt-get install build-essential bin86 kernel-package libqt3-headers libqt3-mt-dev wget libncurses5 libncurses5-dev

2. 設定ディレクトリに移動

cd /usr/src

3. ルートになる

sudo -s

4. カーネルのダウンロードと解凍

wget -c http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.30.tar.bz2 && tar -xvjf linux-2.6.30.tar.bz2

5. linuxディレクトリへのリンクを消去してディレクトリへ移動

rm -rf linux && ln -s /usr/src/linux-2.6.30 linux && cd /usr/src/linux

注意:fbsplash, beyond, emissionなどカーネルへのパッチが必要であればここでパッチを適用し8まで飛ばすこと。

6. カーネルパッチをダウンロード

wget -c http://www.kernel.org/pub/linux/kernel/v2.6/patch-2.6.30.5.bz2

7. パッチの適用

bzcat patch-2.6.30.5.bz2| patch -p1

8. 現在のカーネル設定をインポートしオプションを取得

cp /boot/config-$(uname -r) .config && yes "" | make oldconfig

9. カーネルの設定

注意:ワイヤレス接続が必要な場合、カーネルでワイヤレスドライバを有効にする必要がある。最も簡単な方法はCtrl + Fを押して使用するワイヤレスモジュールの名前を検索することだ。

make xconfig

端末を用いる場合:

make menuconfig

distccを用いればコンパイル時間を大幅に短縮できる。その方法についてはこちら

10. カーネルのビルド:ルート権限を持った状態で/usr/src/linuxにいることを確認すること。これによりインストール可能なdebファイルが作成される。

端末では:

make-kpkg clean

その後:

CONCURRENCY_LEVEL=3 make-kpkg --initrd --append-to-version=-mk kernel_image
kernel_headers modules_image

注意:mkの部分は好きに、例えばk7や686に、変更してよいが、ハイフンは残すように。カーネルのコンパイルにはプロセッサの速度によるが1から3時間ほどかかるだろう。非常に遅いマシンであれば4時間以上かかるかもしれない。自分だったらその間映画を見にいくか何かする。並列処理レベル(concurrency level)はCPUコアの数より一つ多い数に設定すべきだ(何のことか分からなければそのままでよい)。

11. debファイルを/usr/srcにインストール:二つのdebファイルがあるはずだ。一つはイメージでもう一つはヘッダーだ。端末上では:

cd .. && dpkg -i linux*2.6.30*.deb

重要:NVIDIAやATIのグラフィックスカードを使っている場合ドライバーの再インストールが必要かもしれない。

12. 再起動

トラブルシューティング

Q. サスペンドやハイバネートのボタンが機能しない!

A. バージョン2.6.22以降のカーネルのSLUBアロケーターには一部のシステムでサスペンドやハイバネートが動かなくなるバグがある。これを直すにはxconfigのダイアログでSLUBの代わりにSLABアロケーターを選択してやればいい。

Q. HDのサウンド(AzaliaやIntel HD)が新しいカーネルだと動かない!

A. Intel HDモジュールはAdvanced Linux Sound Architectureで有効にする必要がある。例えばIntelのチップじゃなかったとしてもだ。

Q. 64bitのコンピュータを使っているんだけど–apend-to-versionには何をつけるのがいいんだ?686、k7、それとも他の何か?

A. append-to-versionオプションはカーネルとは何の関係もない。単なる名札だ。64bitユーザーならappend-to-version=64としてもいいし、別にオプション自体つけなくてもよい。Processorのところで64bitオプションは有効にできる。

Q. make xconfigでエラーがでた。でも特に問題が起こっているようには思わない。

X Error: BadDevice, invalid or uninitialized input device 168
Major opcode: 148
Minor opcode: 3
Resource id: 0x0
Failed to open device
X Error: BadDevice, invalid or uninitialized input device 168
Major opcode: 148
Minor opcode: 3
Resource id: 0x0
Failed to open device

A. これは特に問題ない。xorg.confにwacomのデバイスがあると出るんだ。このエラーをどうしてもみたくなければこれを読んでくれ。

Q. GRUBは起動するけど、こんなのがいつもでてくる:

Begin: Waiting for root file system…

A. これはUbuntuをSATAのハーディディスクにインストールしたせいだろう。このエラーをなくすにはSATAオプションをつけて再コンパイルする必要がある。

Q. NVIDIAがバージョン2.6.21のカーネルをコンパイルするときは次の指示に従うべきだ。

A.

  1. ソースのある場所に移動しxconfigを実行
  2. Processor type and featuresでPravirtualization SupportをOFFにする
  3. 終了して設定を保存する
  4. make prepareを実行する
  5. NVIDIAのインストーラを再実行
  6. 一丁上がり

Q. トラブルシューティングはこれしかないの?

A. 協力してくれよ。もっと欲しいなら、問題をポストして、私にメッセージを送って、Ubuntuコミュニティに協力しよう。