その理由は歴史的なものではなく、実際的なものです。Linuxカーネル上で実行される多くの多くのプログラムがあります。カーネルインターフェイスがこれらのプログラムを中断した場合、誰もがそれらのプログラムをアップグレードする必要があります。
現在、ほとんどのプログラムは実際にはカーネルインターフェイス(システムコール)に直接依存せず、C標準ライブラリ(システムコールのC ラッパー)のみに依存しているのは事実です。ああ、しかしどの標準ライブラリですか?Glibc?uClibC?Dietlibc?バイオニック?ムスル?等
しかし、OS固有のサービスを実装し、標準ライブラリによって公開されていないカーネルインターフェイスに依存する多くのプログラムもあります。(Linuxでは、これらの多くは/proc
およびを通じて提供され/sys
ます。)
そして、静的にコンパイルされたバイナリがあります。カーネルのアップグレードによりこれらのいずれかが破損した場合、唯一の解決策はそれらを再コンパイルすることです。ソースがある場合:Linuxは独自のソフトウェアもサポートしています。
ソースが利用できる場合でも、すべてを収集するのは苦痛です。特に、カーネルをアップグレードしてハードウェアのバグを修正する場合。多くの場合、ハードウェアのサポートが必要なため、カーネルはシステムの他の部分から独立してアップグレードされます。Linus Torvaldsの言葉では:
ユーザープログラムを破ることは、単に受け入れられません。(…)人々は古いバイナリを何年も使用していることを知っています。新しいリリースを作成しても、単にそれを捨てることができるわけではありません。あなたは私たちを信頼することができます。
彼はまた、これを強力なルールにする1つの理由は、新しいカーネルを動作させるために別のプログラムをアップグレードする必要があるだけでなく、さらに別のプログラムをアップグレードする必要がある依存性の地獄を避けるためであると説明していますなぜなら、すべてはすべての特定のバージョンに依存しているからです。
それはだ、やや明確に定義された一方向の依存性を持たせ、[OK]。それは悲しいですが、時々避けられません。(…)大丈夫ではないのは、双方向の依存関係を持つことです。ユーザー空間のHALコードが新しいカーネルに依存している場合は問題ありませんが、ユーザーが「今週のカーネル」ではなく、「過去数か月のカーネル」になることを望んでいると思いますが。
しかし、双方向の依存関係がある場合、あなたはうんざりしています。それは、ロックステップでアップグレードする必要があることを意味し、それは単に受け入れられません。ユーザーにとっては恐ろしいことですが、さらに重要なことは、開発者にとっては恐ろしいことです。なぜなら、「バグが発生した」とは言えず、二分法などでそれを絞り込もうとすることを意味するからです。
ユーザー空間では、これらの相互依存関係は通常、異なるライブラリバージョンを保持することで解決されます。ただし、実行できるのは1つのカーネルだけなので、人々がそれでやりたいことをすべてサポートしなければなりません。
公式に、
[安定と宣言されたシステムコール]の下位互換性は、少なくとも2年間保証されます。
しかし実際には、
ほとんどのインターフェイス(syscallsなど)は決して変更されず、常に使用可能であることが期待されます。
より頻繁に変更されるのは、ハードウェア関連のプログラムでのみ使用されることを意図したインターフェイスです/sys
。(/proc
一方、の導入は/sys
非ハードウェア関連サービスのために予約されていたため、互換性のない方法で中断することはほとんどありません。)
要約すれば、
ユーザースペースを壊すには、アプリケーションレベルでの修正が必要です
システムの残りの部分から独立してアップグレードしたいカーネルは1つしかありませんが、複雑な相互依存関係を持つ多くのアプリケーションが存在するため、それは悪いことです。数百万の異なるセットアップで数千のアプリケーションを最新に保つために、カーネルを安定させるのが簡単です。