Translation(s): Brasileiro - English - Español - Français - Português (Brasil) - Русский


Qu'est ce que Multiarch ?

Multiarch vous permet d'installer des bibliothèques de paquets venant de différentes architectures sur un même système. C'est très utile dans beaucoup de cas, cela permet le plus souvent d'installer à la fois des logiciels 32 et 64 bits sur la même machine, tout en conservant une résolution des dépendances automatique correcte. Notez que cela ne permet pas d'installer simultanément plusieurs versions d'une même « application » dans de multiples architectures.

La capacité à exécuter réellement les paquets installés dépend complètement du noyau et de la possible configuration de qemu-user :

Notamment, alors que Multiarch permet d'installer des paquets pour différents noyaux, par exemple des binaires exécutables de Hurd ou kFreeBSD sur un système Linux ou vice-versa, les exécuter ne fonctionnera *pas*. Il est nécessaire pour cela de les exécuter via une machine virtuelle complète avec le noyau réel correspondant.

Concepts

Il y a une architecture dite architecture courante, et affichée par la commande dpkg --print-architecture et dpkg --print-foreign-architectures. Elle est définie dans le paquet dpkg actuellement installé.

(Notez qu'ici « architecture » désigne une Interface Binaire-Programme (ABI, Application Binary Interface), et non une Architecture de Jeu d'Instruction (ISA, Instruction Set Architecture). Ainsi, par exemple, « armel » et « armhf » sont bien des « architectures » différentes car, bien qu'elles utilisent (presque) le même jeu d'instruction, elles se reposent sur des ABI différentes pour l'appel de fonctions depuis les bibliothèques.

Il est maintenant possible de se référer à un paquet via « paquet:architecture » à peu près partout où il était possible de le faire avant avec « paquet » — nous avons donc libc:i386 et libc:amd64 — malheureusement, les sémantiques comprises par dpkg et apt étant légèrement différentes, les résultats obtenus via ces deux interfaces peuvent être légèrement différents. Cependant, préciser l'architecture d'un paquet devrait toujours être sûr et sans ambigüité, quant au nom « paquet » sans précision, il se réfère au paquet dans l'architecture courante d'apt.

Les autres architectures disponibles sont visibles grâce à la commande dpkg --print-foreign-architectures. Dpkg gèrera les paquets de ces architectures ainsi que ceux de l'architecture de la machine.

Il y a un entête « Multi-Arch » inscrit dans les méta-données pour chaque paquet multi-architectures concerné.

Les paquets existants fonctionnent très bien dans un environnement multi-architectures, mais pour bénéficier d'une co-installation ou d'un arbre de dépendances multi-architectures, beaucoup de paquets ont besoin d'être rendus compatibles en multi-architectures.

Des paquets étiquetés « Multi-Arch : allowed » existent aussi. Ils peuvent être traités à la fois comme « :same » ou comme « :foreign » en fonction des paquets dont ils dépendent.

Le plus souvent, les responsables des paquets travaillent sur leur distribution en commençant par installer les paquets les plus utiles pour la rendre multi-architectures. Voir multiarch spec et howto implementation pour avoir des détails sur le fonctionnement actuel et pour savoir comment mettre à jour les paquets et tirer avantage de cette fonctionnalité.

Prérequis

Vous avez besoin d'un dpkg et d'un apt compatible multi-architectures.

Pour dpkg de Debian cela est présent depuis la version 1.16.2. Dans Ubuntu cela est possible depuis natty (v1.15.8.10ubuntu1). Vérifiez en regardant si la commande dpkg --print-foreign-architectures est comprise.

Apt est compatible multi-architectures s'il supporte -o APT::Architectures. Cette prise en charge est disponible depuis la version 0.8.13 comprise. Cependant, il y a eu de nombreuses améliorations à la prise en charge de la multi-architecture et de nombreuses corrections de bogues dans les versions suivantes de apt (certaines requises par Debian dpkg 1.16.2 pour activer le multi-architecture), comme la prise en charge de apt-get build-dep -a cross-dependency. Par conséquent, le plus récent est le plus performant en général, au moins jusqu'à la version 0.9.4.

Avant apt 0.9 dans Debian, dpkg peut ne pas fonctionner (mais seulement si le multi-architecture est activé) pendant les mises à jour lorsqu'on ne lui indique pas l'architecture du paquet qu'apt doit configurer. (« 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 devrait débloquer cela.

Utilisation

Configurer les architectures

Pour ajouter une architecture supplémentaire (dans Debian depuis dpkg 1.16.2) :

dpkg --add-architecture <arch>

Par exemple :

dpkg --add-architecture armhf

Notez que rien ne va réellement changer avant que vous fassiez

apt-get update

pour mettre à jour la liste des paquets disponibles.

Pour supprimer une architecture

dpkg --remove-architecture <arch>

Les architectures disponibles pour dpkg sont stockées dans /var/lib/dpkg/arch.

Notez qu'avant d'effacer une architecture, vous devez en effacer tous les paquets correspondants :

apt-get purge ".*:<arch>"

Notez que le dpkg d'Ubuntu dans Natty (1.16.0~ubuntu7 (reports 1.15.8.10)), Oneiric et Precise (1.16.1.2ubuntu7) utilise une syntaxe différente :

echo "foreign-architecture armhf" >> /etc/dpkg/dpkg.cfg.d/architectures

Configurez les sources apt

Par défaut, apt utilise le jeu d'architectures remonté par dpkg, et toutes architectures non qualifiées présentes dans les lignes du fichier /etc/apt/sources.list, qui représente souvent ce que vous souhaitez. Cela peut être modifié en utilisant APT::Architecture=<arch> pour forcer l’architecture par défaut ou avec APT::Architectures="<arch> <arch>".

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

Identifier les lignes deb-src avec une architecture n'aurait aucun sens.

Notez : il y a un bogue dans la version de apt >=0.9.7 et <0.9.7.2, ce qui signifie que mettre « arch=armel,armhf » sur une seule ligne ne fonctionne pas ; vous avez besoin de 2 entrées différentes.

N'oubliez pas d'exécuter

apt-get update

après avoir ajouté une architecture.

Installer/désinstaller des paquets

Pour installer un paquet ne provenant pas de l'architecture par défaut, spécifiez juste cette architecture dans la ligne de commande :

apt-get install package:architecture

Les dépendances de ce paquet s'installeront automatiquement pour les bonnes architectures (même architecture pour les bibliothèques, architecture de la machine pour les autres dépendances) exemple :

apt-get install links:i386

dpkg -i package_version_architecture.deb
dpkg -r package:architecture

Installation de l'arbre des dépendances croisées

Pour installer les dépendances à la construction d'un paquet avant une compilation croisée

apt-get build-dep -a <arch> <package>

Cela fonctionne lorsque tous les « outils » dont le paquet dépend sont étiquetés Multi-Arch: foreign, que toutes les dépendances qui sont nécessaires sur la machine de compilation, et que les paquets de développement qui sont nécessaires à la fois sur l'architecture CIBLE et sur l'architecture de COMPILATION sont coinstallable (« Multi-Arch: same »), et que toutes les exceptions aux règles par défaut sont étiquetées package:any ou package:native dans le paquet source. Ce processus est indirect.

Lorsque cela ne fonctionne pas, vous pouvez souvent obtenir les dépendances avec une commande manuelle de apt-get : Par exemple, à la place de

apt-get build-dep -a armhf acl

, faites

apt-get install autoconf automake debhelper gettext libtool libattr1-dev:armhf

Les détails de la résolution des dépendances sont sur MultiarchCross.

Installer les bibliothèques de compatibilité Android SDK

Certains utilisateurs utilisant le SDK Android pourraient rencontrer des problèmes en essayant de lancer build-tools ou platform-tools sur une plateforme amd64. Comme substitut pour ia32-libs, les utilisateurs devraient s'en sortir en installant simplement les bibliothèques suivantes :

dpkg --add-architecture i386
apt-get update
apt-get install libstdc++6:i386 libgcc1:i386 zlib1g:i386 libncurses5:i386

Quand utiliser :native et quand utiliser :any?

:any a pour objet d'annoter une dépendance et d'indiquer que l'architecture du paquet cible n'a pas d'importance. En pratique, cela a de l'importance car on veut généralement qu'il soit exécutable, mais dpkg ne possède pas le compte d'architecture exécutable sur un processeur particulier. De ce fait, vous obtenez toujours un paquet natif lors que vous annotez :any. L'architecture native est définie pour être l'architecture du paquet dpkg. Lors de la construction d'un paquet, l'architecture native correspond généralement à l'architecture de construction.

Le but de :native est de demander un paquet pour l'architecture de construction au lieu de l'architecture hôte tout en satisfaisant les exigences croisées Build-Depends.

  1. Vous ne pouvez pas utiliser :native dans les dépendances de paquets binaires. Cela s'applique uniquement à Build-Depends. De toute façon, cela entraîne généralement une erreur d’analyse de dépendance.

  2. Vous ne pouvez utiliser :any que si le paquet cible est marqué Multi-Arch:allowed. De toute façon, la dépendance devient non satisfaisante.

  3. Si vous avez le choix entre :any et:native et que votre paquet cible est un interpréteur python, vous devez utiliser :any, cardh-python analyse la dépendance et échoue sur :native.


CategoryPermalink CategorySystemAdministration CategoryPackageManagement