Migração do Debian Etch para o Debian Lenny

De Eriberto Wiki
Ir para navegação Ir para pesquisar

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
Os pacotes marcados com asteriscos tiveram as suas configurações default alteradas para simular sistemas em produção. O Lighttpd, por exemplo, teve a sua porta alterada de 80 para 8080, a fim de não conflitar com o Apache2. Também foi criado um pequeno banco no MySQL. Após um # apt-get clean, o total de disco utilizado foi de 2.5 GB.


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
Evite utilizar a palavra testing para referenciar repositórios. Se for utilizada a palavra lenny, depois da estabilização do mesmo no Debian (Debian Stable), o Debian continuará a ser Lenny. Se for utilizada a palavra testing, após a estabilização do Lenny, o Debian passará a ser o Squeeze, que será o novo testing (depois da estabilização do Lenny).



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/
Com o parâmetro -Naur, o diff mostra as inclusões utilizando o sinal adição (+) e as exclusões com o sinal de subtração (-). As linhas antes e depois das alterações (geralmente três linhas) servem para balizar a área alterada.

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.

Caso tenham sido alterados arquivos de configuração que você desconheça ou tenha a certeza de nada ter feito neles, ignore-os. Com certeza, a instalação de um novo arquivo de configuração se deu por causa de alguma alteração estrutural 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>

<a href="http://www4.clustrmaps.com/user/1ff732c8"><img src="http://www4.clustrmaps.com/stats/maps-no_clusters/www.eriberto.pro.br-wiki-index.php-title=Migracao_do_Debian_Etch_para_o_Debian_Lenny-thumb.jpg" alt="Locations of visitors to this page" /> </a>


Consulte também o contador abaixo, iniciado em 04 dez. 08, além do gráfico acima.

</absHTML>