ソース・コードが自由に入手できるLinuxならではの楽しみが,カーネルをコンパイルして,独自のシステムに仕立てられること。例えば,より新しいカーネルのソース・コードを入手し,コンパイルして導入すれば,最新機能をいち早く試せる。初めて「カーネル・コンパイル」に挑戦する人に向けて,カーネルを安全に導入する方法を2回に分けて解説する。前編は,カーネルのコンパイルから導入するまでの概要を紹介する。
普段何げなく使っているLinuxディストリビューション。その中核をなすカーネルは,もちろん,プログラムの一種である。Linuxが登場した当初は,ユーザーが自分でコンパイルして導入するのが当たり前だった。しかし,Linuxディストリビューションが“進化”した今では,実行形式で提供される場合がほとんどだ。
Linuxディストリビューションと共に提供される(実行形式の)カーネルは,無難に動作する反面,チューニングの度合いが今一つの場合が多い。また,最新の機能や特殊な機能については,安定志向のLinuxディストリビューションのカーネルには含まれない。そのため,カスタマイズしたい場合や最新機能などを組み込みたい場合には,カーネル・コンパイルを実行する必要がある。
本記事では,初めてカーネル・コンパイルに挑戦する人を対象に,その仕組みと手順を2回に分けて解説する。今回は,カーネルのコンパイルから導入するまでの概要を紹介する。
すべき人,すべきでない人
冒頭にも述べたように,最近ではカーネルを自分でコンパイルする必要はほとんどなくなった。また,場合によっては,「自分でカーネル・コンパイルをするべきでない」こともある。自分でコンパイルするべきかどうか,ちょっと考えてみよう(図1)。
![]() |
図1●コンパイルすべき人とすべきでない人 ○はコンパイルをしてもよい人,×はしてはいけない人。△は本人のやる気次第の人。 |
○機能やドライバの追っかけをする人
最新ハードウエアを使いたい場合,本家カーネル*1にそのドライバが統合されていないことが少なくない。その際は,自分でドライバのソース・コードを入手してコンパイルする必要に迫られる。
同様に,「ReiserFS」や「IPv6」,「ALSA」といった,システムを構成する主要な機能についても,本家カーネルとの統合が今一つなので,独自にソース・コードを入手してコンパイルし,導入する必要がある。
○「俺主義」を通したい人
Linuxディストリビューションのカーネルは,安定して動作する,あるいはより多くのハードウエアで動作することを重視して提供されている。そのため,「チューニングが甘い」と思える点が少なくない。
実際のパフォーマンスへの効果は別にして,カリカリにチューニングしたような設定にしたい人は,ぜひ自分でコンパイルするべきだ(いっそ,自分好みのLinuxを一から作る手もある。「自分Linuxを作り出せ」を参照)。
○静的カーネルを使いたい人
ディストリビューションのカーネルはモジュール構成になっている。普段は動的カーネル*2で特に問題はないが,動的カーネルはカーネルのファイル数が多くなるので,ハンドリング*3が面倒だったりする。また,最近は動的カーネルを逆手に取ったクラック(不正侵入)も存在する。
これらの理由で,静的カーネル*4を使いたい人は,自分でパラメータを設定してカーネルをコンパイルする必要がある。
△パラメータ設定に自信のない人
設定するパラメータによっては,システムの動きが不安定になったり,セキュリティ面で好ましくない状態になったりすることがある。パラメータの設定に自信がない人は,いきなり実用しているLinuxマシンでカーネル・コンパイルするのではなく,予備マシンまたは余剰マシンで試してみよう。
なお,パラメータ設定については,関連記事「Linuxカーネルの設定パラメータ」を参照されたい。
×安定稼働させたい人
ハウジングされていたり,遠隔地に置かれたLinuxマシンの場合,カーネルが起動しないと大変なことになってしまう。カーネルはセキュリティ等の関係で,しばしばバージョンアップの必要があるが,手元でテストができなければ,自前のコンパイルは避けた方が無難である。
×ベンダーのサポートを受けている人
コンピュータ・ベンダーやディストリビュータのサポートを受けている人は,サポート対象のLinuxマシンでカーネル・コンパイルを試みてはいけない。カーネルをコンパイルして導入した段階で,サポート対象外になってしまうことがほとんどだからだ。
カーネル・コンパイルは難しい?
カーネルはその名の通り,OSの核(カーネル)である。すべてのプログラムはカーネルの上で動作する。建築物になぞらえれば「地盤」に相当する。地盤がしっかりしていないと,きちんとした建築物は立たない。そのため,カーネル・コンパイルは重要な作業である。
重要な作業ではあるが,難しいかというと必ずしもそうではない。実際にコンパイルしてみると分かるが,「とりあえず動くカーネル」を作るだけなら, Linux入門者が思っているほど難しいことではない。順を追ってカーネルをコンパイルしてみると,意外に簡単なことに気付くだろう。
カーネル・コンパイルでの“難所”は,「数多くの項目(カーネル・パラメータ)を設定するときの指定内容」と「コンパイル時の依存関係」だろう。
設定項目については,静的に組み込むか,組み込まないか,あるいは動的に組み込むモジュールにするかを選択することになる。この作業は,「設定に迷ったら,モジュールにする」という原則を守れば,それほど難しくはない。Linuxディストリビューションに含まれるカーネルは動的カーネルであり,各種モジュールがあらかじめ用意されている。そのため,新たに生成するカーネルにおいても,モジュールを選択しておけば,それがシステムに必要な場合は適切に組み込まれることがほとんどだ。
依存関係についてもそれほど心配することはない。カーネルのコンパイルは基本的に,既存システムのアップデートである。そのため,カーネルのコンパイル時に必要なソフトは,あらかじめシステムに入っている場合が多い。最初から難しいこと(例えば,カーネル2.4から同2.6にアップグレードするなど)をしない限りは,依存関係は特に心配しなくてよい。
既存のカーネルと併用できる
カーネル・コンパイルに失敗すると,システムが動かなくなることはある。しかし,既に動いていたカーネルを消さないでいれば,そちらから従来通り起動できる。失敗したら後戻り(従来版を使う)することが簡単にできるのだ。
アプリケーションの場合はインストール後に後戻りすることはなかなか面倒だったり,難しかったりするものが少なくない。失敗したときのことを考えると,アプリケーションのコンパイルよりも,カーネル・コンパイルの方が気軽だとさえ言える。
実は筆者がLinuxをインストールして初めてコンパイルしたプログラムは,カーネルだった。その当時と今とでは,カーネル自体の複雑さはけた違いではある。しかし,カーネル・コンパイルの原理は変わらない。失敗したら後戻りすればよいし,それは難しくない。だから,むしろ「コンパイルの入門」としてカーネルのコンパイルにチャレンジしてみると良いだろう。