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


10

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

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

Dpkg执行安装。这是一种避免冲突的安全模式。一次只能安装一次。
albfan 2014年

Answers:


15

这不是dpkg特定的问题(如我的编辑标题所示)。相反,这是每个包管理器(据我所知)所做的;并且有充分的理由。虽然,我的确理解为什么会造成混淆。

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

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


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


2
我认为portage和paludis(Gentoo的软件包管理器)可以并行工作,如果它完全使用锁,则仅在将软件包添加到已安装列表中时才这样做。

我将看一下Gentoo的软件包管理器,并很快更新我的答案。
HalosGhost 2014年

我找不到关于此的最新信息;但是至少在一段时间内,paludis和portage都使用了锁定文件。请注意,这是一种常见的策略,因为它是防止数据损坏的唯一安全方法之一。如果portage或palusis仍未使用这种方法,我会感到惊讶。
HalosGhost

1
嗯,看来您是对的,但是这些锁的范围不同,它们仅在更新程序包索引(丢失可用程序包)时使用,实际上安装程序包是只读操作,因此不会调用该锁。但是,是的,我明白您的意思,该策略如此普遍是有道理的。

9

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

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

从高级的角度来看,程序包管理器是一个程序,它将复杂的更改应用于硬盘。

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

因此,程序包管理器需要在执行每个步骤之前分析硬盘,或者仅对其进行一次分析并跟踪其自身应用的更改。第一种选择非常慢。第二个要求没有其他实例进行更改。

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

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


2

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

无冲突的包管理器(如http://0install.net)可以做允许多个软件包安装在parallel¹,并且不需要锁定文件(A/libfoo.soB/libfoo.so会在不同的目录中去)。


1从同时存在于系统上并在系统上可用以及从同时下载并添加到系统的意义上说,是并行的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.