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.

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