web-dev-qa-db-fra.com

Comment puis-je chrooter dans un système de fichiers avec une architecture différente?

J'essaie de chroot dans un système de fichiers Arch Linux ARM depuis x86_64.

J'ai vu qu'il est possible de faire en utilisant statique qemu en copiant le binaire dans le système chroot:

$ cp /usr/bin/qemu-arm archarm-chroot/usr/bin    

Mais malgré cela, j'obtiens toujours l'erreur suivante:

chroot: failed to run command ‘/bin/bash’: Exec format error

Je sais que cela signifie que les architectures diffèrent. Est-ce que je fais quelque chose de mal?

39
Jivings

IMPORTANT: Veuillez regarder les autres réponses. C'est une réponse ancienne et inexacte.

Vous ne pouvez pas chrooter dans une architecture différente. En chrootant, vous exécutez les binaires (à partir du chroot) sur votre architecture. L'exécution de ARM binaires sur x86 (et x86_64 dans ce cas) entraînerait une "erreur de format Exec").

Si vous souhaitez exécuter des binaires à partir d'une architecture différente, vous aurez besoin d'un émulateur. Qemu est un bon candidat pour cela, mais vous devrez apprendre à l'utiliser. Cela impliquerait de créer RootFS et de compiler un noyau pour ARM. Vous aurez besoin d'une chaîne d'outils pour compiler ARM binaires (et noyau) peut-être. Une chose est sûre: oubliez la méthode chroot, vous ne pouvez pas exécuter de binaires compilés pour ARM = sur x86 (x86_64).

Edit: Après le petit entretien avec @UrichDangel, j'ai réalisé qu'il devrait être possible d'entrer dans l'environnement chroot avec les programmes qemu-user (qemu-arm dans ce cas). Chroot devrait exécuter qemu-arm compilé pour votre architecture hôte, puis qemu-arm peut exécuter votre/bin/sh (compilé pour arm).

15
0xAF

J'utilise un ARM chroot de temps en temps: mon téléphone exécute Linux Deploy et l'image meurt de temps en temps. Je le copie ensuite sur mon ordinateur et examine la situation avec chroot comme ceci:

# This provides the qemu-arm-static binary
apt-get install qemu-user-static

# Mount my target filesystem on /mnt
mount -o loop fs.img /mnt

# Copy the static ARM binary that provides emulation
cp $(which qemu-arm-static) /mnt/usr/bin
# Or, more simply: cp /usr/bin/qemu-arm-static /mnt/usr/bin

# Finally chroot into /mnt, then run 'qemu-arm-static bash'
# This chroots; runs the emulator; and the emulator runs bash
chroot /mnt qemu-arm-static /bin/bash
36
Luc

Je pense que le problème est que vous ne devez pas copier qemu-arm mais qemu-arm-static. Il s'agit d'un exécutable compilé statique capable de s'exécuter depuis l'intérieur du chroot sans aucune bibliothèque.

Vous pouvez également regarder dans /proc/sys/fs/binfmt_misc s'il existe un fichier qemu-arm. Sinon, redémarrez le service binfmt_support.

11
Christian Wolf

Pour que cela fonctionne, j'ai installé qemu-static-arm et binfmt-support de AUR.

Lire les commentaires pour qemu-user-static. J'ai dû mettre à jour le PKGBUILD avec l'URL de téléchargement la plus récente et les hachages pour que makepkg se termine.

(Pour installer depuis AUR, téléchargez l'archive tar, untar, cd, exécutez makepkg -i)

La réponse de Christian Wolf est importante. update-binfmts n'est pas exécuté correctement pour activer ces formats. Pour ce faire, j'ai couru:

update-binfmts --importdir /var/lib/binfmts/ --import

comme décrit dans la page de manuel de update-binfmts. Après ça, cat /proc/sys/fs/binfmt_misc affichera les différents binfmts.

Assurez-vous ensuite de copier le qemu-*-static à la usr/bin/ dans le dossier que vous souhaitez chrooter, puis le chroot devrait fonctionner.

7
Mariano Alvira

Vous pouvez très certainement "chrooter" dans un système de fichiers (monté) destiné à une architecture différente et faire un travail significatif, vous avez juste besoin des bons outils.

Jetez un œil à PRoot, qui est une implémentation dans l'espace utilisateur de chroot, mount --bind et binfmt_misc: https://proot-me.github.io/

Avec les émulateurs de mode utilisateur de QEMU, vous êtes prêt.

Bien que vous ne puissiez généralement pas effectuer un démarrage "complet" (c'est-à-dire le démarrage d'init et de services), il est suffisant d'exécuter certains binaires à partir de leur emplacement "naturel", avec accès à tous leurs fichiers de configuration, y compris certains qui sont montés par liaison à partir du Système "hôte", etc.

6
ack
Sudo apt-get update
Sudo apt-get install debootstrap qemu qemu-user-static
Sudo qemu-debootstrap --Arch armhf bionic armhf-chroot
Sudo chroot armhf-chroot

uname -m 
2
Maxim Akristiniy

Ajout à la réponse de Luc: vous devez vous assurer que l'emplacement de l'interpréteur est le même dans le chroot que dans le système de fichiers principal. En effet, le noyau détecte l'architecture d'un exécutable et utilise ensuite l'emplacement de l'interpréteur comme indiqué par update-binfmts --display pour le démarrer. Donc la ligne

cp $(which qemu-arm-static) /mnt/usr/bin

devrait en fait être

cp $(which qemu-arm-static) /mnt/$(which qemu-arm-static)

Sinon, vous pouvez obtenir des erreurs "Not found" dans votre chroot car votre noyau ne peut pas trouver l'interpréteur requis, si l'emplacement de qemu-arm-static n'est pas à l'intérieur /usr/bin sur votre système.

1
Marten Jacobs

Je viens de rencontrer le même problème sur Ubuntu. J'ai eu binfmt configuré et qemu-arm-static copié sur le même chemin chroot-ed que sur le système hôte.

Après une heure, j'ai fait set|grep bash sur une machine hôte. J'ai trouvé que j'avais /bin/bash dans deux variables env: Shell et Sudo_COMMAND. Après avoir remplacé les variables, mon chroot à ARM a fonctionné:

Shell=/bin/sh Sudo_COMMAND=/bin/sh chroot hd
0
Victor Sergienko

Je crois que pour cet OP, tout ce qu'il devait faire était de configurer binfmts, simplement en exécutant:

update-binfmts --enable qemu-arm

Après avoir exécuté cela, chroot dans le système de fichiers arm aurait été possible.

0
user175914