Migração do Debian Etch para o Debian Lenny
by (C) João Eriberto Mota Filho <eriberto (a) eriberto pro br>
Artigo criado em: 04 de dezembro de 2008.
Última atualização: veja o rodapé desta página.
Tiny URL ou bit.ly: http://tiny.cc/etch_to_lenny
O objetivo maior deste artigo é mostrar como um usuário do Debian pode migrar de uma versão para outra, superando os problemas que possam ser encontrados. Serão utilizados como base o Debian Etch 4.0 (versão estável nesta data) e o Debian Lenny (versão de teste congelada e já quase virando estável).
O Debian Etch instalado
Para escrever este artigo utilizei um Debian Etch, recém instalado e atualizado, contendo os seguintes pacotes:
- x-window-system
- kde
- kde-i18n-ptbr
- gnome
- iceweasel
- iceweasel-l10n-ptbr
- broffice.org
- apache2*
- sendmail
- php5*
- mysql-server*
- lighttpd*
- phpmyadmin
Configurando para migrar
A configuração para realizar a migração é simples. Basta editar o arquivo /etc/apt/sources.list e alterar os repositórios etch para lenny. Uma configuração típica para Etch seria:
deb http://ftp.us.debian.org/debian/ etch main deb-src http://ftp.us.debian.org/debian/ etch main deb http://security.debian.org/ etch/updates main contrib deb-src http://security.debian.org/ etch/updates main contrib
Para Lenny, ficaria da seguinte forma:
deb http://ftp.us.debian.org/debian/ lenny main deb-src http://ftp.us.debian.org/debian/ lenny main deb http://security.debian.org/ lenny/updates main contrib deb-src http://security.debian.org/ lenny/updates main contrib
A migração
Uma vez feita a alteração em /etc/apt/sources.list, basta executar:
# apt-get update # apt-get dist-upgrade
Mas nem tudo são flores... Agora vêm os problemas...
Os problemas e as mensagens solicitando decisões
Como já foi dito antes, nem tudo são flores. O Debian tenta ser perfeito. No entanto, isso é impossível, uma vez que vários fatores fogem do controle dos desenvolvedores. Ainda, várias vezes serão solicitadas decisões por parte do usuário. Durante o meu processo de upgrade, alguns problemas e mensagens apareceram. Vamos analisar cada um.
Mensagem dialog sobre o console-data
Esta mensagem refere-se ao mapa de teclado. Se o teclado estava funcionando normalmente na versão anterior, não há a necessidade de modificações. Assim, poderá ser utilizada a opção Não tocar no mapa de teclado.
Mensagem dialog sobre o phpmyadmin
Esta mensagem é bem específica e refere-se ao PHPMyAdmin. No caso, deverá ser selecionado o servidor de páginas específico.
As telas azuis do tipo dialog do Debian são geradas pelo sistema chamado Debconf. Há pouco tempo, uma decisão interna do Projeto Debian restringiu o uso indiscriminado de mensagens para os usuários, via Debconf. Em versões como o Woody e o Sarge, tínhamos um show de janelas Debconf. No documento Developer's Reference atual, disponível em http://www.debian.org/doc/developers-reference/index.html, consta: Since debconf appeared in Debian, it has been widely abused and several criticisms received by the Debian distribution come from debconf abuse with the need of answering a wide bunch of questions before getting any little thing installed. |
Mensagem dialog sobre a libc6
Esta é uma mensagem de alerta sobre a atualização da libc6, uma biblioteca básica e essencial em qualquer distribuição GNU/Linux. É altamente recomendável atualizar essa biblioteca.
Esta mensagem mostra que alguns textos ainda não estão totalmente traduzidos para o idioma português. A tradução de softwares é uma atividade que requer muitas pessoas dedicadas a isto. O Projeto Debian precisa de voluntários para tradução!!! Veja detalhes em http://www.debian.org/intl/l10n/ddtp. |
A conseqüência direta da atualização da libc6 é a necessidade de reiniciar alguns daemons. Surgirá a seguinte janela:
Novamente, é recomendável aceitar a opção default, ou seja, reiniciar os serviços mostrados.
Mensagem dialog sobre a libpam0g
Obviamente, deveremos aceitar com OK.
Aqui uma situação diferente: foi feita a tradução mas há alguns problemas de codificação de caracteres. |
Mensagem texto sobre o pacote mysql-common
Muitas mensagens, como a mostrada a seguir, aparecerão ao longo da atualização:
Setting up mysql-common (5.0.51a-18) ... Configuration file `/etc/mysql/my.cnf' ==> Modified (by you or by a script) since installation. ==> Package distributor has shipped an updated version. What would you like to do about it ? Your options are: Y or I : install the package maintainer's version N or O : keep your currently-installed version D : show the differences between the versions Z : background this process to examine the situation The default action is to keep your current version. *** my.cnf (Y/I/N/O/D/Z) [default=N] ?
Este tipo de mensagem aparece quando o pacote que está sendo atualizado possui um arquivo de configuração diferente da versão antiga. Com a mensagem mostrada, o usuário terá várias opções, como manter o arquivo de configuração atual ou usar o novo arquivo. Sempre escolha a opção Y, ou seja, instalar o arquivo de configuração referente ao novo pacote. Não se preocupe, pois o arquivo de configuração antigo, com a configuração feita pelo usuário, será mantido e, a ele, será acrescida a extensão dpkg-old.
A partir deste ponto, comece a anotar em um papel o nome de todos os arquivos que deverão ser reconfigurados. Já temos, então, o arquivo /etc/mysql/my.cnf. |
Mensagem texto sobre o pacote apache2.2-common
Setting up apache2.2-common (2.2.9-10) ... Installing new version of config file /etc/logrotate.d/apache2 ... Installing new version of config file /etc/apache2/envvars ... Configuration file `/etc/apache2/sites-available/default' ==> Modified (by you or by a script) since installation. ==> Package distributor has shipped an updated version. What would you like to do about it ? Your options are: Y or I : install the package maintainer's version N or O : keep your currently-installed version D : show the differences between the versions Z : background this process to examine the situation The default action is to keep your current version. *** default (Y/I/N/O/D/Z) [default=N] ?
Este caso é idêntico ao anterior. Escolha a opção Y. Anote mais este arquivo de configuração para revisar no fim da instalação.
Mensagem texto sobre o arquivo /etc/apache2/apache2.conf
Configuration file `/etc/apache2/apache2.conf' ==> Modified (by you or by a script) since installation. ==> Package distributor has shipped an updated version. What would you like to do about it ? Your options are: Y or I : install the package maintainer's version N or O : keep your currently-installed version D : show the differences between the versions Z : background this process to examine the situation The default action is to keep your current version. *** apache2.conf (Y/I/N/O/D/Z) [default=N] ?
Idem ao caso anterior.
Mensagem dialog sobre o arquivo /etc/php5/apache2/php.ini
Novamente temos uma mensagem sobre arquivo de configuração. No entanto, desta vez, a mesma foi mostrada pelo Debconf. É óbvio, neste ponto, que deve ser escolhida a opção instalar a versão do mantenedor do pacote. Novamente, deveremos anotar o nome do arquivo para revisões futuras.
Mensagem texto sobre o arquivo /etc/lighttpd/lighttpd.conf
Setting up lighttpd (1.4.19-5) ... Installing new version of config file /etc/lighttpd/conf-available/10-cgi.conf ... Installing new version of config file /etc/lighttpd/conf-available/10-fastcgi.conf ... Configuration file `/etc/lighttpd/lighttpd.conf' ==> Modified (by you or by a script) since installation. ==> Package distributor has shipped an updated version. What would you like to do about it ? Your options are: Y or I : install the package maintainer's version N or O : keep your currently-installed version D : show the differences between the versions Z : background this process to examine the situation The default action is to keep your current version. *** lighttpd.conf (Y/I/N/O/D/Z) [default=N] ?
Não esqueça de anotar o nome do arquivo. Tudo parecia bem. No entanto, não pude deixar de notar uma mensagem que correu na tela e quase não deu para ler:
Installing new version of config file /etc/lighttpd/lighttpd.conf ... Installing new version of config file /etc/init.d/lighttpd ... Installing new version of config file /etc/logrotate.d/lighttpd ... Starting web server: lighttpd2008-12-05 09:00:43: (network.c.300) can't bind to port: 80 Address already in use failed! invoke-rc.d: initscript lighttpd, action "start" failed. dpkg: error processing lighttpd (--configure): subprocess post-installation script returned error exit status 1 Setting up openoffice.org-help-pt-br (1:2.4.1-12) ...
A explicação para o erro mostrado é simples. Como um novo arquivo de configuração foi instalado, o Lighttpd tentou subir utilizando a porta 80, que já era do Apache2.
Mensagens texto sobre arquivos do PHPMyAdmin
Setting up phpmyadmin (4:2.11.8.1-4) ... Configuration file `/etc/phpmyadmin/config.footer.inc.php' ==> File on system created by you or by a script. ==> File also in package provided by package maintainer. What would you like to do about it ? Your options are: Y or I : install the package maintainer's version N or O : keep your currently-installed version D : show the differences between the versions Z : background this process to examine the situation The default action is to keep your current version. *** config.footer.inc.php (Y/I/N/O/D/Z) [default=N] ?
Novamente, selecionar Y e anotar o nome do arquivo. No entanto, após o Y, surgiu:
Installing new version of config file /etc/phpmyadmin/config.footer.inc.php ...
Configuration file `/etc/phpmyadmin/config.header.inc.php' ==> File on system created by you or by a script. ==> File also in package provided by package maintainer. What would you like to do about it ? Your options are: Y or I : install the package maintainer's version N or O : keep your currently-installed version D : show the differences between the versions Z : background this process to examine the situation The default action is to keep your current version. *** config.header.inc.php (Y/I/N/O/D/Z) [default=N] ?
Idem (anotar o nome do arquivo). A seguir:
Installing new version of config file /etc/phpmyadmin/config.header.inc.php ... Configuration file `/etc/phpmyadmin/config.inc.php' ==> File on system created by you or by a script. ==> File also in package provided by package maintainer. What would you like to do about it ? Your options are: Y or I : install the package maintainer's version N or O : keep your currently-installed version D : show the differences between the versions Z : background this process to examine the situation The default action is to keep your current version. *** config.inc.php (Y/I/N/O/D/Z) [default=N] ?
Idem. Depois:
Installing new version of config file /etc/phpmyadmin/config.inc.php ...
Configuration file `/etc/phpmyadmin/apache.conf' ==> File on system created by you or by a script. ==> File also in package provided by package maintainer. What would you like to do about it ? Your options are: Y or I : install the package maintainer's version N or O : keep your currently-installed version D : show the differences between the versions Z : background this process to examine the situation The default action is to keep your current version. *** apache.conf (Y/I/N/O/D/Z) [default=N] ?
Idem. :-)
O prompt final: problemas!!!
No fim da atualização, surgiu, antes do prompt final, a seguinte mensagem:
Errors were encountered while processing: lighttpd E: Sub-process /usr/bin/dpkg returned an error code (1) etch-lenny:~#
Como eu já havia relatado antes, pude notar, por acaso, que o Lighttpd não havia conseguido subir por causa de um conflito de porta. Para ter mais certeza sobre a situação, deveremos emitir o comando # apt-get dist-upgrade novamente. A mensagem de erro é bem clara:
etch-lenny:~# apt-get dist-upgrade Lendo listas de pacotes... Pronto Construindo árvore de dependências... Pronto Calculando atualização... Pronto 0 pacotes atualizados, 0 pacotes novos instalados, 0 a serem removidos e 0 não atualizados. 1 pacotes não totalmente instalados ou removidos. Depois desta operação, 0B adicionais de espaço em disco serão usados. Você quer continuar [S/n]? Configurando lighttpd (1.4.19-5) ... Starting web server: lighttpd2008-12-05 09:31:58: (network.c.300) can't bind to port: 80 Address already in use failed! invoke-rc.d: initscript lighttpd, action "start" failed. dpkg: erro processando lighttpd (--configure): sub-processo post-installation script retornou estado de saída de erro 1 Erros foram encontrados durante o processamento de: lighttpd E: Sub-process /usr/bin/dpkg returned an error code (1)
Ou seja, está confirmado que a porta 80 está sendo utilizada por outro processo (Apache2). A solução, deste caso em especial, é simples. Basta alterar o número da porta no arquivo de configuração /etc/lighttpd/lighttpd.conf (linha server.port) e reiniciar a atualização. A seguir, deveremos provocar o reinício da atualização, após a alteração do arquivo de configuração:
etch-lenny:~# apt-get dist-upgrade Lendo listas de pacotes... Pronto Construindo árvore de dependências... Pronto Calculando atualização... Pronto 0 pacotes atualizados, 0 pacotes novos instalados, 0 a serem removidos e 0 não atualizados. 1 pacotes não totalmente instalados ou removidos. Depois desta operação, 0B adicionais de espaço em disco serão usados. Você quer continuar [S/n]? Configurando lighttpd (1.4.19-5) ... Starting web server: lighttpd.'
Tudo ok. Chegamos ao fim da atualização do sistema. Veja:
etch-lenny:~# cat /etc/debian_version lenny/sid
O próximo passo será reconfigurar os arquivos de configuração. São eles:
- /etc/mysql/my.cnf
- /etc/apache2/sites-available/default
- /etc/apache2/apache2.conf
- /etc/php5/apache2/php.ini
- /etc/lighttpd/lighttpd.conf
- /etc/phpmyadmin/config.footer.inc.php
- /etc/phpmyadmin/config.header.inc.php
- /etc/phpmyadmin/config.inc.php
- /etc/phpmyadmin/apache.conf
Restaurando as configurações dos programas
A forma mais fácil de refazer a configuração dos programas é utilizando o comando diff com a opção -Naur. Anteriormente, eu havia dito que as configurações antigas seriam mantidas com a extensão .dpkg-old. Assim, basta comparar o arquivo antigo com o atual, para ver o que há de novo e as alterações realizadas anteriormente.
etch-lenny:~# diff -Naur /etc/mysql/my.cnf.dpkg-old /etc/mysql/my.cnf --- /etc/mysql/my.cnf.dpkg-old 2008-12-04 15:55:59.000000000 -0200 +++ /etc/mysql/my.cnf 2008-11-25 06:14:50.000000000 -0200 @@ -52,13 +52,16 @@ max_allowed_packet = 16M thread_stack = 128K thread_cache_size = 8 +# This replaces the startup script and checks MyISAM tables if needed +# the first time they are touched +myisam-recover = BACKUP #max_connections = 100 #table_cache = 64 #thread_concurrency = 10 # # * Query Cache Configuration # -query_cache_limit = 2M +query_cache_limit = 1M query_cache_size = 16M # # * Logging and Replication @@ -75,9 +78,10 @@ #log-queries-not-using-indexes # # The following can be used as easy to replay backup logs or for replication. +# note: if you are setting up a replication slave, see README.Debian about +# other settings you may need to change. #server-id = 1 -log_bin = /var/log/mysql/mysql-bin.log -# WARNING: Using expire_logs_days without bin_log crashes the server! See README.Debian! +#log_bin = /var/log/mysql/mysql-bin.log expire_logs_days = 10 max_binlog_size = 100M #binlog_do_db = include_database_name @@ -133,6 +137,7 @@ # # * IMPORTANT: Additional settings that can override those from this file! +# The files must end with '.cnf', otherwise they'll be ignored. # !includedir /etc/mysql/conf.d/
Seguindo os sinais + e -, é fácil deduzir o que deve ser alterado no novo arquivo. Provavelmente você lembrará das configurações realizadas, mesmo que isso tenha sido feito há algum tempo. No meu caso, no novo arquivo de configuração, terei que fazer, somente, a seguinte alteração:
query_cache_limit = 2M
As demais diferenças mostradas, na verdade, foram fruto da modificação da estrutura do arquivo de configuração por parte do desenvolvedor.
Casos diversos
Neste item foram analisadas algumas ocorrências de migração. É lógico que cada tipo de instalação e cada versão de sistema operacional irão gerar problemas e mensagens diferentes.
Possíveis erros e soluções
As fases do apt-get
Uma operação provida pelo comando apt-get, em resumo, possui as seguintes fases:
- download dos pacotes .deb (utilitário wget ou outro)
- descompressão dos pacotes (utilitário ar)
- instalação e configuração de cada pacote (utilitário dpkg)
Interrupção do download ou da descompressão
Caso haja a interrupção do download/descompressão dos pacotes, para continuar a operação, bastará emitir o comando # apt-get dist-upgrade novamente.
Interrupção da instalação ou da configuração
Caso haja uma interrupção durante a instalação/configuração de um pacote, para restabelecer a situação, bastará emitir o comando: # dpkg --configure -a.
Pacotes corrompidos
Caso seja dectado algum pacote corrompido, você poderá tentar realizar o download do mesmo novamente. Para isso, o pacote em questão deverá ser apagado da máquina. Os pacotes .deb baixados podem ser encontrados em /var/cache/apt/archives/. Uma outra solução seria um # apt-get clean. No entanto, isto irá apagar todos os arquivos e provocar um novo download dos mesmos. Não vale a pena fazer isso se você não tiver um repositório local.
Pacotes causando problemas na configuração final do sistema
Este é o pior problema que pode ocorrer. Durante a instalação de um pacote, algumas ações poderão ocorrer. São elas, em ordem cronológica:
- preinst: ações que ocorrem depois do download e antes da instalação do pacote.
- postinst: ações que ocorrem depois da instalação do pacote.
Ainda, existem mais duas ações possíveis, ligadas à remoção de um pacote: São elas:
- prerm: ações que ocorrem antes da remoção de um pacote.
- postrm: ações que ocorrem depois da remoção de um pacote.
Os scripts preinst, postinst, prerm e postrm são escritos, geralmente, em shell. |
Um exemplo prático. Ao instalarmos um servidor de páginas, como o Apache2 ou o Lighttpd, no fim da instalação, o mesmo é colocado no ar. Isso é feito por um postinst. Ao desinstalar tal servidor, o mesmo é retirado do ar antes da sua remoção. Isso é um prerm.
Todos os arquivos de ações pre* e post* podem ser encontrados em /var/lib/dpkg/info/. |
A seguir, um exemplo de postinst (do Lighttpd versão 1.4.19-5):
# cat /var/lib/dpkg/info/lighttpd.postinst #! /bin/sh -e # postinst script for lighttpd if [ "$1" = "configure" ]; then if [ ! -r /var/www/index.lighttpd.html ]; then cp /usr/share/lighttpd/index.html /var/www/index.lighttpd.html fi mkdir -p /var/run/lighttpd > /dev/null 2> /dev/null chown www-data:www-data /var/log/lighttpd /var/run/lighttpd chown www-data:www-data /var/cache/lighttpd /var/cache/lighttpd/compress /var/cache/lighttpd/uploads chmod 0750 /var/log/lighttpd /var/run/lighttpd fi update-alternatives \ --install /usr/bin/spawn-fcgi \ spawn-fcgi /usr/bin/spawn-fcgi.lighttpd 20 \ --slave /usr/share/man/man1/spawn-fcgi.1.gz \ spawn-fcgi.1.gz /usr/share/man/man1/spawn-fcgi.lighttpd.1.gz # Automatically added by dh_installinit if [ -x "/etc/init.d/lighttpd" ]; then update-rc.d lighttpd defaults >/dev/null if [ -x "`which invoke-rc.d 2>/dev/null`" ]; then invoke-rc.d lighttpd start || exit $? else /etc/init.d/lighttpd start || exit $? fi fi # End automatically added section exit 0
Observe as linhas que vêm depois de # Automatically added by dh_installinit. Elas são responsáveis por colocar o servidor no ar.
Os maiores e mais complexos problemas de instalação e migração ocorrem por causa de postinsts mal feitos, principalmente em pacotes que estejam nas releases unstable e testing. Para uma experimentação prática, faça o seguinte:
- Baixe o pacote teste ( http://www.eriberto.pro.br/debian/teste_0.1-1_all.deb ). Este pacote contém um erro de construção que irá causar um problema de instalação.
- Instale o pacote com o comando # dpkg -i teste_0.1-1_all.deb. É necessário usar o comando dpkg ao invés de apt-get porque o pacote em questão foi baixado localmente e não está nos repositórios Debian.
Após a tentativa de instalação do pacote, as seguintes mensagens surgirão:
# dpkg -i teste_0.1-1_all.deb Selecionando pacote previamente não selecionado teste. (Lendo banco de dados ... 138058 arquivos e diretórios atualmente instalados). Desempacotando teste (de /tmp/teste_0.1-1_all.deb) ... Configurando teste (0.1-1) ... /var/lib/dpkg/info/teste.postinst: line 7: chowm: command not found dpkg: erro processando teste (--install): sub-processo post-installation script retornou estado de saída de erro 127 Erros foram encontrados durante o processamento de: teste
Repare na linha em negrito: houve erro na linha 7 do arquivo /var/lib/dpkg/info/teste.postinst. Uma vez que houve uma tentativa de instalação, o referido arquivo, a partir de agora, está disponível localmente. Vamos analisar tal arquivo, com a atenção voltada para a linha 7:
1 #!/bin/sh 2 # postinst script for teste 3 # by Eriberto 4 # see: dh_installdeb(1) 5 6 set -e 7 chowm users:users /usr/bin/teste 8 9 exit 0
No caso, fica claro que o comando deveria ser chown e não chowm. Assim, é fácil solucionar o problema. Siga os seguintes passos:
- Edite o arquivo /var/lib/dpkg/info/teste.postinst.
- Na linha 7, altere a palavra chown para chowm.
- Salve o arquivo e saia do editor de textos.
- Execute o comando # apt-get install -f, para forçar o térnimo da instalação do pacote.
- Execute o comando # apt-get upgrade, para terminar o upgrade de algum pacote que tenha ficado para trás.
Com os procedimentos mostrados, será possível corrigir falhas que, geralmente, são encontradas em pacotes das releases testing e unstable. É lógico que saber um pouco de shell script ajuda bastante. Mas, em situações extremas, caso não se saiba o que está acontecendo, apesar de NÃO SER ACONSELHÁVEL, você poderá comentar as linhas problemáticas ou inserir um exit 0 logo no início do script. Mas repito: isso é a última coisa a se fazer, pois o ideal é consertar o erro e abrir um bug no Debian, indicando a solução.
Instalação de pacotes via DPKG
Apenas como curiosidade, vou comentar uma forma fácil de instalar pacotes que possuam dependências, via dpkg. Inicialmente, execute um # dpkg -i <nome do pacote>.deb. Se for dito que o mesmo não pode ser instalado porque possui dependências, execute # apt-get install -f para instalar as dependências e, depois, o pacote.
Veja também
Comentários, sugestões e controle de acessos
Por favor, deixe os seus comentários e sugestões sobre este artigo no meu Blog Técnico. Para isto, clique aqui.
<absHTML>
</absHTML>