Reduzindo problemas de atualizações no Debian, Ubuntu e derivados - Parte 2

Se lembra de quando você instala um programa, ou vai atualizar o sistema e o instalador para antes do fim e então você às vezes não consegue mais instalar ou remover nada? É justamente uma solução para isso que apresento nesse artigo.

[ Hits: 7.542 ]

Por: Bruno Gonçalves Araujo em 24/07/2015


Passo a passo das alterações e explicação técnica



Cada pacote .deb pode conter até 2 scripts a serem executados automaticamente no momento de sua instalação e mais 2 scripts a serem executados na sua remoção.

Ao mandar o sistema instalar um pacote .deb, os scripts são salvos na pasta /var/lib/dpkg/info/ e a partir dela são executados. Suas extensões são preinst, postinst, prerm e postrm.

Dentro da maior parte desses scripts é informado um parâmetro do terminal bash, o "set -e", isso significa que ao encontrar uma falha durante a execução de algum dos comandos contidos no script, o mesmo deve ser finalizado e emitido um sinal de erro, que é interpretado pelo gerenciador de pacotes do dpkg como um pacote quebrado.

Também existe uma checagem bastante utilizada, a "exit $?" que é utilizada geralmente em conjunto com comandos de execução de um daemon, que ao falhar na execução também emite um sinal de erro que é interpretado como pacote quebrado.

Esses problemas são muito comuns de acontecer, podemos encontrar milhares de ocorrências ao buscar pelos mesmos, e em geral é resolvido editando o script e eliminando o comando que está falhando.

Para simplificar o uso diário do sistema, fiz um simples shell script que acessa essa pasta e altera todos os arquivos que podem causar esse transtorno, removendo o parâmetro "set -e" e trocando o "exit $?" por "exit 0".

Veja o código do script:

#!/bin/bash

######################
# Tweaks for dpkg
# by Bruno Gonçalves Araujo <bigbruno@gmail.com>
# licensed under GPLv2 or greater.
# released in 7/17/2015

for i  in  $(grep -l "set -e" /var/lib/dpkg/info/*.pre*); do
    sed -i  's|set -e||g' $i
done

for i  in  $(grep -l "set -e" /var/lib/dpkg/info/*.post*); do
    sed -i  's|set -e||g' $i
done

for i  in  $(grep -l 'exit $?' /var/lib/dpkg/info/*.pre*); do
    sed -i  's|exit $?|exit 0|g' $i
done

for i  in  $(grep -l 'exit $?' /var/lib/dpkg/info/*.post*); do
    sed -i  's|exit $?|exit 0|g' $i
done

Salvei o mesmo como /usr/bin/dpkg-clean-set, então cada vez que ocorrer um problema, que geralmente está descrito no log de instalação de pacotes como:

subprocess installed post-installation script returned error exit status 2

Basta executar esse script e novamente mandar instalar ou atualizar os pacotes desejados.

Para automatizar o uso do script, o adicionei como execução automática em todas as vezes que utilizar o apt-get, criei o arquivo /etc/apt/apt.conf.d/19bigcleanset com o seguinte conteúdo:

DPkg::Pre-Invoke {"/usr/bin/dpkg-clean-set ";};

De tal forma toda vez que for instalar um programa, seja diretamente pelo apt-get, ou por uma interface, por exemplo, o Synaptic, o script será executado, porém ele não é executado de forma prévia à atualização ou instalação, caso algum pacote a ser instalado ou atualizado gere um sinal de erro, a atualização ou instalação irá considerar o pacote quebrado, porém basta executar novamente a instalação ou atualização do sistema que a alteração nos scripts irá resolver tudo de forma automática.

Página anterior     Próxima página

Páginas do artigo
   1. Onde e porque utilizar essa alteração
   2. Passo a passo das alterações e explicação técnica
   3. Testes / Configuração de forma automática
Outros artigos deste autor

Reduzindo problemas de atualizações no Debian, Ubuntu e derivados

BigBashView, interface gráfica para o seu shell script

Solucionando o problema de cache em dispositivos de armazenamento USB

Leitura recomendada

OcoMon no CentOS - Instalação e configuração

Configurando seu Openbox para reconhecer teclas multimídia

OCS Inventory e seus clientes - Instalação e configuração

DebConf - Perguntas ao usuário na instalação de pacote .deb

Impressoras/scanners e multifuncionais Insigne GNU/Linux

  
Comentários
[1] Comentário enviado por xGrind em 24/07/2015 - 14:47h

Boa tarde bigbruno. Essas quebras de pacotes são mais coisas de .deb ou também acontecem em .rpm ?

[2] Comentário enviado por bigbruno em 24/07/2015 - 17:41h

xGrind, sim pacotes RPM também quebram, não sei se em maior ou menor quantidade, pois utilizo quase exclusivamente distribuições DEB.

[3] Comentário enviado por clodoaldops em 24/07/2015 - 22:31h

BigBruno, saudades do BigLinux-4.2 que usei até perder suporte!
Obrigado pela dica!

[4] Comentário enviado por Creto em 26/07/2015 - 13:20h


Obrigado por seu empenho com o software livre Bruno!

Att,
Creto

[5] Comentário enviado por Lwkas em 28/07/2015 - 14:24h

Belo artigo

[6] Comentário enviado por sacioz em 29/07/2015 - 18:12h

Muito bom ...^D no dito cujo . Muito obrigado.

[7] Comentário enviado por lcom23 em 08/08/2015 - 13:07h


Excelente artigo Bruno Parabéns!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts