パッケージマネージャにロックファイルが必要なのはなぜですか?

パッケージマネージャにロックファイルが必要なのはなぜですか?

dpkg/var/lib/dpkg/lock使用する場合は lockfile() を使用してください。

  • これらのロックファイルが必要なのはなぜですか?
  • 複数のインスタンスが不可能な理由は何ですか?

答え1

dpkgこれは、編集されたタイトルからわかるように、特定の質問ではありません。代わりに、これは(私が知っている)すべてのパッケージマネージャが実行することであり、その理由があります。それでもなぜ混乱するのか理解しています。

パッケージマネージャはデータベースを使用して、インストールされたパッケージに関する情報を追跡します。複数のユーザーが同時にデータベースに書き込もうとすると、データが破損する可能性が高くなります(これによりシステムが実際に破損する可能性があります)。

したがって、多くの(すべて?)パッケージマネージャは以下を使用します。ロックファイルデータベースへの書き込みが進行中であるため、他のクライアントがそうすることを許可してはいけないことを示します。


Smart Package Managerは、要求が読み取り専用でデータベースをロックする必要がないタイミングを決定できます。したがって、一部のジョブは同時に実行できますが、他のジョブは同時に実行することはできません。

答え2

ファイルロック並列実行防止複数のインスタンスの。

パッケージマネージャにとって、なぜこれが重要なのですか?

高いレベルの観点から、パッケージマネージャは以下を実行するプログラムです。複雑な変更の適用ハードドライブに。

多様性ワンステップで完了することは不可能です(「原子的」)なので、前のステップの結果に応じていくつかのステップが異なります。

したがって、パッケージマネージャは各ステップを実行する前にハードディスクを分析するか、単に一度分析して適用された変更を追跡する必要があります。最初のオプションは非常に遅いです。 2番目は、他のインスタンスが変更しないように要求します。

他の多くの問題が発生する可能性があります。

これは不可能ではない並列に作業できるパッケージマネージャを実装します。複雑すぎて価値がない。同様に、それがどれほど複雑なのか想像できません。本当。

答え3

dkpg(およびrpm他のほとんどの既存のパッケージマネージャ)は、パッケージをグローバルスペースにインストールすることで機能します。これは、パッケージが互いに競合する可能性があることを意味します(たとえば、両方がインストールされているため同時にインストールできAません)。パッケージマネージャは、システムを一貫した状態に保つために、これらの競合を検出してインストール要求を拒否する必要があります。パッケージマネージャの複数のインスタンスを同時に実行するのは複雑でエラーが発生しやすい。B/usr/lib/libfoo.so

競合のないパッケージマネージャ(例:http://0install.net)は複数のパッケージを並列にインストールでき、ファイルロックは必要ありません(別のディレクトリに移動します)A/libfoo.soB/libfoo.so


1並列とは、システムに同時に存在して使用できるだけでなく、システムに同時にダウンロードおよび追加されることを意味します。

関連情報