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?
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).
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
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
.
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.
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.
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
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.
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
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.