Traducción(es): Brasileiro - English - Español - Français - Русский
Contents
¿Qué es la multiarquitectura?
La multiarquitectura le permite instalar bibliotecas de múltiples arquitecturas en el mismo sistema. Esto es útil en múltiples casos, pero principalmente para instalar paquetes de 32 y 64 bits en la misma máquina y disponer de las dependencias automáticamente resueltas. En general, podrá tener bibliotecas de más de una arquitectura instaladas juntas y aplicaciones de una arquitectura u otra instaladas como alternativas. Téngase en cuenta que esto no permite la instalación simultánea de múltiples versiones de programas.
Conceptos
Se dispone de una arquitectura en la máquina, como refleja dpkg --print-architecture. Está integrada en la instalación actual de dpkg.
Obsérvese que con "arquitectura" se refiere a una "ABI" (interfaz de binarios de aplicaciones), no a un conjunto de instrucciones (ISA). De este modo, armel y armhf son distintas "arquitecturas", a pesar de que usan prácticamente el mismo conjunto de instrucciones, ya que tienen distintas ABIs.
Los paquetes pueden ser especificados como "paquete:arquitectura" prácticamente en cualquier lugar en el que antes se introducía solamente "paquete", así que disponemos de libc:i386 y libc:amd64. Por desgracia, por ahora la semántica en dpkg y apt es ligeramente distinta, por lo que se podrían obtener resultados distintos; pero debiera ser siempre seguro e inequívoco archivar paquetes. El nombre puro "paquete" se refiere a la arquitectura actual de la máquina en apt.
Otras arquitecturas disponibles son mostradas mediante dpkg --print-foreign-architectures. dpkg administrará paquetes para esas arquitecturas así como para la arquitectura nativa de la máquina.
Hay una cabecera Multi-Arch en los metadatos de cualquier paquete adaptado para multiarquitectura.
Disponibilidad
Necesitará un dpkg y un apt compatibles con multiarquitectura. En el dpkg de Debian, dicha compatibilidad está presente desde la versión 1.16.2. En Ubuntu está presente desde Natty (v1.15.8.10ubuntu1). Puede comprobarlo viendo si ejecutar dpkg --print-foreign-architectures retorna los resultados correctos.
apt es compatible con multiarquitectura si soporta -o APT::Architectures. Está disponible desde la versión 0.8.13; no obstante, hay muchas mejoras y correcciones de errores relevantes en versiones posteriores de apt (algunas requeridas por Debian dpkg 0.8.13 y superiores para activar la multiarquitectura), tal que soporte multiarquitectura para apt build-dep -a; por lo que es mejor disponer de al menos la versión 0.9.4.
Antes de apt 0.9 en Debian, dpkg podía atascarse con multiarquitectura activada durante actualizaciones si no se le especificaba qué arquitectura debiera estar configurando con 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 deshará esto.
Los paquetes existentes funcionarán correctamente en un entorno multiarquitectura, como lo hacían de antemano; pero para obtener los beneficios de la co-instalación o de las dependencias de arquitectura cruzada, muchos paquetes han de ser adaptados a multiarquitectura.
Para un paquete sin cambios ha de escoger qué versión de qué arquitectura desea escoger (por ejemplo, amd64 o i386).
Si un paquete está marcado como Multi-Arch: foreign, entonces puede satisfacer dependencias de un paquete en una arquitectura diferente (p. ej. "make:amd64" satisfacerá una dependencia en make para paquetes de cualquier arquitectura.
Para disponer de más de una versión de arquitectura de un paquete instalado simultáneamente (en general, bibliotecas y paquetes dev-), los archivos tendrán que ser movidos para que no se confronten. Estos paquetes están marcados como Multi-Arch: same.
Los paquetes marcados como Multi-Arch: allowed pueden ser tratados como same or foreign según su relación de dependencia.
Los empaquetadores están trabajando en la distribución, comenzando por los paquetes más útiles, para hacerla multiarquitectura. Véase el ?HowTo de implementación para obtener detalles sobre cómo funciona el proceso, y cómo actualizar paquetes para que puedan aprovechar esta funcionalidad.
Uso
Configuración de arquitecturas
Para añadir una arquitectura adicional (en Debian, desde dpkg 1.16.2):
# dpkg --add-architecture <arquitectura>
Por ejemplo:
# dpkg --add-architecture i386
Obsérvese que no habrán cambios perceptibles hasta que realice un
# apt update
para actualizar la lista de paquetes disponibles.
Para eliminar una arquitectura:
# dpkg --remove-architecture <arquitectura>
Las arquitecturas de dpkg son almacenadas en /var/lib/dpkg/arch.
Tenga en cuenta que necesitará desinstalar todos los paquetes de una arquitectura antes de eliminarla:
# apt purge ".*:<arquitectura>"
Considérese que el dpkg de Ubuntu en Natty (1.16.0~ubuntu7 (reporta 1.15.8.10)), Oneiric y Precise (1.16.1.2ubuntu7) usa una sintaxis distinta:
# echo "foreign-architecture <arquitectura>" >> /etc/dpkg/dpkg.cfg.d/architectures
Configuración de los orígenes de apt
Por defecto, apt usa el conjunto de arquitecturas reportado por dpkg, y cualquier línea de arquitectura no calificada en /etc/apt/sources.list, que es habitualmente el comportamiento deseado. Esto puede ser invalidado usando APT::Architecture=<arquitectura> para ajustar la arquitectura predeterminada o APT::Architectures="<arquitectura> <arquitectura>".
apt-sources puede ser calificado por arquitectura con esta sintaxis. Esto es muy útil en el archivo dividido de Ubuntu. No es normalmente necesario en Debian, salvo que su archivo habitual no replique las arquitecturas adicionales en las que esté interesado.
deb [arch=amd64,i386] http://es.archive.ubuntu.com/ubuntu/ quantal main universe deb [arch=armel,armhf] http://ports.ubuntu.com/ubuntu-ports quantal main universe
Las líneas de deb-src calificadas por arquitectura son ilógicas.
Hay un error entre las vesiones de apt >=0.9.7 y <0.9.7.2, por el que poner arch=armel,armhf en una línea no funciona; es necesario escribir dos líneas.
No olvide ejecutar
# apt update
tras añadir las nuevas arquitecturas.
Instalar y eliminar paquetes
Para instalar un paquete de una arquitectura no predeterminada, basta con especificar la arquitectura tras el nombre del paquete seguido de dos puntos:
# apt install <paquete>:<arquitectura>
Las dependencias de dicho paquete serán instaladas automáticamente para las arquitecturas correctas (bibliotecas dependidas de la misma arquitectura, arquitectura nativa para otros paquetes.
# apt install links:i386
# dpkg -i <paquete>_<versión>_<arquitectura>.deb # dpkg -r <paquete>:<arquitectura>
Instalar dependencias cruzadas
Para instalar dependencias cruzadas de un paquete antes de la compilación cruzada, puede usar la opción build-dep de apt:
# apt build-dep -a <arquitectura> <paquete>
Esto solamente funciona cuando todos los paquetes de herramientas dependidos están marcados como Multi-Arch: foreign; así como cualquier biblioteca dependida que sea requerida en la máquina BUILD, y paquetes -dev que sean necesarios tanto para la arquitectura HOST como la BUILD son hechas co-instalables (Multi-Arch: same con rutas calificadas por arquitectura); y cualquier excepción a las reglas por defecto sea marcada package:any o package: native en el código fuente del paquete. Este proceso está en curso.
Cuando la instalación no funciona, suele ser posible especificar manualmente las dependencias a instalar; por lo que, por ejemplo, en vez de:
# apt build-dep -a armhf acl
puede ejecutar
# apt install autoconf automake debhelper gettext libtool libattr1-dev:armhf
Detalles al respecto pueden ser hallados en MultiarchCross.
Instalación de bibliotecas compat del SDK de Android
Algunos usuarios que trabajen con el SDK de Android pueden encontrar problemas al intentar ejecutar build-tools o platform-tools en la plataforma amd64. Como reemplazo para ia32-libs, dichos usuarios no debieran tener problemas tras instalar las siguientes bibliotecas:
# dpkg --add-architecture i386 # apt update # apt install libstdc++6:i386 libgcc1:i386 zlib1g:i386 libncurses5:i386