japan.internet.comThe Internet & IT Network
RSS
  • ニュース
  • コラム
  • リサーチ
  • ヘッドライン
  • 特集
  • ブログ
  • プレスリリース
  • 専門チャンネル
  • イベント
  • ランキング
  • ニュースメール
2008年10月7日
文字サイズ文字サイズ小文字サイズ中文字サイズ大
デベロッパー コラム2007年11月27日 10:00
EnterpriseNetworkingPlanet
EnterpriseNetworkingPlanet japan.internet.com 編集部メールホームrss
米国 Jupitermedia が運営する、ネットワークマネージャー向けの専門サイト。

Linux:カスタムカーネルでスリム化とパフォーマンス向上を実現

海外海外internet.com発の記事

はじめに

 衝撃的なニュースをお知らせしましょう。近年Linuxは目覚しい普及を遂げていますが、そのなかで、これまで一度もカーネルをコンパイルしたことがないという新しい世代のLinuxユーザーが出現しているのです。この嘆かわしい事態を一体どう説明すればいいのでしょうか? 原因はおそらく、ディストリビューションメンテナーがこの作業を完璧に済ませてしまい、個々のユーザーが行う必要がなくなっているからだと思われます。あるいは、自分でもできるということをユーザーが知らないだけかもしれません。原因の究明はさておき、今回の記事ではLinuxカーネルをカスタマイズするさまざまな方法の一部を取り上げ、紹介していきます。まず、以前から一般的に使用されている信頼できる方法について説明し、その後でFedoraおよびDebianでカーネルをカスタマイズする方法を紹介します。

 カスタムカーネルの構築はそれほど難しい作業ではありませんが、複雑で時間がかかります。最後まで終えたあかつきには、非ブートカーネルのコンパイルをやり遂げたと言って大きな顔をしてもいいでしょう。ありがたいのは、システムを壊すことを恐れずに何回でも好きなだけやり直しができる点です。どのLinuxシステムでも複数のカーネルを持つことができ、どのカーネルを使ってブートするかを選択できます。したがって、古いカーネルを削除するのは、新しいカーネルが正しく動作することを確認してからにしてください。明示的に設定しなければ新しいカーネルにブートすることはないので、知らないうちに新しいカーネルが使われてしまうおそれはありません。したがって、新しいカーネルをいくつでも好きなだけビルドし、テストすることができます。

 作業用に数ギガバイトのディスク空き容量を確保してください。これはカーネルソースを格納したりツールや他のユーティリティをビルドしたりするのに必要になります。その他に、ビルド中に作成される中間ファイル用に500メガバイト、また、新しいカーネルやカーネルモジュールを保存する場所も必要です。

 ハードウェア情報が必要になる場合があるので、lshwコマンドとlspciコマンドをインストールします。まず、update-pciidsコマンドを実行し、情報を最新の状態にします。cat /proc/cpuinfoを実行すると、CPUの仕様が表示されます。

カーネルを自分でコンパイルする理由

 なぜ、こんな作業が必要なのでしょうか? 理由はいくつか考えられます。たとえば、カーネルを自分でコンパイルすることにより、追加の機能を利用したり、不必要な機能を削除したり、パフォーマンスを向上させたりできます。さらに、新しいパッチのテストに役立つから、あるいは単にその方法が知りたいだけ、という理由も考えられます。特に、最後に挙げた2つの理由は大切です。私は、どんな人にも常に好奇心と向上心を持っていてほしいと思っています。

 広く使用されている汎用Linuxのほとんどは、すべての人を満足させるために、ありとあらゆるハードウェアをサポートするカーネルとモジュールを備えています。その結果、カーネルとモジュールが200〜300メガバイトにもなり、システムが肥大します。これは、セキュリティ上の懸念をもたらしますし、中にはバカげてるとしか言いようがない機能もあります。たとえば、赤外線、アマチュア無線、そしてデスクトップコンピュータには無用の数々のラップトップ用機能などです(この3つは、私が個人的に考える三大役立たず機能です)。そもそも、なぜこのような「贅肉」がついているのでしょうか? 自分のCPU用にカスタマイズされ、必要なハードウェアや機能だけをサポートするカーネルをビルドするのは楽しい作業ですし、それによってパフォーマンスの向上も期待できます。

一般的な方法でカーネルをカスタマイズする

 最新のカーネルとパッチはKernel.orgから取得できます。ここには、修正されていないオリジナルのカーネルがあるので、「バニラカーネル」と呼ばれます(「プレーンなバニラ味のカーネル」の意味)。次に、ビルド環境を用意する必要があります。この作業は、FedoraとDebianを使用すれば簡単です。Fedoraでは、Development Toolsパッケージグループをインストールします。

# yum groupinstall 'Development Tools'

 QTも必要です。

# yum install qt-devel

 Debianでは、次のコマンドを使用します。

# aptitude install build-essential libqt3-mt-dev qt3-dev-tools

 解凍されていないソースtarballにあるDocumentation/Changesファイルには、ビルド環境に必要なアプリケーションの基本リストがあります。実際、カーネルのtarballのドキュメントには大量の情報が格納されているので、ぜひ時間をかけて調べてみてください。

 新しくダウンロードし解凍したカーネルソースは、/usr/srcに置かないでください。この/usr/srcに置くよう指示する人もいますが、その指示に耳を傾けてはいけません。ソースツリーを保存するディレクトリをホームディレクトリに作成します。カーネルのREADMEファイルでは、次のように説明しています。

「...カーネルのtarballを、自分が権限を持つディレクトリ(たとえば自分のホームディレクトリ)に置いてください.../usr/src/linux領域は使用しないでください! この領域には、ライブラリヘッダーファイルによって使われる一連のカーネルヘッダー(大抵は不完全)があります。これらはライブラリと一致する必要があり、“本日のカーネル”が何であっても混乱してはなりません。」

 私の場合は、「/home/carla/kernel」を使用します。

パフォーマンス

 tar zxvf linux-2.6.22.tar.bz2というコマンドでカーネルのtarballを解凍します。もちろん、解凍の際は正しいバージョンを使用してください。次に、最上位のカーネルソースディレクトリに移動して、お気に入りのテキストエディタでMakefileを開きます。そして、EXTRAVERSION = lineを、一意の任意のテキストに変更します。たとえば、EXTRAVERSION = .1-carlaに変更してください。

 次に、makeコマンドのオプションを見てみましょう。

$ make help

 これにより、たくさんの情報が示されます。ひととおり目を通してみてください。Makefile自体の中身も見てみましょう(このファイルはプレーンテキストファイルです)。その後で、カーネルの初期化を行います。

$ make mrproper

 make helpの出力に目を通すと、このコマンドの機能を把握できます。この段階で欠かせない作業ではありませんが、最初にざっと見ておくと安心ですし、有益な情報を得られることもあります。

 さて、これからが楽しい作業です。新しいカーネルの内容構成を行います。

$ make xconfig

 図1のような画面が表示されます。

図1
図1

 この作業にはかなり時間がかかります。カーネルソースツリー内に構成ファイルがない場合、あるいは構成ファイルを意図的に用意していない場合は、xconfigは「/boot/config-2.6.*」ファイルを使用します。これは良い叩き台になります。とにかく、何でも好きなように変更してかまいません。[ヘルプ]ボタンをクリックして、xconfigの使用方法を確認してください。このヘルプでは、すべての構成オプションの説明が示されています。

 満足のいく構成ができたら、オプションを指定せずにmakeコマンドを実行します。この処理には1時間かそれ以上かかるかもしれません。次に、ルートに移動して、以下のコマンドを実行します。

# make modules_install
# mkinitrd -o /boot/initrd-2.6.22.img
# cp ~/kernel/linux-2.6.22/arch/i386/boot/bzImage /boot/vmlinuz-2.6.22
# cp ~/kernel/linux-2.6.22/System.map /boot/System.map-2.6.22

 arch/i386/boot/bzImageが新しいカーネルです。これを/bootディレクトリにコピーする必要があります。さらに、対応するSystem.mapをコピーします。新しいinitrdイメージは既にその場所にあるはずです。

 これらすべてをGRUBメニューに追加し、リブートし、試してみます。menu.lstエントリの例を以下に示します。

title homebrew 2.6.22 kernel 
root (hd0,0)
kernel /boot/vmlinuz-2.6.22 
root=UUID=b099f554-db0b-45d4-843e-0d6a1c43ba44 ro
initrd /boot/initrd-2.6.22.img

 カーネルの名前とinitrdイメージの名前は任意です。menu.lstのエントリが一致してさえいれば、何でも好きな名前を付けることができます。GRUBはゼロからカウントするため、最初のハードディスクドライブ上の最初のパーティションである「/dev/hda1」は、menu.lstの(hd0,0)と同じです。

 ルートパーティションのUUIDは、blkidコマンドで取得できます。

$ blkid
/dev/sda1:UUID="b099f554-db0b-45d4-843e-0d6a1c43ba44" 
SEC_TYPE="ext2" TYPE="ext3"
/dev/hda1:UUID="1a5408ad-7d1d-4e24-b9db-d132d76e9e8e" 
SEC_TYPE="ext2" TYPE="ext3"

 最近のudev時代では、ブロックデバイスを特定するときにUUIDを使用する必要があります。/devの名前は静的ではなく、udev次第だからです。ブートが完了するまで/devディレクトリには何も入らないため、initrdイメージを作成する必要があります。したがって、(私の知る限りでは)ブートデバイスをカーネルに組み込むことはできません。

 次回は、DebianおよびFedoraでカーネルをカスタマイズする方法と、数々のカーネルコンパイルオプションの一部を紹介します。

参考資料

著者紹介

Charlie Schluting(Charlie Schluting)
海外のインターネットコムアメリカ韓国ドイツトルコ
Copyright 2008 Jupitermedia Corporation All Rights Reserved.http://www.internet.com/