検索
連載

IPv6、UML、セキュリティ機能の統合全貌を現したLinuxカーネル2.6(第4章)(1/2 ページ)

カーネル2.6にはまだまだ興味深い機能がある。今回はこれらを一気に紹介して、一連の特集をしめくくる。これを読めば、カーネル2.6の正式リリースが楽しみになるだろう。(編集局)

Share
Tweet
LINE
Hatena

 2003年1月から続いたこの企画も今回が最終章です。これまで触れられなかったTCP/IP関連機能(IPv6対応強化やSCTPサポートなど)やカーネルレベルプリエンプション、User Mode Linuxやカーネルのセキュリティ機能であるLinux Security Moduleを一気に紹介します。

TCP/IPの機能強化

 カーネル2.6では、TCP/IPスタックに以下の改良が加えられています。

  • IPv6対応の強化
  • SCTP(Stream Control Transmission Protocol)サポート
  • IPSec対応

IPv6対応の強化

 カーネル2.6のIPv6実装には、USAGI Project(編注)やヘルシンキ工科大学などの成果が取り入れられ、大幅な機能強化が図られています。いくつかの機能はカーネル2.4でもすでに利用できるようになっていますが、次のような改善が行われています。

  • IPv6上のICMP機構(近隣探索/自動設定関連機能)の改善
  • 堅牢性の向上
  • 経路制御(デフォルト経路)の改善
  • エニィキャストへの対応
  • モバイルIP機能への対応
  • IPv6 Over IPv6(IPv6のパケットをIPv6上でトンネルする機能)
  • IPv6 Over ATM(ATM上でIPv6による通信を行う機能)
  • ネットフィルタのIPv6サポート

編注:USAGIによるIPv6については、Linuxで作るIPv6ネットワーク環境も参照。


SCTPのサポート

 カーネル2.6では、SCTP(Stream Control Transmission Protocol)がサポートされます。

 SCTPとは、IPなどの信頼性のないプロトコル上で、耐故障性に優れた通信路を提供するトランスポート層のプロトコルの一種です(図4)。

図4 SCTPによる通信
図4 SCTPによる通信

 SCTPは、以下のような特徴を持っています。

  • メッセージ指向の通信プロトコルである(オクテットストリームではない)
  • シーケンス番号とチェックサムからパケットの正統性を検証することで、パケットの多重送信などを回避して信頼性を確保する
  • マルチホーミング対応の通信プロトコルであり、1つのストリームに対する通信路を複数持たせることができる

 SCTPの最大の特徴の1つがマルチホーミング対応であることです。これは、サーバとクライアントとの通信路を多重化する(クライアントのIPを複数持つ)ことで、いずれかの通信路が通信不能になった場合でも、ほかの通信路を介して通信を続行できるということです。このような特性から、SCTPは主にモバイル環境での利用が期待されています。

IPSecのサポート

 IPSecとは、IP通信のパケットに電子署名や暗号化を施すことで、パケットの盗聴や偽造パケットの送信によるリピート攻撃などを防ぐ機能です。

 カーネル2.4系は、IPSecを実装するためにカーネルにパッチを当てる必要がありましたが(編注)、カーネル2.6ではIPSecのサポートが標準カーネルに取り込まれます。カーネル2.6のIPSecはUSAGI Projectの成果物であり、IPv4/IPv6の双方で利用可能です。

編注:カーネル2.4でIPSecを利用する手段の1つに、FreeS/WANがある。FreeS/WANについては、FreeS/WANによるIPSecの導入と運用を参照。


カーネルレベルプリエンプションの仕組みと効果

カーネルレベルプリエンプションとは?

 カーネル2.6の重要な変更点の1つが、カーネルレベルプリエンプションによる割り込み応答性能の向上です。カーネルレベルプリエンプションは、組み込み系UNIXや近年の主要なUNIX系OS(SolarisなどのSVR4系UNIX)で実現されており、組み込み分野およびエンタープライズ分野の双方において重要な機能の1つといえます。

 カーネル2.4までのLinuxでは、伝統的なUNIXと同様にプロセス起床に伴うコンテキスト切り替えは、システムコールの出口処理で行われていました。このため、割り込み処理時に、実行中のプロセスより優先度の高いプロセスを割り込みハンドラから起床しても、プロセス起床に伴うスケジューリングは割り込み発生前に実行していたシステムコールが終了するまで遅延されます(図5)。

図5 カーネル2.4におけるプロセス起床処理
図5 カーネル2.4におけるプロセス起床処理

 カーネル2.6では、割り込みに対する応答性能を改善するために、システムコールの実行中に割り込みハンドラからスケジュール要求があった場合、即時にスケジューリングを行う(カーネルレベルプリエンプション)ための修正が加えられています(図6)。

図6 カーネル2.6におけるプロセス起床処理
図6 カーネル2.6におけるプロセス起床処理

 ただし、OSのクリティカルセクション中でスケジューラを呼び出すとデータの一貫性が崩れ、システムがクラッシュしてしまいます。そのため、スケジューラの呼び出しをクリティカルセクションの外側からの呼び出しに限定する機構が必要となります。

 カーネル2.6は、SMP時に使用されるスピンロックによる排他区間とプリエンプション不可能区間との同一性に注目し、スピンロックで保護された排他区間から出た時点でスケジューリングを行うことによって、カーネルレベルプリエンプションを実現しています(編注)。

編注:カーネルレベルプリエンプション(プリエンプティブルカーネル)については、Linuxカーネル2.5 最新開発動向でも解説している。


カーネルレベルプリエンプションの効果

 参考までに、カーネル2.4.20およびカーネル2.5.60環境でファイルシステムに高負荷を掛けた状態でプロセスを20ms周期で1000回起床させた場合のプロセス起床までの時間をグラフ1、グラフ2に示します()。カーネルレベルプリエンプションの効果により、カーネル2.5.60では起床時間のばらつきが小さくなっているのが分かると思います。

グラフ1 カーネル2.4.20のプロセス起床時間(CPU:Intel Xeon 2.4GHz)
グラフ1 カーネル2.4.20のプロセス起床時間
(CPU:Intel Xeon 2.4GHz)
グラフ2 カーネル2.5.60のプロセス起床時間(CPU:Intel Xeon 2.4GHz)
グラフ2 カーネル2.5.60のプロセス起床時間
(CPU:Intel Xeon 2.4GHz)

注:なお、グラフにおける平均遅延時間の差(カーネル2.4.20:3.4ms、カーネル2.5.60:1ms)は、デフォルトのタイマティックの設定値によるものであり、カーネルレベルプリエンプションの影響によるものではありません。


Copyright © ITmedia, Inc. All Rights Reserved.

       | 次のページへ
ページトップに戻る