terça-feira, 28 de janeiro de 2014

Multiarch - o que é?

Via: wiki.debian.org

O que é esta multiarquitetura ("Multiarch")?

A multiarquitetura permite que você instale pacotes bibliotecas de múltiplas arquiteturas na 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. Observe que isso não possibilita que várias versões de aplicativos sejam instaladas simultaneamente.

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çãopara 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 cruzadasapt-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

Nenhum comentário:

Postar um comentário