====== Instalação Multi-Arquitetura Debian GNU/Linux ====== ===== Introdução ===== Com a chegada dos sistemas com suporte a nova arquitetura [[wppt>AMD64]], surge um período de transição, no qual diversos aplicativos desenvolvidos para a arquitetura [[wppt>X86|IA-32]] ainda não foram portados para a nova arquitetura. Portanto, muitas vezes não é possível executar um sistema 100% AMD64, devido a necessidade de se executar programas x86, como o [[wppt>Adobe_Flash|Flash]] ou o [[http://www.opera.com/|Opera]]. Neste cenário, é possível configurar um sistema que possua duas instalações completas, uma para cada arquitetura, de forma praticamente transparente para os usuários. Assim, é possível usufruir simultaneamente das vantagens da nova arquitetura AMD64 e ainda sim poder contar com toda a gama de aplicativos disponíveis apenas para x86. Importante notar que o artigo está focado em sistemas [[http://www.debian.org/|Debian]], mas os conceitos aqui apresentados se aplicam a qualquer distribuição Linux. ===== Instalação ===== ==== AMD64 ==== Um sistema AMD64 completo deve ser instalado inicialmente no equipamento. Este sistema deverá contar com uma kernel que suporte executar tanto binários AMD64 quanto X86 (as distribuídas pelo Debian já suportam). ==== IA-32 ==== Uma vez que se tenha o sistema AMD64 funcionando, deve-se instalar um sistema IA-32 em um diretório arbitrário. Os sistema Debian contam com um utilitário chamado [[http://packages.debian.org/stable/admin/debootstrap|debootstrap]] que executa um processo similar ao executado durante a instalação do sistema, porém de dentro de um sistema já em execução: # mkdir /ia32 # debootstrap --arch i386 --verbose etch /ia32 http://ftp.br.debian.org/debian Neste caso, será instalado um sistema Debian básico IA-32 em ''/ia32''. Este diretório será a raiz do novo sistema, apesar de não estar na raiz do sistema AMD64. Por exemplo, teremos o ''/etc'' que é do sistema AMD64 e o ''/ia32/etc'' que é do sistema IA-32. O acesso a este sistema IA-32 será feito via chroot, conforme explicado a seguir. ===== Configuração ===== ==== Rede ==== As configurações de rede devem ser compartilhadas pelos dois sistemas. Para tal, alguns arquivos do chroot devem ser substituídos por //links// simbólicos para o sistema raiz conforme a tabela a seguir: ^ Arquivo ^ //Link// simbólico ^ | ''/ia32/etc/hostname'' | ''../amd64/etc/hostname'' | | ''/ia32/etc/hosts'' | ''../amd64/etc/hosts'' | | ''/ia32/etc/hosts.allow'' | ''../amd64/etc/hosts.allow'' | | ''/ia32/etc/hosts.deny'' | ''../amd64/etc/hosts.deny'' | | ''/ia32/etc/resolv.conf'' | ''../amd64/etc/resolv.conf'' | | ''/ia32/etc/networks'' | ''../amd64/etc/networks'' | Exemplo: # ln -sf ../amd64/etc/hostname /ia32/etc/hostname ==== Usuários e Grupos ==== É importante que a base de dados de usuários e grupos seja **exatamente** a mesma para os dois sistemas. Uma maneira de fazer isso, é substituir os arquivos de usuários e senhas do chroot IA-32 por //links// simbólicos para arquivos do sistema AMD64 conforme a tabela a seguir: ^ Arquivo ^ //Link// simbólico ^ | ''/ia32/etc/passwd'' | ''../amd64/etc/passwd'' | | ''/ia32/etc/shadow'' | ''../amd64/etc/shadow'' | | ''/ia32/etc/group'' | ''../amd64/etc/group'' | | ''/ia32/etc/gshadow'' | ''../amd64/etc/gshadow'' | Exemplo: # ln -sf ../amd64/etc/passwd /ia32/etc/passwd **IMPORTANTE:** OS UTILITÁRIOS DE MANUTENÇÃO DESTES ARQUIVOS (EX. ''passwd(1)'') **NÃO** ESTÃO PREPARADOS PARA LIDAR COM //LINKS// SIMBÓLICOS. TENHA CERTEZA DE QUE APÓS QUALQUER ALTERAÇÃO DESTES ARQUIVOS DENTRO DO CHROOT (ESPECIALMENTE APÓS A INSTALAÇÃO DE PROGRAMAS), ELES CONTINUEM COMO //LINKS// SIMBÓLICOS. Uma solução mais "correta" seria utilizar alguma ferramenta como o [[wppt>NIS]], configurando para que o mestre seja o sistema raiz e o escravo o sistema IA-32, para 100% do conteúdo. ==== Inicialização ==== Para garantir transparência na operação dentro e fora do chroot, alguns caminhos do sistema AMD64 devem ser remontados((Veja a opção ''--bind'' do comando ''mount''.)) dentro do sistema IA-32. Também será necessário que alguns serviços sejam inicializados dentro do sistema IA-32. Para conseguir isso, pode-se criar dois arquivos na inicialização do sistema AMD64, que seão responsáveis pelos serviços IA-32. O primeiro arquivo, deverá ser criado em ''/etc/init.d/ia32S.sh'' (com permissão 755) com o seguinte conteúdo: #!/bin/bash IA32_PATH="/ia32" IA32_SERVICES="screen-cleanup xfree86-common sudo" case "$1" in start) echo -n "Mounting IA-32 filesystems " for p in /dev /home /proc /root /sys /tmp /var/mail /var/tmp ; do mount -n -o rbind "$p" "$IA32_PATH""$p" done if [ ! -e "$IA32_PATH"/amd64 ] ; then mkdir "$IA32_PATH"/amd64 fi mount -n -o rbind / "$IA32_PATH"/amd64 echo OK echo "Starting IA-32 services..." for SERVICE in $IA32_SERVICES ; do dchroot -q -c ia32 "/etc/init.d/$SERVICE start" done echo "Finished starting IA-32 services." ;; *) echo "Error: Wrong usage." 1>&2 exit 1 ;; esac E adicionado a inicialização: # update-rc.d ia32S.sh start 99 S . Este script irá: * Remontar alguns diretórios do sistema AMD64 dentro do sistema IA-32 (incluindo a raiz ''/'' em ''/ia32/amd64''. * Inicializar alguns serviços específicos dentro do chroot (variável ''IA32_SERVICES''). Os diretórios remontados servem para que existam os sistemas de arquivos virtuais (ex. sysfs e procvs) no chroot, diretórios pessoais sejam mantidos dentro e fora do chroot, diretórios temporários sejam compartilhados (especialmente o ''/tmp'' para que aplicativos X se conectem sempre com os mesmos //sockets UNIX//) e para que os usuários acessem a mesma caixa postal. Os serviços a serem inicializados (''IA32_SERVICES'') dependem do que se tem instalado dentro do chroot. Os que tem no exemplo são apenas como referência. Você deverá olhar em ''/ia32/rcS.d/'' do seu sistema e decidir quais deles devem ser executados. Alguns que **não** devem ser executados são: mountvirtfs, bootlogd, keymap.sh, checkroot.sh, hwclockfirst.sh, ifupdown-clean, checkfs.sh, procps.sh, mountall.sh, mountvirtfs, ifupdown, hostname.sh, networking, mountnfs.sh, console-screen.sh, hwclock.sh, bootmisc.sh e urandom. Alguns serviços devem ser executados dentro do chroot, para garantir seu funcionamento. Em especial, o cron deverá ser executado, pois diversas tarefas de rotatividade de log são executadas por ele. Para configurar os serviços, crie o arquivo (na raiz AMD64) ''/etc/init.d/ia32.sh'' (com permião 755): #!/bin/bash IA32_SERVICES="nullmailer atd cron" case "$1" in start) echo "Starting IA-32 services..." for SERVICE in $IA32_SERVICES ; do dchroot -q -c ia32 "/etc/init.d/$SERVICE start" done echo "Finished starting IA-32 services." ;; stop) echo "Stopping IA-32 services..." for SERVICE in $IA32_SERVICES ; do dchroot -q -c ia32 "/etc/init.d/$SERVICE stop" done ;; *) echo "Error: Wrong usage." 1>&2 exit 1 ;; esac E adicionado a inicialização: # update-rc.d ia32.sh defaults 99 1 A variável ''IA32_SERVICES'' deverá ser acertada para os serviços que deverão ser inicializados. É recomendado que os serviços no exemplo acima sejam sempre inicializados (o nullmailer será discutido [[#MTA|adiante]]). ==== MTA ==== Para garantir a entrega de e-mails tanto dentro do chroot IA-32 quanto fora, pode-se configurar algum MTA qualquer no sistema AMD64 (ex. [[http://www.postfix.org/|Postfix]]) e no sistema IA-32 utilizar o [[http://packages.debian.org/stable/mail/nullmailer|nullmailer]]. Configura-se então o nullmailer para encaminhar mensagens para o //smart host// ''localhost'' (onde o Postfix do sistema AMD64 deverá estar ouvindo na porta 25). Para tal, crie o arquivo ''/etc/nullmailer/remotes'' contendo somente a linha: localhost Nenhum outro arquivo deverá existir em ''/etc/nullmailer''. Note também que o diretório ''/var/spool/mail'' foi remontado no chroot. Portanto, usuários poderão checar e-mails normalmente em qualquer sistema. Coloque também o nullmailer para ser [[#Inicialização|inicializado]] automaticamente. ==== cron / at ==== É interessante que tanto o sistema AMD64 quanto o IA-32 tenham seus agendadores de tarefas sendo executados separadamente durante a [[#Inicialização|inicialização]]. Isso garante que todas as rotinas de manutenção sejam executadas corretamente nos dois sistemas. ==== /etc/mtab do IA-32 ==== O arquivo ''/etc/mtab'' é utilizado para informar aos programas sobre os sistemas de arquivos montados. Este arquivo dentro do chroot IA-32 não deverá estar coerente. Portanto, será necessário acertar manualmente o arquivo para refletir os sistemas de arquivos montados e acessíveis de dentro do chroot. A melhor maneira de fazer isso, é configurar tudo até o final deste artigo, fazer um reinício de máquina para testar tudo, acessar o chroot com o ''dchroot'', verificar o ''/proc/mounts'' para ver o que há montado e corrigir o ''/etc/mtab'' do sistema IA-32. Confirme com o comando ''df'' se tudo está correto. ==== locate ==== A seguinte linha teve de ser corrigida no sistema AMD64: PRUNEPATHS="/tmp /usr/tmp /var/tmp /afs /amd /alex /var/spool /sfs /media /ia32/dev /ia32/home /ia32/proc /ia32/amd64 /ia32/root /ia32/sys /ia32/tmp /ia32/var/mail /ia32/var/tmp" do arquivo ''/etc/updatedb.conf'' para evitar recursividade na base de dados do [[http://packages.debian.org/stable/utils/findutils|locate]]. Similarmente dentro do chroot IA-32: PRUNEPATHS="/tmp /usr/tmp /var/tmp /afs /amd /alex /var/spool /sfs /media /amd64" ==== Acesso ao chroot IA-32 ==== O acesso ao sistema IA-32 é garantido via chroot((Recurso que permite mudar a raiz do sistema (''/'') para outro diretório (ex: ''/ia32'') para um dado processo e seus filhos.)). O comando ''chroot(8)'' (comum a qualquer distribuição) poderá dar acesso ao novo sistema apenas ao ''root''. Sistemas Debian vem com um utilitário chamado [[http://packages.debian.org/stable/admin/dchroot|dchroot]], que permite garantir acesso a um chroot para usuários não privilegiados. O utilitário é configurado pelo arquivo ''/etc/dchroot.conf''. Acrescente uma linha como esta: ia32 /ia32 Isso permitirá que qualquer usuário do sistema (mesmo não privilegiados) possam acessar o chroot IA-32 com o comando: $ dchroot -d -c ia32 [comando] O comando ''[comando]'' será executado dentro do chroot IA-32. Ou seja, o ''[comando]'' irá enxergar ''/ia32'' como a raiz do sistema, e não mais ''/''. Para ele, tudo se passa como se estivesse sendo executado um sistema IA-32 completo, sem sequer a ciência de que existe uma outra instalação AMD64 na mesma máquina. A ausência do parâmetro ''[comando]]'' irá abrir um //Shell// dentro do sistema IA-32. Agora basta instalar tudo que se precise no sistema AMD64 e apenas os aplicativos necessários dentro do chroot IA-32. Tenha cuidado para estar executando os comandos no ambiente correto! ===== Limitações ===== * Novos pontos de montagem na raiz não irão estar disponíveis para aplicativos executados dentro do chroot, a menos que o administrador re-monte o ponto de montagem manualmente dentro do chroot. Uma possível solução seria utilizar um aplicativo preso ao [[http://packages.debian.org/stable/admin/udev|udev]] ou ao [[http://packages.debian.org/stable/admin/hal|HAL]] para automatizar isso. * O conjunto de //software// disponível dentro e fora do chroot não necessariamente será o mesmo. É interessante que o administrador mantenha as mesmas versões dos programas nos dois sistemas para evitar inconsistências. * Entradas nos sistemas de menu do Debian, FreeDesktop.org, GNOME ou KDE são específicas de cada instalação. Seria interessante desenvolver algum aplicativo para adicionar entradas nos menus do sistema AMD64 referentes aos programas do sistema IA-32 (e chamá-los com o ''dchroot''). * De dentro do sistema AMD64 é fácil inicializar algum aplicativo dentro do chroot IA-32 (utilizando o dchroot). O contrário não é válido e não existe solução até o momento.