ハウツー:自分のシステムに最適なカーネルを構築する

 ディスクの性能を最適化する方法についての記事を書いた後、設定を調整することはシステムの高速化のためにできることの一部に過ぎないというコメントを読者からもらった。つまり、ユーザ自身のハードウェアや必要性にもっとも合うようにカーネルのコンパイルを行なえば、さらにシステムを高速化することができるという指摘だ。カーネルのコンパイルは昔ほど敷居の高いことではなくなっている。最近ではカーネルのコンパイルの手順は簡素化されていて、メニュー形式で提示される選択肢の中から選んだ後、いくつかのコマンドを入力するだけでよくなっている。

 ほとんどのディストリビューションでは、誰にでも使えるように最も汎用的なオプションを用いてコンパイルした、いわゆる「フリーサイズ」的なカーネルが提供されている。しかしIntel 386ファミリーのプロセッサではなくAthlon XP CPUを使用している場合や、大容量のRAMや特定のグラフィックスカードを使用しているといった場合には、自分のハードウェア上で最大限の性能を得るように調整してカーネルをコンパイルすることができる。さらにその過程で、不必要なオプションを除外することによってメモリをいくらか解放したり、ブート時間を短縮したり、システムの反応を良くしたりすることができる可能性も非常に高い。

予行演習

 カーネルのコンパイルはそれほど難しくはないとは言え、マシンが機能しなくなって紙を押えるためにしか利用できなくなってしまう可能性は紛れもなく存在する(これは私の経験上、確かだと断言できる)ので用心する必要がある。したがってカーネルのバックアップを用意するようにしよう。そうしておけば、何か重大なミスをしてしまった場合にも、コンピュータを再起動して再びやり直すことができる。今回はopenSUSEを使用して、2種類の異なるバージョンのカーネルをインストールした。openSUSEでは、YAST管理ツールやSmartパッケージマネージャを使用して、複数のカーネルを簡単にインストールすることができる。今回は2.6.18.8-0.3と2.6.18.8-0.5という2つのバージョンのカーネルを使用したので、ブート画面は次のようになった。

openSUSE 10.2 - 2.6.18.8-0.5 Failsafe -- openSUSE 10.2 - 2.6.18.8-0.5 openSUSE 10.2 - 2.6.18.8-0.3 Failsafe -- openSUSE 10.2 - 2.6.18.8-0.3

 私のマシンは、デフォルトでは上記の3番目の選択肢でブートするようになっている。したがって3番目の選択肢はそのままにしておいて(いざというときに使用するため)、最初の選択肢を使って実験することにした。新しく構築したカーネルに満足することができたときには、標準的なツール(openSUSEの場合であればYASTなど)を使用して、新しいカーネルをデフォルトにすることができる。冒険好きな人は、GRUBやLILOの設定ファイルを手動で編集しても良いだろう。

 なお、kernel-source(コンパイルするソースコード)、gcc(コンパイラ)、bzip2(内部的に必要)、ncurses(設定メニュー用)といったようないくつかのパッケージもインストールしておく必要がある。

 カーネルを最適化するためには、手持ちのマシンのハードウェアについて知っておく必要がある。以下のようなコマンドを使用すれば、マシンが使用しているプロセッサの種類やRAMなどについて知ることができるので、この情報を印刷しておいて作業中すぐに参照することができるようにしておくことをお勧めする。

lspci -v cat /proc/cpuinfo cat /proc/meminfo

 準備ができたと思ったら、まずは特にカーネルの設定を変更しないまま、そもそもカーネルの再構築ができる環境が整っているかどうかを確認してみよう。ルートになって、以下のコマンドを入力しよう。

cd /usr/src/linux make clean make make modules_install make install reboot

>makeの実行にはしばらく時間がかかり、また警告がいくつか表示されるかもしれないが、エラーは出ないはずだ。再起動しても何も問題がなければ、カーネルを再構築してシステムを最適化するための準備が整ったということだ(実際にはもう準備だけでなく、すでに最適化の作業を開始しているとも言える)。例えば何らかのパッケージが欠けていたなどの原因によって深刻な問題が実際に起こってしまった場合には、バックアップのカーネルを使用して再起動して問題を修正し、再びこの「予行演習」を試してみれば良いだろう。

とにかく「M」

 それでは、予行演習でなく、いよいよ本番だ。再びsuを実行してルートになり、以下を入力する。

cd /usr/src/linux make clean make menuconfig

 以上を実行すると、何百個ものオプション(何百通りもの失敗する方法と表現することもできる)のあるメニューが画面に表示されるが、変更するのは数個のみだろう。もちろん冒険心があるなら、万一の場合に備えて予備のカーネルを準備しておきさえすれば、どれでも好きに変更することができる。オプションをオフにしたい場合には、チェックを外せば、コンパイルされなくなる。提供されているオプションを見たりメニュー内を移動したりするには、矢印キーを使用する。また「H」を入力すればいつでもヘルプを表示させることができる。

 Linuxカーネルはモノリシック、すなわち大雑把に言い換えると、すべてが投げ込まれた単一の大きなソフトウェアだ。しかしLinuxカーネルは、必要な場合にのみ起動後に読み込むことのできる「モジュール」を使用して拡張することができる。したがってモジュールとしてコンパイル可能である機能をすべてモジュールとしてコンパイルした場合には、カーネルは最も小さくなる。またその場合の性能は、モジュールが読み込まれる際に一度だけ小さなマイナス影響を受けるだけだ。しかしだからと言ってすべてをモジュールにするのも得策ではない。というのもいくつかの機能は、ブート時に必要になるためだ。例えば、必要なコードがすでにカーネル内になければ、モジュールがあるパーティションからモジュールを読み込むことはできない。したがって、モジュールにすることが合理的である場合には必ずモジュールにするという方針で設定すれば良いだろう。

 モジュールにした方が良いという理由はもう一点ある。それは、使わないだろうと予想されるハードウェア用のサポートのチェックをすべて外した場合に、予想外の問題が起こってしまうことがあるためだ。例えば私自身、LVM AND RAID DEVICE(LVMとRAID)内のオプションのチェックを外した後、このことが原因となって必要なモジュールが構築されず、さらにそのことが原因でその他の数多くの問題が起こったという経験をしたことがある。最も安全なやり方は、不要なオプションは「M」(モジュールとしてコンパイルする)とマークして、必要ではないということが絶対に確実である場合以外には、チェックを外さないようにするという方法だ。例えば、持っていないカードや使わないファイルシステムは通常はチェックを外しても安全だろう。とは言え、何らかのオプションのチェックを外した結果として、二次的で目に付かず文書化もされていないような影響がないという保証はなく、それが原因となって何か問題が起こる可能性はある。その場合には、バックアップしておいたカーネルを使って再起動し、問題のオプションを単に再びチェックすれば良い。

 以下に、メモリをいくらか節約するために検討することのできるオプションを挙げる。

  • 「Networking(ネットワーク)」内では、PCをアマチュア無線につないでいないのであれば、Amateur Radio Support(アマチュア無線のサポート)のチェックを外す。その他のオプションは通常「M」とマークされているので、そのままにしておこう。
  • 「File Systems(ファイルシステム)」内では、すべてが「M」とマークされていることを確認しよう。例えばJFSなどについて絶対に必要にならないということが分かっている場合には、関連するオプションのチェックを外すこともできるが、モジュールとして残しておく方がさらに好ましい。
  • 同じく「File Systems(ファイルシステム)」内で、Partition Types(パーティションのタイプ)のメニューを選んで先に進み、自分に関係のないものはすべてチェックを外す。なお私の場合、自分のマシンにWindowsのディスクがあったため、Windows関連のパーティションのチェックは外さなかった。
  • 「Device Drivers(デバイスドライバ)」内では、各セクションを調べて、手持ちでないデバイスについてチェックを外すか「M」とマークする。SCSIやISDNは、チェックを外すことのできる可能性が高いオプションだ。
  • 「Bus Options(バスに関する設定)」内では、手持ちのマザーボードがEISAやMCAを使用していない場合には、それらのサポートをオフにする。よく分からない場合にはベンダが提供している仕様を確認すると良いだろう。

全速前進!

 PCをサーバとして使用するのではなくデスクトップマシンとして使用する場合、応答速度を向上させるためのいくつかのオプションが用意されている。デスクトップマシン用の設定として以下を推奨する。

  • 「Code Maturity Level Options(コードの完成度レベルについてのオプション)」内で、「Prompt for development and/or incomplete code/drivers(開発中/不完全なコードやドライバについてのオプションも表示)」のチェックを外す。このオプションが必要になるのは、カーネル内の何かを開発したりテストしたりする場合のみだ。
  • 複数のプロセッサがない(デュアルコアプロセッサとクアッドコアプロセッサの場合にも複数のプロセッサと数える)場合には、「General Setup(一般的な設定)」で「Cpuset support(CPUセットのサポート)」のチェックを外す。
  • 2TB以上のディスクを使用していない場合には、「Block Layer(ブロックレイヤ)」で、すべてのチェックを外す。
  • 複数プロセッサやデュアル/クアッドコアプロセッサを使用していない場合には、「Processor Type and Features(プロセッサのタイプと機能)」で「Symmetric multi-processing support(SMPのサポート)」のチェックを外す。「Processor Family(プロセッサ・ファミリ)」で適切なプロセッサを選び、「High Memory Support(大容量メモリのサポート)」で手持ちのRAMの容量を選ぶ。また「Preemption Model(プリエンプション・モデル)」で「Preemptible Kernel (Low Latency Desktop)(プリエンプティブ・カーネル(低遅延デスクトップ))」オプションを選ぶ。さらに「Preempt the Big Kernel Lock(ビッグ・カーネル・ロック(BKL)をプリエンプトする)」にマークする。「Timer Frequency(タイマの周波数)」で1000Hzを選ぶ。
  • 「Kernel Hacking(カーネル開発)」ですべてのチェックを外す(当然ながら、カーネル開発をしない場合にのみ)。

 オプションの選択が完了したら、設定プログラムを終了して(なお新しいカーネル用の設定内容を保存するかと聞かれたときには「YES」と答えること)、以下を実行しよう。

make make modules_install make install

 新しいカーネルに関する問題点を示している可能性のある、予想外のエラーメッセージが表示されていないかを特に注意しよう。また、しばらく時間がかかることを覚悟しておこう。私のノートPCでは、makeの実行には30分以上かかった。エラーメッセージが表示された場合は、メニューに戻ってエラーメッセージが表示されなくなるように再設定に挑戦するか、あるいはあきらめて単にバックアップしておいたカーネルを使い続けることにすれば良い。何が起こったのかが分からないという場合(選択したメニューとエラーとの関係がいつも簡単に把握できるというわけではないため、そういう場合も十分にあり得る)にはいつでも、(前述したようにYASTやSmartを使用して)カーネルを再インストールして最初からやり直すことができる。

 エラーメッセージが表示されなければ、再起動して新しいカーネルを試してみよう。

 私の場合、ブート時間を約10秒削減することができた。また、2メガバイトのRAMを解放することができた。ブート時間の削減は注目に値するほどのものではないが、ノートPCの動きが機敏になったような気がする。――ただしもちろんこれは単なるプラシーボ効果かもしれない。どちらにしても私は、カーネルについて少し詳しくなり、自分の使用状況に合わせてカーネルを最適化して、高速化を探求するうえでの新たな手段を得たことになった。

まとめ

 できるだけ高速なLinuxを手にしたければ、カーネルのコンパイルを恐れていてはいけない。とても勉強になるうえ、最終的にはシステムの性能を改善することができるはずだ。

Linux.com記事募集――謝礼あり

Federico Kerekiはウルグアイのシステムエンジニア。20年に渡るシステム開発、コンサルティング、大学講師の経験がある。

Linux.com 原文