O que é essa 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.
Availability
You need a multiarch-aware dpkg and apt.
In Debian dpkg this is present since 1.16.2. In Ubuntu this is present since natty (v1.15.8.10ubuntu1). Check by seeing if dpkg --print-foreign-architectures is understood.
Apt is multiarch-aware if it supports -o APT::Architectures. This is available from version 0.8.13 onwards. However there are many multiarch-related improvements and bug-fixes in later apt versions (some required by Debian dpkg 1.16.2 to properly enable multiarch), such as apt-get build-dep -a cross-dependency support, so the later the better in general up to at least 0.9.4.
Prior to apt 0.9 in Debian, dpkg can get stuck (but only if multiach is enabled) during upgrades when it is not told which arch package it should be configuring by apt. (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) dpkg --configure -a will unbung this.
Usage
Configuring architectures
To add an extra architecture (in Debian from dpkg 1.16.2 onwards):
dpkg --add-architecture <arch>
e.g.
dpkg --add-architecture armhf
To remove an achitecture
dpkg --remove-architecture <arch>
dpkg architectures are stored in /var/lib/dpkg/arch.
Note that the Ubuntu dpkg in natty (1.16.0~ubuntu7 (reports 1.15.8.10)), oneiric and precise (1.16.1.2ubuntu7) uses a different syntax:
echo "foreign-architecture armhf" > /etc/dpkg/dpkg.cfg.d/architectures
Setting up apt sources
Apt defaults to using the set of architectures reported by dpkg, and any unqualified architecture deb lines in /etc/apt/sources.list, which is usually what you wanted. This can be overridden using APT::Architecture=<arch> to set the defalt architecture or APT::Architectures="<arch> <arch>".
apt-sources can be architecture qualified with this syntax. This is very useful on Ubuntu's split archive. It is not normally necessary on Debian unless your normal archive does not mirror the extra architectures you are interested in.
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
Arch-qualifying deb-src lines doesn't make any sense.
Note: There is a bug in apt versions >=0.9.7 and <0.9.7.2 which means that putting 'arch=armel,armhf' on one line didn't work - you needed two separate entries.
Don't forget to apt-get update after adding new architectures.
Installing/removing packages
To install a package of the non-default architecture just specify that architecture on the command line:
apt-get install package:architecture
That package's dependencies will be installed automatically for the correct architectures (same-arch library deps, machine-arch for other deps) e.g
apt-get install links:i386
dpkg -i package_version_architecture.deb dpkg -r package:architecture
Installing cross-dependencies
To install build-dependencies of a package before cross-building:
apt-get build-dep -a <arch> <package>
This only works when all the 'tools' packages depended-on are marked Multi-Arch: foreign, any depended-on libraries which are also needed on the BUILD machine, and -dev packages which are needed for both HOST and BUILD architectures are made co-installable ('Multi-Arch: same' with arch-qualified paths), and any exceptions to the default rules are marked package:any or package:native in the package source. This process is ongoing.
When it doesn't work you can often get the dependencies installed with a manual apt-get line: e.g instead of
apt-get build-dep -a armhf acl
, do
apt-get install autoconf automake debhelper gettext libtool libattr1-dev:armhf
Details of how this resolves are on https://wiki.ubuntu.com/MultiarchCross
