Pages

Friday, April 13, 2007

Atualizando o Ubuntu

Em poucos dias será liberada a mais nova versão do Ubuntu. Sempre fica a pergunta: atualizar ou não atualizar ? Mas eu não vou falar sobre isso. Vou considerar que a resposta é: sim, eu vou atualizar. Mas como ? E os softwares que eu tenho instalado ? Esse post pretende jogar uma luz nas possibilidades de atualização do sistema com o mínimo de esforço possível.

A primeira alternativa de um usuário é atualizar via instruções do wiki. Então, o usuário todo contente, depois de horas baixando os pacotes de atualização começa a atualizar (por "n" quaisquer formas) e encontra alguns problemas relacionados a atualização de alguns software. Ele se desespera. E de forma equivocada coloca a culpa no pessoal do Ubuntu. A verdade é que essas atualizações só fornecem alguma garantia "virtual" de funcionamento apropriado quando houver apenas pacotes dos repositórios oficiais e mantidos pela Canonical, do contrário, conte com a sorte e um bom jogo de cintura. Eu mesmo fiz isso por três gerações de Ubuntu, todas as vezes que eu atualizei tive algum tipo de problema contornável, mas que exigia mais energia do que normalmente eu estaria disposto a fornecer.

Bom, por algum motivo, você pensa: "quero atualizar, mas agora eu vou do zero".

A primeira reação é de desistir. Sim, imagine ter que instalar todos os softwares que você já tem instalado. Aliás, você sabe quais são eles ? Não ? Puxa, isso pode ser um problema. Como vai reinstalar tudo se não sabe quem está atualmente instalado ? Bom, eu digo que isso não é o real problema, mas então, como atualizar?

Considere que eu tenho uma instalação do ubuntu que utiliza apenas pacotes dos repositórios sobre o domínio archives.ubuntu.com e suas variantes de localização.

No terminal, digite:

dpkg --get-selections > meuspacotes.txt

Isso salva a lista de todos os pacotes que você tem atualizado atualmente no seu computador. Salve essa lista em uma lugar seguro (e-mail, pendrive, etc) e instale a nova versão normalmente (não se esqueça de fazer o backup do seu diretório Home, e de todos os arquivos que julgar necessário).

A reniciar o sistema as etapas e possibilidades aumentam, recupere a lista de pacotes de volta para o seu novo home ou onde julgar mais apropriado.

Uma das formas de reinstalar todos os pacotes é a seguinte: digite no terminal do diretório onde salvou a lista anterior

sudo dpkg --set-selections < meuspacotes.txt

Observe com cuidado a direção do redirecionamento ( < ).
Agora digite: sudo dselect

Dentro do menu selecione a opção correspondente a "Instalar e atualizar pacotes desejados"
Confirme o que for necessário (normalmente o download) e aguarde o fim do procedimento
Pronto. Todos os pacotes anteriormente instalados vão estar novamente disponíveis para uso.

Os problemas: Um pacote que normalmente dá problema com esse procedimento, é o kdelibs4c2a. Eu já vi essa pacote com tanto nome diferente na linha sucessória que eu simplesmente não consigo dizer que esse procedimento dá certo. Por isso mesmo eu não recomendo esse método. Sim, eu não recomendo. Apesar de ter sido criado para fazer isso, ele acabou gerando uma necessidade que ainda não foi completamente preenchida. Nomes de pacotes não podem carregar referências a versões. Do contrário, se na próxima versão do KDE o certo for instalar o kdelibs4c2b. Tudo foi por "água abaixo", especialmente porque ele deve ser conflitante com o kdelibs4c2a (isso aconteceu quando mudou de kdelibs4c2 para kdelibs4c2a).

Só para constar, eu mencionei isso aqui porque, como eu disse, é uma das técnicas usada para fazer isso, mas não é garantido.
Mas quando é garantido que funciona ? Na duplicação de instalações, ou seja, você instala uma do zero e replica em outra máquina, da mesma versão da primeira, a instalação de todos os pacotes usando esse procedimento. Claro que em um caso desses você não vai "se fazer" baixar tudo da internet novamente, não é ? Copie os .deb da primeira máquina para a segunda ou use qualquer outra solução que julgar necessária !

Oras, outra forma de fazer isso é transformando o arquivo "meuspacotes.txt" em um script de instalação. Como ele realmente é um arquivo de texto, edite ele removendo tudo que considerar desnecessário para a sua nova instalação, ou seja, remova todos os pacotes que considerar supérfluos ou que você não sabe porque está ali (se você não sabe porque ele está na lista, é porque é vem de uma dessas possibilidades: ou você instalou e não lembra nem o porque, ou ele veio com o CD do Ubuntu, ou ele foi instalado por causa de dependências, nos três casos é seguro remover os nomes dessa lista). Depois transforme essa lista em um script de instalação.

Uma das primeiras vantagens de usar um script é não ficar restrito ao um conjunto limitado de repositórios. Para muitos usuários isso pode ser importante.

Um exemplo de como ficaria esse script de instalação você pode ver aqui, do meu script. Eu frisei o meu porque os meus interesses podem ser bem diferentes dos seus. Ninguém é igual. Ele é só um exemplo de como você pode reorganizar a lista de pacotes em um script de instalação.

Mas a pergunta inevitável: Isso não dá muito trabalho ? Sim. Na primeira vez dará muito trabalho. Não tanto como está imaginando. Exemplo, remova da lista todas as lib*, normalmente esses pacotes são instalados como dependências. Só isso reduz muito a lista. Se conhecer um pouco de sed e/ou grep verá que o trabalho pode ser feito de forma muito mais tranqüila do que parece a primeira vista. Mas pense na recompensa de nunca mais precisar de fazer isso. Até porque você irá criar o hábito de adicionar o cada pacote que instalar no futuro a diretamente ao script de instalação, não sendo preciso repetir o processo.

Outra pergunta: Por que um pacote ou conjunto por linha ? Por que não uma linha só com todos os pacotes ? Porque é mais fácil gerenciar/selecionar o que eu quero instalar na máquina da universidade do que eu só vou instalar na máquina de casa. Porque quando eu forneço essa lista a outra pessoa, fica muito mais fácil para essa outra pessoa decidir o que ela quer do que ela não quer instalar (e me polpa muito esforço em tirar dúvidas sobre o que é cada pacote, já que eu pude adicionar uma pequena descrição do "o que é o que" no script). Porque se algum pacote troca de nome ou não estiver disponível implica que apenas aquele pacote apresentará algum problema, a instalação seguirá normalmente com os outros pacotes. O que chega a uma última pergunta (para quem não conhece o mínimo de shellscript).

O que aquele $* está fazendo ali ? O $* passa todos os argumentos do script para cada uma das linhas em que ele é usado. Dessa forma, ao usar o ./install.sh -y -d eu passo o -y e o -d para todas as linhas, isso permite baixar todos os pacotes sem perguntas para que eu faça uma instalação posterior mais monitorada. Mas a rigor permite passar qualquer argumento para o apt-get no interior do script.

Uma última recomendação é usar o script como root ou sudo, não como o usuário comum (apesar dos diversos 'sudo' no interior do script). Antes que me pergunte porque eu coloquei o sudo em todas as linhas, a resposta é que eu desabilito a requisição de senha para o uso desse script para meu usuário padrão. Como isso consiste em mais linhas de explicação, eu não vou explicar o como fiz isso, pode procurar o manual do sudo que está explicado lá. De qualquer forma o seu script não precisa ter o "sudo" antes de cada "apt-get".

Com isso a restauração de todos os softwares deve ser completada com sucesso com um mínimo de esforço.

Por fim, o título desse tópico poderia ser: "Como se organizar melhor para atualizar um sistema linux qualquer". Claro que o dselect, apt-get e o dpkg fica restrito aos Debian e similares, mas qualquer sistema possuí um gerenciador de pacotes e portanto é sempre possível criar um script similar para outros gerenciadores de pacotes, como yum. Também é sempre possível pegar a lista de pacotes do que já está instalado, mesmo que algumas dessas listas dêem mais trabalho ainda para editar.

Por fim Um lembrete, faça backup de todos os dados cruciais antes de qualquer atualização. Se possível, de todo o sistema.

1 comment:

  1. Rapaz, muito bom! Estou começando agora com o universo Ubuntu e seu post vai me salvar umas boas horas! Obrigado,

    Ved

    ReplyDelete