ubuntu lucidをnattyにアップグレードしたところ、アップグレード中に実行中のアプリケーションのほとんどが新しいバージョンに置き換えられました。
これはどのように作動しますか?(アプリケーションはクラッシュしませんか?)libファイルがアップグレードされ、古いlibを探している実行中のアプリケーションがそれをロードしようとすると、アプリケーションはどうなりますか?
ubuntu lucidをnattyにアップグレードしたところ、アップグレード中に実行中のアプリケーションのほとんどが新しいバージョンに置き換えられました。
これはどのように作動しますか?(アプリケーションはクラッシュしませんか?)libファイルがアップグレードされ、古いlibを探している実行中のアプリケーションがそれをロードしようとすると、アプリケーションはどうなりますか?
回答:
Linux(および他のUNIX)は、ファイルの名前(リンク)、ファイル自体(多くの場合inodeで識別される)、およびファイルへの開いているハンドルを区別します。ファイルを削除する場合は、unlink()
呼び出しを呼び出します-これにより、ファイルへのリンクが消去されます(rename()
別のiノードで上書きすることもできます)。ただし、ファイルへのオープンハンドル(または他のリンク-ファイルに複数のハードリンクを含めることができる)が残っている場合、すべてのリンクとハンドルがなくなるまで、iノードが残り、ファイルのコンテンツも残ります。
そのため、ライブラリを使用してプログラムを実行するか、古いバージョンへのハンドルを保持するものはすべて(多くの場合、暗黙的にメモリマッピングを介して)ディスク上に残ります。それはもはやファイル名を持たず、それを使用するすべてのプログラムがシャットダウンしたとき(または次の再起動時、ファイルシステムチェックまたはジャーナル再生中)にクリーンアップされます。
さらに、「古いライブラリ」を想定しているプログラムは、新しいバージョンのライブラリでも問題なく動作することに注意してください。Linuxライブラリには、ライブラリが提供するABI(Application Binary Interface)のバージョンを反映するファイル名(「soname」)が割り当てられます。たとえば、私のシステムのCライブラリはlibc.so.6
です。libcの古いバージョンに対してコンパイルされたプログラムは、バージョン6のABIを実装するlibcのバージョンに対しては問題なく動作します。本当に古いプログラムは、代わりにlibc.so.5
or libc.so.4
または何かを探します。この場合、古いバージョンも保持する必要がありますが、ファイル名が異なるため、これは問題ではありません。
Windowsとは異なり、開いているファイルを削除または置換できます。与えるために簡略化し説明を、ファイルの新しい要求が既存のハンドルは、彼らが作成された時に存在していたファイルを使用して、新しいファイルを開きます。言い換えると、Linuxでは、ディレクトリ構造にそれらへのポインタがなくなったとしても、まだ存在するファイル/ファイルバージョンを持つことができます。それらが存在しなくなるのは、それらへのポインタがまったくない(閉じられている)
通常、実行中のアプリは必要なライブラリを前もってロードするため、説明する問題は、パッケージのインストール中に非常に特定のタイミングの状況でのみ発生します。実行中のアプリは引き続き古いバージョンのライブラリを使用し、新しく起動したアプリは新しい1。
これは、ディストリビューションのアップグレードだけでなく、すべてのパッケージのアップグレードで使用されます(dist-upgradeは、そのプロセスにいくつかの自動化されたステップを追加するだけです)。