ソフトウェア パッケージはアップグレード中でも正常に実行されるのはなぜですか?

ソフトウェア パッケージはアップグレード中でも正常に実行されるのはなぜですか?

たとえば、ソフトウェアを実行中に、パッケージ マネージャーを実行してソフトウェアをアップグレードすると、Linux はパッケージ アップグレードの実行中のプロセスを停止せず、引き続き正常に実行していることに気付きます。Linux はどのようにしてこれを実行するのでしょうか。

答え1

その理由は、Unix では実行ファイルが実行中にロックされないか、Linux のようにロックされる場合でも、このロックはファイル名ではなく inode に適用されます。つまり、ファイルを開いたままのプロセスは、ファイルが削除され (実際にはリンクが解除され)、同じ名前の新しいファイルに置き換えられた後でも同じ (古い) データにアクセスします。これは基本的にパッケージ更新が行うことです。

これは、Unix と Windows の主な違いの 1 つです。Windows では、ファイル名と inode の間にレイヤーがないため、ロックされているファイルを更新できず、一部のパッケージを更新したりインストールしたりするのにも大きな手間がかかります。通常は完全な再起動が必要になるためです。

答え2

実行可能ファイルは通常、一度開かれ、ファイル記述子にアタッチされ、単一実行期間中にバイナリが再度開かれるファイル記述子を持ちません。たとえば、 を実行する場合bash、通常、呼び出し時に --exec()が指す inode のファイル記述子が一度だけ作成されます。/bin/bash

これは、実行中に(呼び出されたパスを使用して)自分自身を再読み込みしようとしない単純なバイナリの場合、キャッシュされたコンテンツがダングリング inode として有効なままであることを意味します。つまり、基本的に実行可能ファイルの以前のバージョンのレプリカが存在することになります。

より複雑なケースでは、これが問題を引き起こす可能性があります。たとえば、構成ファイルがアップグレードされてから再度読み込まれる場合や、プログラムが実行元のパスを経由して再度実行される場合があります。プログラムが相互接続されていて、1 つがアップグレード前に実行され、もう 1 つがアップグレード後 (おそらく最初のプログラムによって) に実行される場合にも問題が発生する可能性があります。これは、一部のライブラリにも当てはまります。

ただし、単純な使用例では、プロセスを再起動せずにアップグレードしても安全です。

関連情報