我很好奇它是如何/var/cache/apt/archives/lock
在中使用的apt-get
。我发现它是一个常规文件,我认为flock
每次apt-get
需要对其进行一些更改时都会通过调用它来使用它/var/cache/apt/archives
。
答案1
简短的回答是apt
使用fcntl
控制锁文件。
根据你正在做的事情,会创建不同的锁apt
,让我们考虑sudo apt update
一下apt-pkg/update.cc
负责,并在实际更新我们的来源列表之前运行此条件:
if (Fetcher.GetLock(_config->FindDir("Dir::State::Lists")) == false)
请注意_config->FindDir("Dir::State::Lists")
将返回:/lists
,您可以通过运行以下命令找到它:
$ apt-config dump | grep lists
Dir::State::lists "lists/";
因此GetLock()
将在中创建一个锁文件/var/lib/apt/lists/
,如果我运行其他sudo apt update
进程,我将得到:
Reading package lists... Done
E: Could not get lock /var/lib/apt/lists/lock ...
E: Unable to lock directory /var/lib/apt/lists/
GetLock()
本身就生活在这里apt-pkg/contrib/fileutl.cc
:
我们来看看它的评论:
// GetLock - Gets a lock file /*{{{*/
// ---------------------------------------------------------------------
/* This will create an empty file of the given name and lock it. Once this
is done all other calls to GetLock in any other process will fail with
-1. The return result is the fd of the file, the call should call
close at some time. */
因此,下次当我运行apt update
此函数时,不会创建锁文件,而是返回-1
,并且我们的条件失败并且我们会收到错误。
如果我们研究代码,GetLock
我们可以看到它用来fcntl
提供其功能。
基本上fileutl.cc
是一个包含两个主要功能的文件实用程序,其定义GetLock
为“dpkg 兼容锁文件操作”方法。
fcntl
本身提供了一系列系统调用来操作文件描述符。它提供的功能之一fcntl
是“POSIX 记录锁,也称为进程相关锁“:
man 2 fcntl
我相信你已经知道使用锁文件背后的想法,但为了确保每个来到这里的都知道它:
答案2
Apt 和 dpkg 使用锁文件(在 中/var/lib/
,而不是/var/cache
)来确保包管理操作和包数据库正确同步。
这意味着如果您安装或删除一个包(如包hello
),包数据库将是准确的,并且您的包管理器将正确显示包的正确状态。
有几种可能的解决方案可以确保包管理操作和包数据库同步。锁文件是 apt 开发人员选择的解决方案……主要是因为它是一种简单、易于排除故障且易于理解的解决方案。