O que é esta multiarquitetura ("Multiarch")?
A multiarquitetura permite que você instale pacotes de múltiplas arquiteturas em uma mesma máquina. Isso é útil de diversas formas, mas a mais comum é instalar tanto software de 64 quanto 32 bits na mesma máquina e ter as dependências resolvidas corretamente de forma automática. Em geral, você pode ter bibliotecas de mais de uma arquitetura instaladas juntas e aplicativos de uma arquitetura ou de outra instalados como alternativas.
Conceitos
Existe uma arquitetura da máquina atual, como é mostrada pelo dpkg --print-architecture. Ela está incorporada ao pacote dpkg instalado atualmente.
(Observe que "architecture" aqui na realidade se refere a uma "ABI" (Interface Binária de Aplicação), não um conjunto de instruções (ISA). Então, por exemplo, "armel" e "armhf" são "arquiteturas" diferentes, embora elas usem (próximo o bastante) o mesmo conjunto de instruções, porque elas têm ABIs de chamada de biblioteca diferentes.)
Os pacotes agora podem ser especificados como "pacote:arquitetura" em paticamente qualquer lugar onde antes era apenas "pacote", então nós temos libc:i386 e libc:amd64. Infelizmente, as semânticas do dpkg e apt são ligeiramente diferentes, por isso você pode obter resultados diferentes, mas deve ser sempre seguro e sem ambiguidades para pacotes qualificados por arquitetura. O nome apenas "pacote" refere-se à arquitetura atual da máquina no apt.
Outras arquiteturas disponíveis são mostradas pelo dpkg --print-foreign-architectures. O dpkg gerenciará pacotes para essas arquiteturas assim como a arquitetura da máquina.
Existe um cabeçalho "Multi-Arch" no meta-dado de qualquer pacote feito para multiarquitetura.
Pacotes já existentes funcionam bem em um ambiente multiarquitetura, como antes, mas para ter os benefícios de co-instalação ou dependências de arquiteturas cruzadas, muito pacotes precisam ser feitos para multiarquitetura.
- Para um pacote não modificado você pode escolher qual versão de arquitetura do pacote deve ser instalada (por exemplo, "amd64" ou "i386").
Se um pacotes é marcado como "Multi-Arch: foreign", então ele pode satisfazer dependências de um pacote de uma arquitetura diferente (por exemplo, "libglib2.0-bin:amd64" irá satisfazer uma dependência da libglib2.0-bin para pacote de qualquer arquitetura).
Para possibilitar que mais de uma versão de arquitetura de um pacote seja instalada ao mesmo tempo (geralmente bibliotecas e pacotes -dev), os arquivos precisam ser movidos para que eles não choquem. Esses pacotes são marcados como "Multi-Arch: same".
Também exitem pacotes marcados como "Multi-Arch: allowed", que podem ser tratados tanto como ":same" quanto ":foreign", dependendo da forma como ele são dependentes.
Empacotadores estão atualmente trabalhando na distribuição, começando com os pacotes mais úteis para convertê-los para multiarquitetura. Veja a especificação da multiarquitetura e o howto de implementação para detalhes de como tudo funciona de fato, e como atualizar pacotes para tirar vantagem da funcionalidade.
Disponibilidade
Você precisa de um dpkg e apt que entendam multiarquitetura.
No dpkg do Debian isso está presente desde a versão 1.16.2. No Ubuntu isso está presente desde a natty (v1.15.8.10ubuntu1). Verifique vendo se o dpkg --print-foreign-architectures é entendido.
O apt entende multiarquitetura se suporta a opção -o APT::Architectures. Isso está disponível da versão 0.8.13 em diante. Porém, há muitas melhorias relacionadas à multiarquitetura e correções de bugs nas versões posteriores do apt (algumas são exigidas pela versão 1.16.2 do dpkg do Debian para habilitar adequadamente a multiarquitetura), tais como suporte a dependências cruzadas apt-get build-dep -a <arquitetura> <pacote>. Então, em geral, a versão posterior é melhor, pelo menos acima da 0.9.4.
Antes do apt 0.9, no Debian, o dpkg pode ficar emperrado (mas apenas se a multiarquitetura for habilitada) durante as atualizações, quando não for dito qual o pacote de arquitetura deve ser configurado pelo apt.
Por exemplo:
dpkg: error: --configure needs a valid package name but 'gcc-4.7-base' is not: ambiguous package name 'gcc-4.7-base' with more than one installed instance
Executando dpkg --configure -a corrigirá isso.
Uso
Configurando arquiteturas
Para adicionar uma arquitetura extra (no Debian, do dpkg 1.16.2 em diante):
dpkg --add-architecture <arquitetura>
Por exemplo:
dpkg --add-architecture armhf
Para remover uma arquitetura:
dpkg --remove-architecture <arquitetura>
As arquiteturas do dpkg são armazenadas em /var/lib/dpkg/arch.
Observe que o dpkg do Ubuntu na natty (1.16.0~ubuntu7 (relatórios 1.15.8.10)), oneiric e precise (1.16.1.2ubuntu7) usa uma sintaxe diferente:
echo "foreign-architecture armhf" > /etc/dpkg/dpkg.cfg.d/architectures
Configurando fontes do apt
O padrão do apt é usar o conjunto de arquiteturas relatado pelo dpkg, e qualquer linha de arquitetura não qualificada em /etc/apt/sources.list, que normalmente é o que você quer. Isso pode ser sobrescrito usando a opção -o APT::Architecture=<arquitetura> para definir a arquitetura padrão ou -o APT::Architectures="<arquitetura> <arquitetura>".
O arquivo de fontes do apt pode ser qualificado por arquitetura com a sintaxe abaixo. Isso é muito útil na divisão de repositórios do Ubuntu. Isso normalmente não é necessário no Debian, a menos que o seu repositório normal não faça espelho das arquiteturas extras nas quais você está interessado.
deb [arch=amd64,i386] http://br.archive.ubuntu.com/ubuntu/ quantal main universe deb [arch=armel,armhf] http://ports.ubuntu.com/ubuntu-ports quantal main universe
Linhas deb-src qualificadas por arquiteturas não fazem nenhum sentido.
Observação: Existe um bug nas versões do apt >=0.9.7 e <0.9.7.2 o qual significa que não funcionou ao colocar "arch=armel,armhf" em uma linha - você precisa de duas entradas separadas.
Não esqueça de executar apt-get update após adicionar novas arquiteturas.
Instalando/removendo pacotes
Para instalar um pacote de uma arquitetura que não seja padrão, apenas especifique essa arquitetura na linha de comando:
apt-get install pacote:arquitetura
As dependências dos pacotes serão instaladas automaticamente para as arquiteturas corretas (dependências de biblioteca para a mesma arquitetura, outras dependências para uma arquitetura diferente). Por exemplo:
apt-get install links:i386
dpkg -i pacote_versão_arquitetura.deb dpkg -r pacote:arquitetura
Instalando dependências cruzadas
Para instalar dependências para construção de um pacote, antes da construção cruzada ("cross-building") execute:
apt-get build-dep -a <arquitetura> <pacote>
Isso funciona apenas quando todos os pacotes de ferramentas dependentes são marcados como Multi-Arch: foreign, quaisquer bibliotecas dependentes que também sejam necessárias na máquina de construção ("BUILD"), e pacotes -dev que são necessários tanto para a arquitetura HOST quanto a BUILD sejam feitos como co-instaláveis. ("Multi-Arch: same" com os paths qualificados por arquitetura), e quaisquer exceções às regras padrão são marcadas como "package:any" ou "package:native" no fonte do pacote. Esse processo está em andamento.
Quando não funcionar, você geralmente pode obter as dependências instaladas executando o apt-get na linha de comando. Por exemplo, ao invés de:
apt-get build-dep -a armhf acl
fazer:
apt-get install autoconf automake debhelper gettext libtool libattr1-dev:armhf
Os detalhes de como isso é resolvido estão em https://wiki.ubuntu.com/MultiarchCross
