Linuxカーネルの開発は,とても活発に行われています。

 バージョン2.6.30は, 3カ月間のうちに1125人の開発者による1万1733件の変更がコミットされました。それにより114万行が追加され, 51万3000行が削除されています。(LWN.netの記事「Developer statistics for 2.6.30」)。

 これほどの大量の変更が行われながら,メンテナンス不能に陥ることなく,逆に近年Linux カーネルの開発にかかわる人は増加しています。これは驚くべきことです。

 Linuxカーネルの開発にかかわっている人の中には,Red HatやIBMといった企業で職業としてカーネル開発を行っている人も多くいます。一方で,プライベートの時間に開発している人もたくさんいます。

 この記事では,Linuxカーネル開発に興味があり,プライベートの時間をつかってカーネル開発に参加してみたいと思っている方を主な対象に,そのきっかけになるようなことを,私の体験を交えて紹介してみたいと思います。

 ここで紹介することを実行するために必要なのはC言語と一般的なOSに関する知識であり,Linuxカーネル特有の特別な知識は必要ありません。ただし,Linuxカーネルに興味を持っていることが重要です。とはいえカーネルの中には色々な機能やライブラリが豊富にあるので,あなたが強く興味を持っている分野は何かしらあると思います。

コードのクリーンアップから始めてみよう

 私は3年前,当時アーキテクチャごとに独自に実装されていたビット演算ライブラリ関数の中で,共通化できるものを統合する「コードのクリーンアップ」を行いました(Linuxカーネル・メーリングリストへの筆者の投稿)。

 きっかけは,いくつかのビット演算関数が,複数のアーキテクチャ依存コードで同じようにコピーアンドペーストされていたのを見つけたことでした。そして,それらの重複したコードを統合する作業を進めるにつれて,どんどん重複したコード見つかっていき,最終的には四千行ものコードを削除することができました。

 さらに,コードを整理したことで見通しが良くなり,バグを見つけやすくなりました。メーリングリストに投稿したパッチをレビューした人が,潜在的なバグを見つけ出したり,ビットカウント関数のより効率的な実装方法の提案を受けたり,といったよい副作用が得られました。コードを整理できただけでなく,元のコードにあった問題を修正したり,改善したりすることができたわけです。

 このようにクリーンアップをしてコードを読みやすく変更することで,コードをより理解できるようになり,さらにバグを見つけたり,問題や改善すべき点が明らかになったりすることがあります。

 クリーンアップには,より敷居の低い「コーディングスタイルを修正する」という作業もあります。コードを理解しなくても作業できるため入門としては最も簡単です。ただし,そのぶん自分自身が得られるものも少ないという短所もあります。

 とはいえLinuxカーネルのコーディングスタイルを理解することは,カーネル開発に参加するために必要なことです。コーディングスタイルについては Linux Foundation のサイトの「Linuxカーネル開発への参加方法 4.1: 落とし穴」で詳しく述べられています。

カーネルのバグを修正してみよう

 バグを修正することもLinuxカーネル・コミュニティにとって非常に重要であるともに,技術者にとってよい勉強になります。

 バグを見つけるには,安定版カーネル(2.6.x.y)や,ディストリビューションで提供されているカーネルではなく,実験的なバージョンを使ってみましょう。Linus氏のgitリポジトリの最新のスナップショットや,linux-nextや,Andrew Morton氏の管理しているカーネルパッチ群である-mmotmなど,こうした実験的なバージョンを積極的に使うと,いやでも何かしらのバグを見つけることになると思います。

 Linuxカーネルにはバグの発見を支援するための機能が多数あります。カーネル・コンフィギュレーションのメニューから「Kernel hacking -> Kernel debugging」とたどると,それらのオプションを見ることができます。

 私は,それらのオプションのうちの一つであるフォルト・インジェクション機能をつかってさまざまなエラー処理のバグを発見しました。

 フォルト・インジェクションとは,わざとエラーを発生させてバグを発見するテクニックです。このテクニックをメモリー・アロケーションに適用し,あるタイミングでわざとメモリー・アロケーションが失敗する仕組みを組み込んで,さまざまなテストを行いました。

 カーネル・バグを発生させ,そのときのログ・メッセージに含まれるバッグトレースとソースコードから原因を探るということを地道に行い,さまざまなエラー処理のバグを見つけることができました。エラー処理のバグは原因が特定できれば,修正方法も簡単な場合がほとんどだったため,多くのバグ修正のパッチをメーリングリストに投稿しコミットされました。

 さらに発見したバグを見直してみると,同じようなパターンに分類できる間違いが多数あることがわかました。それらは注意してソースを読めば見つけられるようなものでした。ほかのさまざまなデバイスドライバのソースコードを見てみると,やはりいくつか同じような間違いをしているものを数多く見つけることができました。それらのバグ修正パッチをメーリングリストに投稿しコミットされました。

 このように一つの問題をみつけたら,その問題と似た問題がひそんでいる可能性が高いので,それらを探してみましょう。もし見つけることができたら,まとめて修正できるかもしれません。

 フォルト・インジェクション開発の経緯,具体的な手法や,上記に述べた間違いのパターンについては筆者が第5回 The Linux Foundation Japan Symposiumで発表しました。詳しくはその際のプレゼンテーション資料をご覧ください(Linux Fault Injection)。

今すぐにできる,始めてみよう

 本稿では,今すぐにでも取り組める,Linuxカーネル開発の入り口を,筆者の経験から紹介しました。

 こうした小さな変更を加えたり,いじったり,バグに遭遇して原因を探ったりしているうちに,ソースコードをただ読んでいるだけでは気付かなかったようなことがわかり,コードの理解が深まってくるでしょう。そうすれば,もっと大きな問題や改善すべきことが明らかになってくると思います。

美田晃伸(みた あきのぶ)
フィックスターズ
美田晃伸(みた あきのぶ) フィックスターズ勤務。主にプライベートの時間にLinuxカーネルの開発を行っている。