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

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

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

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

答案1

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

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

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


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

答案2

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

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

从高层次的角度来看,包管理器是一个程序,它应用复杂的变化到硬盘。

变化不可能一步完成(“原子”),因此有多个步骤;许多步骤取决于先前步骤的结果。

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

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

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

答案3

dkpg(以及rpm大多数其他传统的包管理器)通过将包安装到全局空间来工作,这意味着包可能会相互冲突(例如,A不能B同时安装,因为它们都安装/usr/lib/libfoo.so)。包管理器必须检测此类冲突并拒绝此类安装请求,以保持系统处于一致状态。同时运行包管理器的多个实例将非常复杂并且容易出错。

无冲突的包管理器(例如http://0install.net)可以并且确实允许并行安装多个包,并且不需要锁定文件(A/libfoo.so并且B/libfoo.so将进入不同的目录)。


1 并行是指同时在系统上存在和可用,以及同时下载和添加到系统中。

相关内容