我很好奇/var/cache/apt/archives/lock是如何在apt-get中使用的。我发现它是一个常规文件,我认为每次flock需要对/var/cache/apt/archives做一些更改时,都会调用D4。
发布于 2018-09-21 12:59:49
简单地说,apt正在使用fcntl来控制锁文件。
取决于您正在做什么,不同的锁将由apt创建,让我们考虑一下apt-pkg/update.cc负责的sudo apt update,并在实际更新源代码列表之前运行此条件:
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我相信你已经知道使用锁文件背后的想法了,但为了确保在座的每一个人都知道这一点:
发布于 2018-09-21 12:38:04
Apt和dpkg使用锁文件(在/var/lib/中,而不是在/var/cache中)来确保包管理操作和包数据库正确同步。
这意味着,如果安装或删除包(如hello包),包数据库将是准确的,包管理器将正确显示包的正确状态。
有几种可能的解决方案可以确保包管理操作和包数据库是同步的。Lockfiles是apt开发人员拥有chosen...mostly的解决方案,因为它是一个简单、易于排除故障和易于理解的解决方案。
https://askubuntu.com/questions/1077215
复制相似问题