apt-get 如何使用 /var/cache/apt/archives/lock?

apt-get 如何使用 /var/cache/apt/archives/lock?

我很好奇它是如何/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 开发人员选择的解决方案……主要是因为它是一种简单、易于排除故障且易于理解的解决方案。

相关内容