Зачем менеджерам пакетов нужно блокировать файлы?

10

dpkgиспользует файл блокировки ( /var/lib/dpkg/lock), когда используется.

  • Зачем нужны эти файлы?
  • Почему несколько экземпляров невозможно?
acisoal
источник
Dpkg делает установки. Это безопасный режим, чтобы избежать конфликтов. Всего одна установка одновременно.
Альбфан

Ответы:

15

Это не dpkgспецифическая проблема (как подсказывает название моего редактирования). Скорее, это то, что делает каждый менеджер пакетов (о котором я знаю); и не зря. Хотя я понимаю, почему это может сбивать с толку.

Менеджеры пакетов используют базы данных для отслеживания информации об установленных пакетах. Если несколько пользователей пытаются одновременно выполнить запись в базу данных, у нее есть высокая вероятность повреждения данных (что может привести к повреждению системы).

В результате многие (все?) Менеджеры пакетов полагаются на файл блокировки, чтобы сигнализировать о том, что в базу данных выполняется запись , поэтому другому клиенту нельзя разрешать это делать.


Обратите внимание, что интеллектуальные менеджеры пакетов могут определить, когда запрос доступен только для чтения, и, возможно, нет необходимости блокировать базу данных. В результате; некоторые действия могут выполняться одновременно там, где других не будет.

HalosGhost
источник
2
Я думаю, что portage и paludis (менеджеры пакетов Gentoo) могут работать параллельно, если он вообще использует блокировки, он делает это только кратко при добавлении пакетов в установленный список.
Vality
Я посмотрю на менеджеров пакетов Gentoo и вскоре обновлю свой ответ.
HalosGhost
Я не могу найти актуальную информацию по этому вопросу; но, по крайней мере, какое-то время и paludis, и portage использовали файлы блокировки. Обратите внимание, что это такая распространенная стратегия, потому что это один из единственно безопасных способов предотвращения повреждения данных; Я был бы удивлен, если бы portage или paludis все еще не использовали такой метод.
HalosGhost
1
Ах, кажется, вы правы, однако область действия этих блокировок отличается, они используются только при обновлении индекса пакета (потеря потерянных пакетов), фактически установка пакетов - это операции только для чтения, и поэтому она не вызывает блокировку. Тем не менее, да, я понимаю, что вы имеете в виду, имеет смысл, что стратегия настолько распространена.
Vality
9

Файл блокировки используется для предотвращения параллельного выполнения нескольких экземпляров.

Почему это важно для менеджеров пакетов?

Менеджер пакетов - с точки зрения высокого уровня - это программа, которая применяет сложные изменения к жесткому диску.

Изменения не могут быть сделаны за один шаг («атомарный»), поэтому существует несколько шагов; многие из шагов зависят от результата предыдущих шагов.

Таким образом, менеджер пакетов должен либо проанализировать жесткий диск перед выполнением каждого шага, либо просто проанализировать его один раз и отследить изменения, которые он применяет сам. Первый вариант крайне медленный. Второй требует, чтобы никакой другой экземпляр не вносил изменений.

Есть много других проблем, которые могут появиться.

Это не невозможно реализовать менеджер пакетов , который может работать параллельно, но это слишком сложно , чтобы быть стоит . Например, Вы не можете себе представить, насколько это сложно. В самом деле.

Volker Siegel
источник
2

dkpg(и, как rpmи большинство других традиционных менеджеров пакетов), работают путем установки пакетов в глобальном пространстве, что означает, что пакеты могут конфликтовать друг с другом (например, Aи Bне могут быть установлены одновременно, поскольку они оба устанавливаются /usr/lib/libfoo.so). Менеджеры пакетов должны обнаруживать такие конфликты и отклонять такие запросы на установку, чтобы поддерживать систему в согласованном состоянии. Наличие нескольких экземпляров диспетчера пакетов, работающих одновременно, было бы очень сложным и подверженным ошибкам.

Бесконфликтные менеджеры пакетов (например, http://0install.net ) могут и разрешать параллельную установку нескольких пакетов¹ и не нуждаются в блокировке файлов ( A/libfoo.soи они B/libfoo.soбудут находиться в разных каталогах).


1 Параллельно как в смысле присутствия и доступности в системе одновременно, так и в смысле одновременной загрузки и добавления в систему.

Томас Леонард
источник