Differences between revisions 3 and 4
Revision 3 as of 2013-03-13 13:41:03
Size: 8297
Comment: Some typo fixes and improvement of formatting
Revision 4 as of 2013-03-13 14:12:12
Size: 8296
Comment: Changing language from pt_BR to en of original version URL
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
~- [[Multiarch/HOWTO|Versão original em Inglês]] -~ ~- [[Multiarch/HOWTO|Original version [English]]] -~

Original version [English]

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" 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 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 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 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: 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