Мені цікаво, як /var/cache/apt/archives/lock
вживаються apt-get
. Я з’ясував, що це звичайний файл, і я думаю, що він використовується, викликаючи flock
його кожен раз, коли apt-get
потрібно внести деякі зміни /var/cache/apt/archives
.
Мені цікаво, як /var/cache/apt/archives/lock
вживаються apt-get
. Я з’ясував, що це звичайний файл, і я думаю, що він використовується, викликаючи flock
його кожен раз, коли apt-get
потрібно внести деякі зміни /var/cache/apt/archives
.
Відповіді:
Коротка відповідь - 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
І я впевнений, що ви вже знаєте ідею використання файлів блокування, але щоб переконатися, що всі, хто приходить сюди, знають про це:
/var/cache/apt/archives/lock
не використовуються?
apt
не використовується flock
для управління процесом блокування. він має власні функції, які використовує fcntl
.
Apt і dpkg використовують фіксатори (в /var/lib/
, ні /var/cache
), щоб забезпечити правильність синхронізації дій управління пакетом та бази даних пакетів.
Це означає, що якщо ви встановите або вилучите пакунок (як-от hello
пакет), база даних буде точною, і ваш менеджер пакунків правильно покаже правильний стан пакета.
Існує кілька можливих рішень для того, щоб забезпечити синхронізацію дій управління пакетом та базою даних пакетів. Lockfiles - це рішення, яке обрали розробники доречних розробників ... здебільшого тому, що це рішення, яке легко, легко усунути несправності та легко зрозуміти.
/var/cache/apt/archives/lock
насправді робить?