原文は 1 月 12 日に掲載されました。原文へのリンクはこちらです。
本記事の筆者、Konrad Zapalowicz は Cybercom Poland のソフトウェア開発者で、どちらかと言えば新しい Linux カーネル貢献者ですが、同時にランナーでもあります。彼の Web サイトは zapalowicz.pl です。
私は昨年デュッセルドルフで開催された Linux Con Europe において、Linux カーネル開発に参加するのがいかに容易かを人々に伝えるための講演を行いました。このテーマを退屈と感じるくらい聴衆が上級者だったらどうしようという私の心配をよそに反響は良く、このようなガイドラインやアドバイスは大歓迎だという意見を多数頂きました。会場の最大収容人数は約 30 名で、あまり大きな会場ではありませんでしたが、このテーマに関心を持ってくださる方が世の中にもっといるのではないかと感じています。そこで私はこのプレゼンをシリーズ記事にしようと決めました (Events.LinuxFoundation.org のプレゼンの全容を参照)。
記事は、講演と同じく 3 部に分けます。あまり技術的でない最初の記事では、Linux カーネル開発は、正しい姿勢で臨みさえすればとても簡単であることを説明します。2 番目の記事では、初心者向けに、Linux カーネル開発のどこでインスピレーションを受け、どの切り口からアプローチするのが良いかを示します。そして最後の 3 番目の記事では、私がカーネル開発を始める前に知っていたら良かったと思うことを説明します。
4 つの神話
どういうわけか、Linux のカーネル プログラミングそのものや Linux カーネル開発者になるために必要な努力について、否定的な意見や神話があります。具体的には次のようなものです。
- Linux カーネル プログラミングは難しく、特別な技能が必要
- Linux カーネル プログラミングをするには特別なハードウェアへのアクセスが必要
- Linux カーネル プログラミングへの参加の余地はほとんどない。なぜなら、既にすべてのドライバーの開発が済んでしまっている
- Linux カーネルプログラミングは時間がかかる
これらについて詳細に見ていきましょう。
神話 #1: Linux カーネルプログラミングは難しく、特別な技能が必要。
この考え方は、多くの人、特にカーネル内部のきちんとした知識のない人たちが、プロジェクト全体を 1 つの大きなコードの塊、実際にはオペレーティングシステム全体として見る傾向があることに起因しています。オペレーティングシステムを書くことは非常に大変な仕事であり、多面に渡るトピックに関する深い知識を必要とすることは周知の事実です。通常これは単なる趣味でやれるようなものではなく、十分に準備をして行うべきことです。トップレベルの Linux カーネル開発者を見ても何の参考にもなりません。なぜなら、彼らには何年もの経験があり、彼らを基準に自分の技能を判断すると、実際に特別な技能が必要だと信じるようになってしまいます。
神話 #2: Linux カーネル プログラミングをするには特別なハードウェアへのアクセスが必要。
Linux Foundation のエグゼクティブ ディレクター Jim Zemlin は、LinuxCon の基調講演の中でオープン ソース ソフトウェアが電子機器の 80% に搭載されていると語っています。史上最大のオープン ソース プロジェクトである Linux カーネルは、この大きな部分を占めています。実際 Linux カーネルは、これまで開発されたこの規模のソフトウェアの中で最も移植性が高く、しかも膨大な各種のハードウェアをサポートしています。このことから、カーネル開発の作業の多くは Linux を各種デバイス上で動作させる仕事で、ありふれたデバイスは既にサポートされているため、開発者として成功するには変わったハードウェアにアクセスできないなければならないという印象を持つかもしれません。
神話 #3: Linux カーネル プログラミングへの参加の余地はほとんどない。なぜなら、既にすべてのドライバーの開発が済んでしまっている。
Linux カーネル プログラミングについてよくある印象は、さまざまな種類の周辺機器のためにドライバーを開発するというものです。実際、現在のプロフェッショナルなカーネル ハッカーはドライバーの開発によって Linux のキャリアをスタートさせています。しかし、Linux カーネルのもたらす移植性のために、サポートされていないデバイスを見つけるのは難しいように思われるかもしれません。周辺機器の大多数を占めている USB デバイスに目を向けてみても、それらの大半は既にサポートされているか、libusb を使ってユーザー スペースから問題解決を行った方が良く、結果的にカーネル開発の作業は必要ありません。
神話 #4: Linux カーネル プログラミングは時間がかかる。
LKML や driverdevel リストのようなカーネル関連のメーリング リストを読んでいると、週ごとに送られるパッチの数の多さに気づきます。たとえば comedi ドライバーの開発作業は、多数のパッチを含んだパッチ セットを作り出しています。これは明らかに誰かが一生懸命に開発作業に取り組んでいることを示していますが、そうした例は comedi ドライバに限ったことではありません。カーネル開発を日常の職務ではなく、趣味にしようと考える人には、このような開発ペースは不可能で、ついていけないと感じるかもしれません。
事実
これらが 1 つでも重なっても、Linux カーネル開発への参加を試行してみるか、諦めてしまうかの選択の間に太い線を引いてしまうかもしれません。これは特に経験の少ない個人に言えることで、結果的に試行することさえも恐れてしまいます。しかしながら、実際はダンテが言うように「悪魔は描かれているほど黒くはありません (物事は見た目ほど悪くはない)」。これらの神話はすべて消し去ることができます。一つ一つ見ていきましょう。
事実: Linux カーネルのプログラミングはとても簡単です。
カーネル コードは複雑性の高い 1 つの塊と見られがちですが、この塊は高度にモジュール化されています。スケジューラーのように一部のモジュールは取っ付きにくい塊と言えますが、複雑性の低い分野もあり、実際はメンテナンス タスクを容易にするためのものなので、必要とされる技能は C 言語に関する正しい知識だけなのです。
誰もがカーネル コア モジュールを再設計する必要はなく、他にもやらなければいけない仕事はたくさんあります。たとえば初心者の仕事としてよく言われるものは、コード スタイルの問題やコンパイラーの警告を修正してコードの質を改善することです。
事実: 特別なハードウェアは必要ありません。
一部の開発作業には、古い x86 もまだ十分に使えますし、このアーキテクチャは今でもかなり人気があるため、ほとんどの人にとっては十分以上だと言えるでしょう。さらに多くのことを求める人は、PandaBoard、BeagleBone、または RaspberryPi などの安価な ARM ベースのボードを購入すればよいでしょう。
事実: 開発への参加の余地はあります。やるべき仕事はあるのです。
まず知らなければならないことは、Linux カーネルはドライバーだけではなく、コア コードにも開発作業があるということです。2番目に、まだ完成しなければならないドライバーは非常に多くあり、この分野での支援は非常に感謝されます。
事実: 必ずしも時間をかけなければならないわけではありません。
カーネルの開発作業を行っている人というのは、その人が望む分だけの時間を作業に割り当てます。日常の職務ではなく、情熱のみによって作業を行っている人は、1 週間のうち数回の夜の時間だけを使って作業しますが、それでも十分な貢献になっています。私は 1 日おきに日中 (もしくは夜) ランニングしていた時期にカーネル開発への貢献を始めました。その間にも自分のアパートの完全なリフォームも行い、休日には旅行に出かけ、2014 年のワールド カップとバレーボール世界選手権のほとんどの試合を見ました。カーネルの作業にかける時間はあまり残っていませんでしたが、それでも何件かのパッチを送ることができました。
覚えておかなければいけない重要なことは、賃金を受け取っているのでなければ、プレッシャーもないし、急ぐ必要もありません。楽に構えてできる範囲のことをすればよいということです。
新しい考え方
今回のシリーズの第一回目では、多くの人にカーネル プログラミングを奨励することを目的にしました。難しいように思えていたことが実はとても簡単にできることだと説明して、完全な発想の転換をはかりました。以下のことだけは覚えておいてください。
- Linux カーネル プログラミングはとても簡単。
- 特別なハードウェアへのアクセスは必要ない。
- やらなければならない仕事はまだたくさんある。
- 自分が望む分だけ、可能な分だけ時間を割り当てればよい。
これらの知識を身に付けて次の記事に進みましょう。次回は、Linux カーネル開発のスタート地点になるものを見極める力をつけます。
このブログは Zapalowicz.pl の許可を得て再掲載しています。