Instalação Multi-Arquitetura Debian GNU/Linux
Introdução
Com a chegada dos sistemas com suporte a nova arquitetura AMD64, surge um período de transição, no qual diversos aplicativos desenvolvidos para a arquitetura 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 Flash ou o 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 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 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 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 remontados1) 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 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. Postfix) e no sistema IA-32 utilizar o 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 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. 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 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 chroot2). 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 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
- 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.