Мені цікаво, як /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насправді робить?