O que é esta multi-arquitetura ("Multiarch")?
A multi-arquitetura 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 earmhf são architectures diferentes, embora elas usem (próximo o bastante) o mesmo conjunto de instruções, porque elas têm ABIs diferentes de chamada de biblioteca. )
Os pacotes agora podem ser especificados como "package:architecture" em paticamente qualquer lugar onde antes era apenas "package", 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 simples nome "package" 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 multi-arquitetura.
Pacotes já existentes funcionam bem em um ambiente multi-arquitetura, como antes, mas para ter os benefícios de co-instalação ou dependências de arquiteturas cruzadas, muito pacotes precisam ser feitos para multi-arquitetura.
- 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 pacotes de uma arquitetura diferente (por exemplo, "make:amd64" irá satisfazer uma dependência do make 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 multi-arquitetura. Veja a especificação da multi-arquitetura 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 multi-arquitetura.
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 multi-arquitetura 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 à multi-arquitetura 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 multi-arquitetura), 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 multi-arquitetura for habilitada) durante as atualizações, quando não for dito qual o pacote de arquitetura deve ser configurado pelo apt.
Por exemplo:
dpkg: erro: --configure precisa de um nome de pacote válido mas 'gcc-4.7-base' não é: nome de pacote ambíguo 'gcc-4.7-base' com mais de uma instância instalada
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 <arch>
Por exemplo:
dpkg --add-architecture armhf
Para remover uma arquitetura:
dpkg --remove-architecture <arch>
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=<arch> para definir a arquitetura padrão ou -o APT::Architectures="<arch> <arch>".
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 não é normalmente 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://uk.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 que significa que pondo "arch=armel,armhf" em uma linha não funciona - 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 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 "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 ele 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