为什么包管理器需要锁定文件?

aci*_*oal 10 dpkg lock concurrency

dpkg/var/lib/dpkg/lock在使用时使用锁定文件 ( )。

  • 为什么需要这些锁文件?
  • 为什么不可能有多个实例?

Hal*_*ost 15

这不是一个dpkg特定的问题(正如我的编辑标题所建议的那样)。相反,这是每个包管理器(我知道)都会做的事情;并且有充分的理由。不过,我确实理解为什么它可能会令人困惑。

包管理器依靠数据库来跟踪已安装包的信息。如果多个用户同时尝试写入数据库,则很有可能损坏数据(这真的会破坏系统)。

结果,许多(全部?)包管理器依赖于锁定文件来表示正在写入数据库,因此不应允许另一个客户端这样做。


请注意,智能包管理器可能能够确定请求何时是只读的,并且可能不需要锁定数据库。其结果; 某些操作可以同时运行,而其他操作则不能。

  • 我认为 portage 和 paludis(Gentoo 的包管理器)能够并行工作,如果它完全使用锁,它只会在将包添加到已安装列表时短暂地这样做。 (2认同)

Vol*_*gel 9

锁定文件用于防止多个实例并行执行

为什么这对包管理器很重要?

包管理器——从高层次的角度来看——是一个对硬盘应用复杂更改的程序。

更改不能一步完成(“原子”),因此需要多个步骤;许多步骤取决于先前步骤的结果。

因此,包管理器需要在执行每个步骤之前分析硬盘,或者简单地分析一次并跟踪它自己应用的更改。第一个选项非常慢。第二个要求没有其他实例进行更改。

还有许多其他问题可能会出现。

不是不可能实现,可以并行工作的软件包管理器,但它太复杂,是值得的。就像在,你无法想象有多复杂。真的。