web-dev-qa-db-fra.com

LXD: Exécution d'une image avec une architecture étrangère

Je souhaite utiliser LXD pour bootstrap un système de fichiers racine à déployer sur un système intégré ARM à partir de mon hôte AMD64 exécutant Ubuntu 16.04. Auparavant, je le faisais avec un script et la commande chroot, mais le script que j'utilisais était sujet aux erreurs et avait la mauvaise habitude de supprimer mes entrées/dev.

J'ai pu copier l'image localement à l'aide de lxc image copy images:ubuntu/16.04/arm64 --alias=ubuntu-server-arm64 et installer qemu-user-static, mais je ne suis pas en mesure de lancer un conteneur à partir de cette image. Je reçois l'erreur suivante:

$ lxc launch ubuntu-server-arm64 bootstrap
Creating bootstrap
error: Requested architecture isn't supported by this Host

Existe-t-il un moyen de forcer lxd à ignorer l'incompatibilité d'architecture et à utiliser qemu-user-static pour exécuter le conteneur enfant?

1
Paul Belanger

Selon Stéphane Graber, responsable du projet LXC/LXD (en réponse à une demande de ma part concernant leur site de discussions ):

qemu-user-static est un assistant binfmt qui vous permet d'effectuer une conversion à la volée entre architectures. Il vous permet effectivement d’exécuter des fichiers binaires pour des architectures autres que votre architecture actuelle.

qemu-user-static lui-même devrait fonctionner correctement dans un conteneur et vous permettre d'exécuter des binaires d'architectures étrangères à l'intérieur de celui-ci.

Essayer d'exécuter un conteneur entier via qemu-user-static est très peu pratique en raison de certaines grandes limitations de qemu-user-static, par exemple, tout ce qui repose sur ptrace (systèmes init et outils de débogage), netlink (tous les outils réseau et certains systèmes init) ou thread (beaucoup plus de logiciels) échouera généralement misérablement.

L’approche que j’ai mise en œuvre dans LXC consistait à créer un conteneur mixte dans lequel la plupart des packages étaient de l’architecture étrangère, alors que le système init, les outils réseau,… appartenaient à l’architecture native. Cela fonctionnait un peu mais n’était pas particulièrement utile, pour ne pas dire très lent.

Comme cela est effectivement insoutenable en ce qui nous concerne, nous ne fournissons aucune image d’architecture étrangère pour LXD. Vous pouvez cependant construire votre propre en assemblant un rootfs d’une architecture étrangère, puis en incluant les binaires nécessaires qemu-user-static, en remplaçant tout binaire qui ne fonctionnera pas avec l’émulation et en le générant sous la forme d’une image LXD (en le marquant avec l’architecture envisagée). de fonctionner plutôt que de l'architecture qu'il contient).

Donc, effectivement, tenter d'exécuter une architecture étrangère sur LXD n'est pas pris en charge et la méthode LXC était plus ou moins un type de piratage "environnement mixte".

Il semble que cela pourrait également être fait, mais vous auriez besoin de créer un rootfs d’architecture étrangère et de créer vous-même une "image" qui gère tout cela, ce qui pour diverses raisons pourrait être un casse-tête et beaucoup de travail à accomplir.

2
Thomas Ward