REDUZINDO PROBLEMAS DE ATUALIZAÇÕES NO DEBIAN, UBUNTU E DERIVADOS

ONDE E PORQUE UTILIZAR ESSA ALTERAÇÃO

 

No longínquo ano de 2012 fiz uma configuração para o apt-get que reduzia bastante a quebra de pacotes na atualização de sistemas que usam empacotamento .deb, você pode conferir aqui:

Para facilitar a compreensão dos que não estão habituados aos nomes utilizados, sabe 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 proponho nesse artigo.

Se você tem curiosidade para saber o que as alterações fazem, continue lendo o artigo, se deseja apenas instalar essa melhoria em seu sistema, ao final do artigo está o link para download e instalação.

Explicação sobre porquê e onde utilizar a modificação:

Talvez o que mais me incomode nas distribuições como um todo seja o processo de atualização, que tende a ocasionalmente quebrar o sistema, utilizo diariamente distribuições que utilizam pacotes .deb há mais de 10 anos e observei que o gerenciador de pacotes considera como pacote quebrado uma séria de pequenas falhas na execução de scripts de pós-instalação, o que na verdade em nada interferem no uso do sistema. Porém, ao considerar que o pacote está quebrado ficamos com todo o gerenciador de pacotes comprometido, até que seja dada uma solução para esse determinado pacote.


Não recomendo que essas alterações sejam feitas em servidores, pois nesse caso é preciso ter alguém com experiência para efetuar os procedimentos e cada pequeno erro deve ser analisado e resolvido para evitar que o servidor deixe serviços indisponíveis, ainda que por períodos breves.

No caso de computadores pessoais ou de escritórios, onde o usuário muitas vezes tem pouco conhecimento sobre o sistema, ou ainda que tenha conhecimento não deseja se preocupar a cada pequena falha de pacotes, que em geral não muda em nada o uso do sistema, acredito que a abordagem a seguir é a melhor solução. No momento a instalação da distribuição que estou utilizando possui 3450 pacotes instalados, de tal forma é bastante improvável que durante uma atualização de tantos pacotes alguns não apresentem erros em seus arquivos de pós-instalação.

Outra característica que me faz acreditar nessa abordagem é que os pacotes realmente essenciais ao funcionamento do sistema tendem a ser muito bem testados e empacotados, ficando para os pacotes de menor importância a maior quantidade de erros. Existem inúmeros casos que já presenciei, por exemplo, de um gerenciador de pacotes travado por erro em um pacote que provia opções de mais ícones para personalizar o desktop.

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 <[email protected]>
# 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.

 

TESTES / CONFIGURAÇÃO DE FORMA AUTOMÁTICA

 

Teste 1 – atualizei a distribuição BigLinux 12.04, que utiliza repositórios Ubuntu, para os repositórios 15.10.

Sem as alterações foram apresentados diversos problemas, após as alterações bastou que abrisse o Synaptic e efetuasse a atualização, todos os pacotes foram atualizados, o único porém é que foi instalado o systemd no lugar do upstart e o mesmo não funcionou de forma adequada, porém bastou marcar no Synaptic após a atualização para instalar o pacote upstart-sysv.

Foram mais de 3 anos de atualizações acumuladas, o que inclui até a troca do KDE 4 para o KDE 5, que ocorreu de forma bastante fácil e automática.

Teste 2 – atualizei uma versão do Linux Mint Debian Edition de 2012 para o repositório Debian Testing de hoje, 17 de julho de 2015.

A atualização foi também automática e sequer tive que efetuar alguma intervenção extra, nesse caso não houve mudança para o systemd e também não ocorreu mudança maior na versão do desktop.

Tentei efetuar ambas as atualizações sem as alterações contidas nesse artigo e ambos falharam e precisaram de diversas intervenções manuais para que fossem concluídas.

Observação – essas atualizações foram feitas como teste extremo para avaliar se as alterações desse artigo são realmente válidas, não é algo que me parece sensato de fazer no dia a dia. Portanto se funcionou em casos extremos, deve facilitar muito nosso dia a dia com as pequenas atualizações quase diárias que são disponibilizadas pela maior parte das distribuições.

ARQUIVO .DEB PARA EFETUAR A CONFIGURAÇÃO DE FORMA AUTOMÁTICA

Se você quer utilizar dos benefícios listados nesse artigo sem ter trabalho, instale esse arquivo .deb e tudo estará pronto:

Esse arquivo .deb também irá aplicar as configurações do artigo anterior sobre melhorias na configuração do apt-get:

Caso esse link saia do ar procure por novas versões nos projetos União Livre/Kaiana.

Lembre que mesmo com todas as alterações propostas não são eliminados todos os problemas, ainda podem ocorrer problemas nas atualizações, porém de acordo com meus testes e experiência, existe uma redução gigantesca no número de problemas, acredito que mais de 80%.

Aguardo o retorno de vocês nos comentários desse artigo para ver o que mais pode ser aprimorado para tornar o processo de atualização das distribuições que utilizam .deb ainda mais prático.

Rolar para cima