japan.internet.comThe Internet & IT Network
Twitter
RSS
  • ニュース
  • コラム
  • リサーチ
  • ヘッドライン
  • 特集
  • ブログ
  • プレスリリース
  • 専門チャンネル
  • イベント
  • ランキング
  • ニュースメール
2009年11月24日
文字サイズ文字サイズ小文字サイズ中文字サイズ大
事業仕分けによる次世代スーパーコンピューターの開発予算削減について、どうお考えですか?
賛成
反対
どちらとも言えない
投票締切 11/30 12:00
デベロッパー2007年11月27日 10:00

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

海外海外internet.com発の記事
  • Post to Twitter
  • Post to Facebook
  • このエントリーを含むはてなブックマーク
  • この記事をクリップ!
  • Buzzurlにブックマーク
  • Yahoo!ブックマークに登録
  • newsing it!
  • この記事をokyuuへインポート

はじめに

 衝撃的なニュースをお知らせしましょう。近年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)
  • プリンター用
  • 記事を転送
  • Post to Twitter
  • Post to Facebook
  • このエントリーを含むはてなブックマーク
  • この記事をクリップ!
  • BuzzurlにブックマークBuzzurlにブックマーク
  • Yahoo!ブックマークに登録
  • newsing it!
  • この記事をokyuuへインポート
最新トップニュース
Graphic Design Forum
【Graphic Design Forum】
流動的媒体と静的媒体に関する見解(11月18日)
スマートにソーシャルウェブを構築しよう
スマートにソーシャルウェブを構築しよう
オバマ大統領も絶賛。メイヨークリニックのソーシャルメディアポリシー(11月24日)
アイレップの SEM フロンティア
アイレップの SEM フロンティア
検索技術の進化で広がる SEO 領域―2010年以降に要求される事は?(11月24日)
百式のネットビジネス研究
百式のネットビジネス研究
外国で見かけた標識を写真に撮ると翻訳してくれる iPhone アプリ「PicTranslator」(11月24日)
エンジニア転職ノウハウ開発室
エンジニア転職ノウハウ開発室
エンジニア的「合わない」と思う瞬間/理系の人々(11月24日)
DevX
DevX
HTML 5のフォーム要素(11月24日)
「IT の耳」
「IT の耳」
【書評】『Hyper-V スタートアップバイブル』――仮想化についてのすぐれた解説書(11月20日)
週刊-サイト別アクセス状況データ
週刊-サイト別アクセス状況データ
ビデオリサーチインタラクティブ調査(月間インターネットオーディエンスデータ)(11月19日)
海外ソーシャルウェブに学ぶ成功の秘訣
海外ソーシャルウェブに学ぶ成功の秘訣
ゲーム業界を襲う世界的な激震。ソーシャルゲーム急成長のインパクト(11月19日)
今さら聞けない初歩からのアクセス解析
今さら聞けない初歩からのアクセス解析
サイトリニューアル前のアクセス解析活用法(11月19日)
成約率、反応率を上げる Web 文章術
成約率、反応率を上げる Web 文章術
文章力を磨き、キャッシュを生み出す Web サイト に(11月19日)
Copyright 2009 Japan Internet.com K.K. All Rights Reserved.http://www.internet.com/