Por que os gerenciadores de pacotes precisam de arquivos de bloqueio?

10

dpkgusa um arquivo de bloqueio ( /var/lib/dpkg/lock), quando em uso.

  • Por que esses arquivos de bloqueio são necessários?
  • Por que várias instâncias não são possíveis?
acisoal
fonte
O Dpkg faz instalações. Este é um modo de segurança para evitar conflitos. Apenas uma instalação ao mesmo tempo.
albfan

Respostas:

15

Este não é um dpkgproblema específico (como sugeriu o título da minha edição). Pelo contrário, isso é algo que todo gerenciador de pacotes (do qual eu sei) faz; e por boas razões. No entanto, eu entendo por que pode ser confuso.

Os gerenciadores de pacotes confiam nos bancos de dados para rastrear as informações dos pacotes instalados. Se vários usuários tentarem gravar em um banco de dados ao mesmo tempo, há uma grande chance de corromper os dados (o que realmente estragaria o sistema).

Como resultado, muitos gerenciadores de pacotes (todos?) Dependem de um arquivo de bloqueio para sinalizar que o banco de dados está sendo gravado; portanto, outro cliente não deve ter permissão para fazê-lo.


Observe que os gerenciadores de pacotes inteligentes podem determinar quando uma solicitação é somente leitura e podem não precisar bloquear o banco de dados. Como um resultado; é possível que algumas ações possam ser executadas simultaneamente, enquanto outras não.

HalosGhost
fonte
2
Eu acho que portage e paludis (gerenciadores de pacotes do Gentoo) são capazes de trabalhar em paralelo, se eles usam bloqueios, o fazem apenas brevemente ao adicionar pacotes à lista instalada.
Vality 10/07/2014
Vou dar uma olhada nos gerenciadores de pacotes do Gentoo e atualizar minha resposta em breve.
HalosGhost
Não consigo encontrar informações atualizadas sobre isso; mas pelo menos por um tempo, paludis e portage utilizavam arquivos de bloqueio. Observe que essa é uma estratégia tão comum porque é uma das únicas maneiras seguras de impedir a corrupção de dados; Eu ficaria surpreso se o portage ou o paludis ainda não usassem esse método.
HalosGhost
1
Ah, parece que você está correto, no entanto, o escopo desses bloqueios é diferente, eles são usados ​​apenas na atualização do índice do pacote (a perda de pacotes disponíveis), na verdade a instalação de pacotes é uma operação somente leitura e, portanto, não invoca o bloqueio. No entanto, sim, entendo o que você quer dizer, faz sentido que a estratégia seja tão comum.
Vality 10/07/2014
9

O arquivo de bloqueio é usado para impedir a execução paralela de várias instâncias.

Por que isso é importante para os gerenciadores de pacotes?

Um gerenciador de pacotes - de uma visão de alto nível - é um programa que aplica mudanças complexas no disco rígido.

As alterações não podem ser feitas em uma etapa ("atômica"), portanto, existem várias etapas; muitas das etapas dependem do resultado das etapas anteriores.

Portanto, o gerenciador de pacotes precisa analisar o disco rígido antes de executar cada etapa ou simplesmente analisá-lo uma vez e acompanhar as alterações em que ele se aplica. A primeira opção é extremamente lenta. A segunda exige que nenhuma outra instância faça alterações.

Existem muitos outros problemas que podem aparecer.

Não é impossível implementar um gerenciador de pacotes que possa funcionar em paralelo, mas é muito complicado para valer a pena . Como em, você não pode imaginar o quão complicado. Realmente.

Volker Siegel
fonte
2

dkpg(e a rpmmaioria dos outros gerenciadores de pacotes tradicionais) funcionam instalando pacotes em um espaço global, o que significa que os pacotes podem entrar em conflito entre si (por exemplo, Ae Bnão podem ser instalados ao mesmo tempo, porque ambos instalam /usr/lib/libfoo.so). Os gerenciadores de pacotes devem detectar esses conflitos e rejeitar essas solicitações de instalação para manter o sistema em um estado consistente. Ter várias instâncias do gerenciador de pacotes em execução ao mesmo tempo seria muito complicado e propenso a erros.

Os gerenciadores de pacotes livres de conflitos (por exemplo, http://0install.net ) podem e permitem a instalação de vários pacotes em paralelo¹, e não precisam de arquivos de bloqueio ( A/libfoo.soe B/libfoo.soirão em diretórios diferentes).


1 Paralelamente, no sentido de estar presente e disponível no sistema ao mesmo tempo, e no sentido de ser baixado e adicionado ao sistema simultaneamente.

Thomas Leonard
fonte