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 并行是指同时在系统上存在和可用,以及同时下载和添加到系统中。