進歩する Linux カーネル

バージョン 2.6.28 と 2.6.29 での新機能を紹介する

人生において、死が訪れたり、税金の支払いをしたりするのが確実であるように、GNU/Linux® オペレーティング・システムも確実に進歩しています。そして最近の 2 つのカーネル・リリースも、期待を裏切るものではありません。2.6.28 リリースと 2.6.29 リリースには驚くほど大量の新機能が含まれています (例えば、最先端のエンタープライズ・ストレージ・プロトコル、2 つの新しいファイルシステム、WiMAX ブロードバンド・ネットワークのサポート、ストレージの完全性のチェックなど)。なぜ今新しいカーネルのバージョンにアップグレードする必要があるのかを学びましょう。

M. Tim Jones, Consultant Engineer, Emulex Corp.

M. Tim JonesM. Tim Jones は組み込みソフトウェアのエンジニアであり、『Artificial Intelligence: A Systems Approach』、『GNU/Linux Application Programming』現在、第 2 版です) や『AI Application Programming』(こちらも現在、第 2 版です)、それに『BSD Sockets Programming from a Multilanguage Perspective』などの著者でもあります。技術的な経歴は静止軌道衛星用のカーネル開発から、組み込みシステム・アーキテクチャーやネットワーク・プロトコル開発まで、広範にわたっています。また、コロラド州ロングモン所在のEmulex Corp. の顧問エンジニアでもあります。



2009年 3月 24日

2008年の年末に、2.6.28 カーネルがリリースされました。その結果、次のリリース (2.6.29) へのマージ・ウィンドウが開かれました。Linux カーネルは分散開発プロセスを使用しているため、あるカーネル・リリースに何が含まれるのか (あるいは統合されるのか) は必ずしも明確ではありませんが、この 2 つのバージョンは短期的な観点からも長期的な観点からも興味深いものです。2.6.28 での興味深いマイルストーンの 1 つは、Linux のソース・コードが初めて 1000 万行を超えたことです (図 1 を参照。この図は Heise Online によるソース行カウント・データを引用したものです)。

図 1. 最近の 2.6 カーネルのソース・コードの行数
最近の 2.6 カーネルのソース・コードの行数

この 2 つのリリースで導入された機能には、新しいファイルシステム (1 つは安定しており、1 つは実験的なもの)、グラフィックと仮想化に対する新たなサポート、そして新しいエンタープライズ・ストレージ機能があります。この記事では最初に 2.6.28 での主な新機能をいくつか紹介し、次に 2.6.29 ではどんな機能が期待できるかを説明します。

2.6.28 では何が新しいのか

Linux カーネル 2.6.28 は 2008年12月24日にリリースされました (2009年2月初めの時点ではリリース 5 です)。この 2.6.28 の最初のリリースには大量の変更が含まれています。あまりにも変更が大量なため、変更ログのテキスト・ファイル自体が約 6MB ものサイズになっています。このリリースは非常に安定したものと見なされており、次期 Ubuntu ディストリビューション (バージョン 9.04、Jaunty Jackalope) のカーネルに採用されています。

第 4 世代拡張ファイルシステム

第 4 世代拡張ファイルシステムは ext4dev から ext4 に名前が変更されました。これは普通に使用できるほど ext4 が十分に安定していることを意味しています。ext4 は現在利用可能な標準の ext3 (第 3 世代拡張ファイルシステム) ファイルシステムの後継ですが、より優れたパフォーマンスと機能、信頼性を備えています。ext4 ではエクサバイト (EB) 規模のファイルシステムが許容されているため、より大量のファイル、より大きなファイル、より深いディレクトリー構造をサポートすることができます。また、エクステントが採用されており、マルチブロック・アロケーションと遅延アロケーションによってパフォーマンスが向上されています。ext4 には前方互換性と後方互換性があるため (つまり使用される機能によっては ext4 ファイルシステムを ext3 ディスク・フォーマットにマウントすることができ、その逆も可能です)、ファイルシステムを ext3 から ext4 に移行する際には大量の変更をオンラインで徐々に行うこともできます。ext4 ファイルシステムに関する詳細は「参考文献」を参照してください。

ext4 は今後しばらくの間 Linux の新しい標準ファイルシステムになるはずですが、さらにスケーラビリティーや機能が優れた他のファイルシステムも登場しつつあります。そうしたファイルシステムの 1 つである Btrfs が実験的な形で 2.6.29 カーネルで使用できるようになっています。Btrfs は Linux 互換のファイルシステムであり (GNU Public License [GPL] を読んでください)、よく知られている ZFS に匹敵する機能を持っています。

Graphics Execution Manager によるメモリー管理

昨年の間に確実に改善された領域の 1 つが Linux のグラフィック・スタックです。驚くにはあたりませんが、この領域では GPU (Graphics Processor Unit) によって描画の支援が有効に行われています。多くの場合、GPU が支援する対象の CPU (Central Processing Unit) よりも GPU の方が強力です。

現在そして今後の GPU をサポートするために Linux のグラフィック・スタックで改善が必要であった領域の 1 つが、バッファー管理、ページ・マッピング、メモリー内での配置、キャッシュなどのメモリー管理です。グラフィック・アプリケーション、特に 3 次元アプリケーションは膨大な量のメモリーを消費するため、メモリー管理の改善が必要なのです。GEM (Graphics Execution Manager) はカーネルの中にも入り込むグラフィック・データを既存のカーネル・サブシステムを使って管理できるため (例えば共有メモリー・ファイルシステム (shmfs) を使ってグラフィック・オブジェクトを管理するなど)、メモリー管理に有効です。

ブート・トレーサー

Linux のブートに必要な時間は長年にわたって短縮されてきましたが、それでも時間がかかりすぎると思われています。そのため、ブート時間は相変わらず検討対象となっています。この 2.6.28 カーネルには、init 呼び出しのタイミングを測定して記録する新機能が含まれています。記録されたタイミングを、後でブート・プロセスのフローやパフォーマンスを視覚化するために使用することができます。このプロセスは構成可能です (データの収集を有効にする必要があります) が、いったんデータが収集されると、(グラフィカルな記述を含めた) オフラインのスクリプトを使ってデータを分析することができます。これは最終的にブート時間の短縮とブート・プロセスの最適化につながります。この 2.6.28 で行われた更新では呼び出しスレッドの PID (Process IDentifier) もサポートされているため、ブート・プロセスの並列動作を表示することもできます。

フリーザー

新しいホストに移行する場合 (例えば仮想マシン、つまり VM を移行する場合など) にオペレーティング・システムを一時停止するという概念に基づき、フリーズ機能 (そして解凍機能) という新しい機能がサポートされています。この新機能を利用すると、タスク・グループまたはファイルシステムをフリーズさせ、その状態を保ち、後でそれを解凍してそのタスク・グループまたはファイルシステムを復帰させることができます。

タスクのフリーズはコンテナーのコンテキストで行います。コンテナーはユーザー空間レベルでオペレーティング・システムを仮想化する仕組みです (1 つのカーネルが複数のユーザー空間をサポートします)。この新機能は一連のプロセスをホスト間で移植するのに向けた一歩であり、ロード・バランシングに非常に有効です。またファイルシステムをフリーズさせてスナップショットを取り、バックアップ用に利用することもできます。現状でファイルシステムをフリーズさせるには、引数 FIFREEZE または FITHAW を指定して ioctl を実行します。

コンテナー以外の使い方としては、このフリーズ/解凍の仕組みをチェックポイント機能に使用することができます。この使い方では、関連プロセスの集合を特定の周期 (チェックポイント) でフリーズし、ある特定のエポックを解凍することで既知の適切な状態にロールバックすることができます。

仮想メモリーのスケーラビリティーの改善

仮想システム (特に、多くのプロセッサーと大量のメモリーを備えたシステム) で Linux が使われることが多くなるにつれ、メモリーをスケーラブルに使用できる機能がパフォーマンスにとって非常に重要になってきます。カーネル 2.6.28 ではメモリーに関するスケーラビリティー向上のための機能強化がいくつか行われています。例えばこのカーネルでは、LRU (Least Recently Used) リストとして、ファイルが使用したページに関するリストとスワップで使用されたページに関するリストとを別々に保持しています。そのためカーネルは、スワップで使用されたページ (ディスクに書き込まれる可能性が高いページ) に焦点を絞ることができ、ファイルが使用したページを気にせずにすむことになります。

もう 1 つの変更点として、回収可能なページと (mlock によってロックされたページのように) 回収不可能なページとを区別することができます。そのため、LRU リストにある回収不可能なページに対して pageout コードを使って繰り返し処理を行う必要がなくなり、大量にページがあるシステムのパフォーマンスを改善することができます。


ディスクに関する改善

2.6.28 カーネルにはディスクに関する改善がいくつか含まれています。このセクションでは特に、SSD (Solid State Drive) の使い方が改善されている点と ATA デバイスに対する保護について詳しく説明します。

SSD のサポートの改善

SSD は回転媒体による従来のドライブよりもディスクのパフォーマンスを改善する素晴らしい方法です。SSD は遅延が少なく、ランダム読み出しに優れており、しかも消費電力やノイズは小さくなっています。しかし SSD はハードディスク・ドライブ (HDD) とは根本的に異なるため、SSD を活用するためには Linux に変更が必要です。また SSD には、SSD の中にあるフラッシュのブロックに対して行う必要があるウェア・レベリングによって SSD の寿命が短くなる可能性があるという根本的な問題があります。この影響を軽減するための 1 つの方法は、(例えばファイルが削除されたことによって) あるブロックがもはや有効でなくなったことを SSD に伝えることです。あるブロックが SSD の中で解放されると、そのブロックはウェア・レベリングの対象から外され、その結果デバイス全体としての劣化を最小限にとどめることができます。しかしこの動作をサポートするためには、この情報に関してファイルシステムがドライブと通信できなければなりません。

T13 標準化委員会は ATA プロトコルを新たに拡張し、この通信を trim コマンドによって行えるようにしました。SSD がこの新しいコマンドを受信すると、SSD は指定されたブロックを解放リストに追加し、その後はウェア・レベリングの目的でそのブロックを移動する必要がなくなります。このための Linux ブロック・レイヤーのコンポーネントである破棄リクエストは、上位レベルのファイルシステムでのファイル削除の結果呼び出されます。破棄リクエストはブロック・レイヤーの一部としてブロックを破棄する手段であり、それによって trim コマンドをサポートする ATA ドライブに trim コマンドが実行されることになります。さらに機能強化された点として、破棄リクエストをインテリジェントにスケジューリングすることができます。例えば他のリクエストと合体させたり、あるいはブロック・リクエストのキューに入れられている操作の実行順を並び替え、関連する破棄リクエストと書き込みリクエストをうまく扱えるようにしたりすることもできます。

ATA HDD に関する改善

ATA HDD の信頼性に関する非常に興味深い改善点として、ラップトップ・コンピューターの HDD を破壊する恐れのある衝撃や急激な揺れに対する保護が挙げられます。ATAPI 仕様では IDLE IMMEDIATE というコマンドが定義されています。このコマンドは HDD をアイドル状態にし、ディスク・ヘッドを待避位置に移動してヘッドがプラッター (ディスク) にぶつかるのを防ぎます。カーネルでこのコマンドを使用するためには /sys/block/*/device/unload_heads という proc ファイルを使います。このファイルに値が書き込まれ、それに続いて対象のディスクに ATA コマンドが書き込まれると、ヘッドは待避位置に移動され、すべての I/O (input/output) 処理はタイマーに設定された短い時間遅延させられます。設定された時間が経過すると、I/O 処理は通常どおり再開されます。この機能は、以前は IBM のラップトップ・コンピューターに実装されていたもので、そこでは加速度計を利用することで (ラップトップが落下中かどうかを判断するために) 加速度を測定していました。このプロセスの一般的な流れを示したものが図 2 です。

図 2. ATA ハードディスクを保護するための一般的なプロセス
ATA ハードディスクを保護するための一般的なプロセス

次の 2.6.29 には何があるのか

2.6.28 にはいくつかの便利な新機能が含まれていますが、2.6.29 ではさらに改善が行われています。

Btrfs

2.6.29 で進歩した点のなかで最も重要なものは、元々は Oracle で開発された Btrfs (つまり B-tree FS) が追加されたことです。Sun の ZFS に対抗して開発された Btrfs は、ディスク上のデータの完全性を保証するとともに大規模なスケーラビリティーを備えたファイルシステムを構築するために使われます。ext4 が持つ数々の高度な機能に加え、Btrfs ではオブジェクト・レベルのミラーリングとストライピング、コピー・オン・ライト機能、スナップショット (そしてスナップショットのスナップショット)、データの完全性、そして内部圧縮機能をサポートしています。Btrfs は、最大 16 エクサバイトのサイズのボリュームとファイルをサポートし、また指定されたボリュームの中で最大 264 個のファイルをサポートします。また、ファイルシステムの変換を支援しており、ext3 から Btrfs にファイルシステムをアップグレードすることもできます (逆変換もできますが、変換を行った時点の状態のみへの逆変換になります)。

Btrfs は、オンライン修復によるフォルト・トレランスや管理の単純化といった機能を備えているため、大規模なエンタープライズ・ファイルシステムのための新しい標準となる可能性があります。Btrfs はまだ実験的なもの (そして検討用以外にはまったく不適切) ですが、将来のスケーラブルな Linux ストレージにとって理想的な一連の機能を備えています。

ネットワークに関する変更

さまざまなネットワーク・ドライバーに対する大量の更新に加え、注目に値する機能強化がいくつか行われています。その第 1 がネットワーク送信の負荷を軽減する Generic Receive Offload インフラストラクチャーです (Generic Receive Offload は Large Receive Offload と似ていますが、プロトコルに依存しません)。

また、BCN (Backward Congestion Notification: 逆方向輻輳通知) もサポートされています。BCN はメッセージングによって制御ループを積極的かつ厳密に制御することで輻輳管理を改善しています。この機能は新しいデータ・センターでのイーサネットに必須です。

同じく重要な機能として、2.6.29 では WiMAX ワイヤレス・ブロードバンドのネットワーク・スタックが Linux に導入されています (現在は i2400m USB ドライバーをベースにしています)。これはいわゆる Wi-Fi とは異なることに注意してください。WiMAX は、免許が交付された周波数帯を使ってポイントツーポイント接続を行い、サービス品質も改善されています。

カーネル・モード設定

カーネル・ブート・プロセスとグラフィック・モードに対する表面的な変更として興味深いものは KMS (Kernel-based Mode Setting: カーネル・モード設定) です。この機能を利用すると、カーネルは必須コンポーネント (例えば PCI バスやグラフィック・カードなど) を初期化した後で、グラフィックのハードウェアを制御することができます。そのためカーネルはブート・プロセスの非常に早い段階から必要な画面解像度を設定することができ、(グラフィック・チップがリセットされることによる) チラツキの問題や表示が出ないといった問題が軽減されます。また X サーバーが起動される前に表示を適切に設定することができます。

KMS の他の利点として、サスペンド後の再初期化が改善されます (初期化はカーネルの中で行われるため、はるかに効率的に行えるようになります)。最後に、カーネルがグラフィック・チップを管理するため、ルート権限で X サーバーを実行する必要がなくなる可能性があり、潜在的な攻撃対象が減るためオペレーティング・システムが一層強固になります。


今後の方向

この記事の執筆時点で 2.6.29 は安定化の段階にありますが、2.6.30 に向けての作業は続けられています。ここで説明した内容の他にも 2.6.29 では Squashfs (読み取り専用のファイルシステム) がいよいよ主流のカーネルに採用されようとしており、パス名ベースの強制アクセス制御のための一連のセキュリティー・フックも含まれるはずです。また標準的な DIF (Data Integrity Field) として T10-DIF を使ったディスク上での完全性チェックに加え (一部のドライブは T10-DIF に対応しており、ドライブ全体の静止時の完全性チェックを行います)、新しいプロトコルである FCoE (Fibre Channel over Ethernet) もカーネルに採用されることになっています。

このように、Linux は進化を続けており、新しい機能が追加され、スケーラビリティーが改善され、そしてセキュリティーが高められています。シングルモルトのスコッチと同様、Linux は年を経るにつれて良いものになっていきます。カーネルに対する他の変更や今後の機能に関する資料については、「参考文献」セクションのリンクを参照してください。

参考文献

学ぶために

  • ext4 の徹底調査」(developerWorks、2009年2月) では第 4 世代拡張ファイルシステムの高度な機能を学ぶことができます。ext4 はデスクトップ Linux システムの新しい標準となろうとしています。スケーラビリティーと効率が共に要求される非常に大規模なストレージ・システムでは Btrfs の方に将来性があるかもしれません。Btrfs の詳細は Btrfs のウィキで学ぶことができます。
  • GEM (そして GEM よりも古い TTM) について、lwn.netMemory management for graphics processors で学んでください。グラフィックス・プロセッサーが進化し、グラフィックス・システムに新たな要求が加わるにつれ、それらを管理するための新しい方法が必要になります。従来は汎用のメモリー管理用の TTM (Translation Table Map) が使われていましたが、新しい GEM を使用することでメモリー管理のパフォーマンスを改善することができます。GEM は共有メモリー・サブシステムを使ってオブジェクト管理を行います。共有メモリー (/dev/shm) とその使い方について学ぶためには、/dev/shm に関する、この実践的なチュートリアルを参照してください。
  • この新しいカーネル追跡オプションを使用すると、Linux のブート時間を測定し、改善することができます。Linux のブートがどれほど速くなっても、遅すぎると不満を言う人が必ずいるようです。幸いなことに、そうした不満を言わない人はブート時間の改善方法を見つけることができます。ブート・プロセスのどこに時間がかかっているかを測定することはブート時間を最適化するための第一歩です。
  • ウェア・レベリングの 2 つの側面を「Linux フラッシュ・ファイルシステムの徹底調査」(developerWorks、2008年5月) で学んでください。ウェア・レベリングは SSD で使われているフラッシュのための重要な機能です。ウェア・レベリングでは、ディスク上で (例えば削除されたことにより) 既に必要なくなったブロックを破棄できる機能が必須です。ATA にはディスク・レベルの新しいコマンドとして、SSD 上で破棄を行うための trim と呼ばれるコマンドが用意されています。Linux はこのコマンドをブロック・レイヤーの破棄リクエストでサポートしています。
  • コンテナーやファイルシステムをフリーズできるとプロセス・グループに対してチェックポイント操作を行うことができますが、この機能は 2.6.28 (そして来たる 2.6.29) の新機能のうち最も興味深い機能の 1 つです。また、もう 1 つの新機能として、2.6.28 では PCI デバイスはハイパーバイザーで管理されるのではなく、直接ゲスト・オペレーティング・システムに渡されるようになります。
  • LXC: Linux コンテナー・ツール」(developerWorks、2009年2月) は Linux コンテナーの概要を解説しています。また「セキュアな Linux コンテナーのためのマニュアル」(developerWorks、2009年2月) は SELinux を使ってコンテナーのセキュリティーを高める方法を解説しています。
  • Linux ラップトップのためのノックによるコマンド」(developerWorks、2006年7月)、「Linux ThinkPad の振動検出を活用する」(developerWorks、2006年11月)、「ThinkPad aerobics: Rotate and shake your laptop to control applications」(developerWorks、2008年3月) を読み、ラップトップの加速度計を創造的に使う方法を学んでください。
  • 次世代のブロードバンド・ワイヤレス技術である WiMAX が Linux カーネル (2.6.29) でサポートされます。この技術はユーザー空間コンポーネントとカーネル・コンポーネントから成り、IEEE (Institute of Electrical and Electronics Engineers) 802.16e による一連の標準をベースにしています。
  • commit log または lwn.net で GRO (Generic Receive Offload) について読んでください。GRO は多くの IP ネットワーキング・スタックで使用されている Large Send Offload 機能を一般化したものです。
  • Oracle による、このオープンソースの記事は、Oracle 主導のマルチベンダー・ソリューションである DIF を Linux カーネルに導入することについて解説しています。T10-DIF はエンタープライズ・クラスのデータ完全性機能であり、この機能が Linux で利用できるようになりました。DIF ではディスク上の各ブロックに完全性情報を追加することでディスク上のデータを保護することができ、また気付かないうちにデータが破損する問題を解決することができます。
  • developerWorks の Linux ゾーンには Linux 開発者のための資料が豊富に用意されています。最も人気のあった記事やチュートリアルの一覧もご覧ください。
  • developerWorks には他にも Linux に関するヒントチュートリアルが豊富に用意されています。
  • developerWorks の Technical events and webcasts で最新情報を入手してください。

製品や技術を入手するために

  • developerWorks から直接ダウンロードできる IBM ソフトウェアの試用版を利用して、皆さんの次期 Linux 開発プロジェクトを構築してください。

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux
ArticleID=383772
ArticleTitle=進歩する Linux カーネル
publish-date=03242009