Mind Bending

Ontem, ao tentar atualizar meu Arch Linux acabe passando por um problema de dependência cíclica com o gcc-libs. "Mas o que é dependência cíclica?" você me pergunta. Basicamente é o mesmo que um deadlock, mas no âmbito de um gerenciador de pacotes. Isto é, quando a atualização do "Pacote A" depende da atualização do "Pacote B" e a atualização do "Pacote B" depende da atualização do "Pacote A", desta forma o sistema não consegue se atualizar e fica preso. Para entender melhor, que tal uma imagem?

Deadlock

O meu caso o caso de dependência cíclica ocorreu entre as bibliotecas lib32-gcc-libs e sua dependência gcc-libs-multilib. É importante ressaltar que isto ocorre apenas para quem usa o repositório multilib. Mesmo este não sendo um problema difícil de se resolver, estou escrevendo sobre ele pois a solução se aplica a outros casos de dependência cíclica do pacman e além disso esse problema pode vir a ocorrer com outras pessoas que utilizam o Arch Linux.

A Dependência Cíclica

Para ajudar as pessoas a identificar o problema, vou apresentar a mensagem de erro que ocorreu após emitir o comando de atualização:

$ sudo pacman -Suy
[sudo] password for magnun:
:: Sincronizando a base de dados de pacotes...
 core está atualizado
 extra está atualizado
 community está atualizado
 multilib está atualizado
 archlinuxfr está atualizado
 xyne-x86_64 está atualizado
:: Iniciando atualização completa do sistema...
:: Substituir python-imaging por community/python2-imaging? [S/n] s
:: Substituir python-notify por extra/python2-notify? [S/n] s
resolvendo dependências...
atenção: dependência cíclica detectada:
atenção: lib32-gcc-libs será instalado antes de sua dependência gcc-libs-multilib
procurando por conflitos inter-relacionados...
erro: falha ao preparar a transação (não foi possível satisfazer as dependências)
$

Atenção para as 2 linhas que seguem abaixo de "resolvendo dependências...", elas identificam o tipo de erro (dependência cíclica) e os pacotes envolvidos (lib32-gcc-libs e gcc-libs-multilib).

Geralmente esse tipo de problema ocorre quando, durante alguma migração ou atualização, um "Pacote B" deixou de depender de um "Pacote A", ou algo similar. Como você "perdeu" essa atualização, o banco de dados do seu pacman ainda acha que o "Pacote B" depende do "Pacote A".

Resolvendo a Dependência Cíclica

Basicamente para se resolver o problema de dependência cíclica devemos reinstalar a dependência do pacote. Mas o grande problema é que o pacman não nos permite removê-lo apenas emitindo o comando de remoção tradicional. Para conseguirmos removê-lo devemos informar ao pacman que ele deve ignorar a verificação de dependências, o que pode ser feito com a flag -dd.

Confiram abaixo a execução do comando:

$ sudo pacman -Rdd gcc-libs-multilib

Alvos (1): gcc-libs-multilib-4.7.1-6

Total removido:     2,95 MiB

Deseja remover estes pacotes? [S/n] s
(1/1) removendo gcc-libs-multilib           [##########] 100%
$

Agora, basta reinstalar o pacote que você acabou de remover, normalmente:

$ sudo pacman -S gcc-libs-multilib
resolvendo dependências...
atenção: dependência cíclica detectada:
atenção: lib32-gcc-libs será instalado antes de sua
dependência gcc-libs-multilib
procurando por conflitos inter-relacionados...

Alvos (2): lib32-gcc-libs-4.7.2-1  gcc-libs-multilib-4.7.2-1

Tamanho Total Download:    1,46 MiB
Tamanho Total Instalado:   5,79 MiB
Alteração no Tamanho:      2,95 MiB

Prosseguir com a instalação? [S/n] s
:: Obtendo pacotes de multilib...
 lib32-gcc-libs-4.7.2-1-x86_64      732,4 KiB   312K/s 00:02 [######] 100%
 gcc-libs-multilib-4.7.2-1-x86_64   767,6 KiB   330K/s 00:02 [######] 100%
(2/2) verificando integridade do pacote                      [######] 100%
(2/2) carregando arquivos do pacote                          [######] 100%
(2/2) verificando conflitos de arquivo                       [######] 100%
(2/2) verificando espaço em disco disponível                 [######] 100%
(1/2) atualizando lib32-gcc-libs                             [######] 100%
(2/2) instalando gcc-libs-multilib                           [######] 100%

Por fim, mande atualizar o sistema normalmente:

$ sudo pacman -Suy
:: Sincronizando a base de dados de pacotes...
 core está atualizado
 extra está atualizado
 community está atualizado
 multilib está atualizado
 archlinuxfr está atualizado
 xyne-x86_64 está atualizado
:: Iniciando atualização completa do sistema...
:: Substituir python-imaging por community/python2-imaging? [S/n] s
:: Substituir python-notify por extra/python2-notify? [S/n] s
resolvendo dependências...
procurando por conflitos inter-relacionados...

Alvos (118): ati-dri-9.0-1  blender-5:2.64a-2  (...)

Tamanho Total Download:    386,91 MiB
Tamanho Total Instalado:   1821,38 MiB
Alteração no Tamanho:      81,00 MiB
(...)
$

Pronto, seu Arch Linux está livre da dependência cíclica e irá atualizar com sucesso.

Happy hacking :)

Magnun

Magnun

Engenheiro de telecomunicações por formação, mas trabalha com suporte à infraestrutura GNU/Linux, e nas horas vagas é Programador OpenSource (Python e C) desenhista e escritor do Mind Bending Blog.


Comments

comments powered by Disqus