アップグレード中に実行中のアプリケーションバイナリを更新する方法は?


23

ubuntu lucidをnattyにアップグレードしたところ、アップグレード中に実行中のアプリケーションのほとんどが新しいバージョンに置き換えられました。

これはどのように作動しますか?(アプリケーションはクラッシュしませんか?)libファイルがアップグレードされ、古いlibを探している実行中のアプリケーションがそれをロードしようとすると、アプリケーションはどうなりますか?


良い質問ですが、おそらくここでよく尋ねられます:unix.stackexchange.com(URLはUnixと言っていますが、Linuxの質問もあります!)

Linuxのオープン時の置換機能を理解することは、まだプログラミング中のように見えます(しかし、ほんのわずかです:)
bdonlan

2
@bdonlan:プロセスの存続期間中にライブラリを動的にロードしている場合、これを十分に認識しておく必要があります。これは、コードの自己修正など、異常なことをしようとしている場合に特に重要です。しかし、はい、それは境界線です。
Piskvor

1
自己修正コードとはあまり関係ありませんが、Linux用のライブラリを作成する人が知っておくべきことは確かです。:)
bdonlan

1
@Piskvorは、gccのマルチステージコンパイルプロセスのように少し聞こえます:)しかし、基本的にはコンパイラだけがそのようなことをします、そして、通常、あなたはそれをしている間はシステムをアップグレードしません「トン格下げ何でもそれはあなたしている罰金、プロセス中だが、それは重要なもののその個人コンパイルコピーを使用することがありますので)
bdonlan

回答:


31

Linux(および他のUNIX)は、ファイルの名前リンク)、ファイル自体(多くの場合inodeで識別される)、およびファイルへの開いているハンドルを区別します。ファイルを削除する場合は、unlink()呼び出しを呼び出します-これにより、ファイルへのリンクが消去されます(rename()別のiノードで上書きすることもできます)。ただし、ファイルへのオープンハンドル(または他のリンク-ファイルに複数のハードリンクを含めることができる)が残っている場合、すべてのリンクとハンドルがなくなるまで、iノードが残り、ファイルのコンテンツも残ります。

そのため、ライブラリを使用してプログラムを実行するか、古いバージョンへのハンドルを保持するものはすべて(多くの場合、暗黙的にメモリマッピングを介して)ディスク上に残ります。それはもはやファイル名を持たず、それを使用するすべてのプログラムがシャットダウンしたとき(または次の再起動時、ファイルシステムチェックまたはジャーナル再生中)にクリーンアップされます。

さらに、「古いライブラリ」を想定しているプログラムは、新しいバージョンのライブラリでも問題なく動作することに注意してください。Linuxライブラリには、ライブラリが提供するABI(Application Binary Interface)のバージョンを反映するファイル名(「soname」)が割り当てられます。たとえば、私のシステムのCライブラリはlibc.so.6です。libcの古いバージョンに対してコンパイルされたプログラムは、バージョン6のABIを実装するlibcのバージョンに対しては問題なく動作します。本当に古いプログラムは、代わりにlibc.so.5or libc.so.4または何かを探します。この場合、古いバージョンも保持する必要がありますが、ファイル名が異なるため、これは問題ではありません。


9

Windowsとは異なり、開いているファイルを削除または置換できます。与えるために簡略化し説明を、ファイルの新しい要求が既存のハンドルは、彼らが作成された時に存在していたファイルを使用して、新しいファイルを開きます。言い換えると、Linuxでは、ディレクトリ構造にそれらへのポインタがなくなったとしても、まだ存在するファイル/ファイルバージョンを持つことができます。それらが存在しなくなるのは、それらへのポインタがまったくない(閉じられている)

通常、実行中のアプリは必要なライブラリを前もってロードするため、説明する問題は、パッケージのインストール中に非常に特定のタイミングの状況でのみ発生します。実行中のアプリは引き続き古いバージョンのライブラリを使用し、新しく起動したアプリは新しい1。

これは、ディストリビューションのアップグレードだけでなく、すべてのパッケージのアップグレードで使用されます(dist-upgradeは、そのプロセスにいくつかの自動化されたステップを追加するだけです)。


0

多くのLinuxプロセスは、元のパッケージがアップグレードされた後も引き続き機能しますが、一部は機能しません。私の経験では、実行中にKDEをアップグレードすると、KDEは正常に動作しません。クラッシュやログアウトの失敗が発生する可能性があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.