Как делает склонный - получают использование/var/cache/apt/archives/lock?

Мне любопытно из как /var/cache/apt/archives/lock используемый в apt-get. Я узнал, что это - регулярный файл, и я думаю, что это используется путем вызова flock на нем каждый раз apt-get потребности внести некоторые изменения в /var/cache/apt/archives.

3
задан 21 September 2018 в 20:44

2 ответа

Короткий ответ - это 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
ответ дан 1 December 2019 в 16:17

Кв. и dpkg используют lockfiles (в /var/lib/, нет /var/cache) гарантировать, что действия управления пакетом и база данных пакета находятся правильно в синхронизации.

Это означает что, если Вы устанавливаете или удаляете пакет (как hello пакет), база данных пакета будет точна, и Ваш диспетчер пакетов правильно покажет корректное состояние пакета.

Существует несколько возможных решений гарантировать, что действия управления пакетом и база данных пакета находятся в синхронизации. Lockfiles являются решением, которое способные разработчики выбрали... главным образом, потому что это - решение, которое просто, легко диагностировать, и легкий понять.

1
ответ дан 1 December 2019 в 16:17

Другие вопросы по тегам:

Похожие вопросы: