J'essaie d' chroot
entrer dans un ARM
système de fichiers Arch Linux x86_64
.
J'ai vu qu'il était possible d'utiliser statique qemu
en copiant le fichier 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?
binfmt
abord configurer , jetez un coup d'œil à wiki.debian.org/QemuUserEmulation pour une brève introduction. Vous trouverez un exemple de configuration de binfmt_misc à l' adresse suivante-static
cette option à l'éditeur de liens.Réponses:
Vous ne pouvez pas chroot dans une architecture différente. En chrootant, vous exécutez les fichiers binaires (à partir du chroot) sur votre architecture. L'exécution des fichiers binaires ARM sur x86 (et x86_64 dans ce cas) entraînerait une "erreur de format Exec".
Si vous voulez exécuter des fichiers binaires 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 la création de RootFS et la compilation d’un noyau pour ARM. Vous aurez peut-être besoin d'une chaîne d'outils pour compiler les fichiers binaires ARM (et le noyau). Une chose est sûre: oubliez la méthode chroot, vous ne pouvez pas exécuter les fichiers binaires compilés pour ARM sur x86 (x86_64).
Edit: Après la petite conversation avec @UrichDangel, j'ai réalisé qu'il devrait être possible d'entrer dans l'environnement chroot avec des 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).
la source
binfmt
et qemu en combinaison pour exécuter des cibles non natives - wiki.debian.org/QemuUserEmulationbinfmt
/qemu-user
est exactement ce que OP a décrit, être capable de chrooter dans un bras de chroot et d'exécuter les commandes sans avoir besoin de construire un rootfs dédié, etc.J'utilise de temps en temps un chroot ARM: 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:
la source
/bin/ls
fonctionne? Dans ce cas, votre$PATH
variable est non définie ou tronquée. Essayezexport PATH=/sbin:/usr/sbin:/usr/bin:/bin
. Il se peut que vous deviez ajouter d’autres chemins, mais c’est probablement un bon début. Si cela ne fonctionne pas, vous avez probablement oublié de copier les fichiers binaires dans l'environnement chroot. Vous pouvez aussi utiliser bash pour parcourir le système de fichiers, ceecho /*
qui revient à direls /*
. Je ne sais pas si SELinux pourrait gêner, aucune expérience là-bas./bin/ls: no such file or directory
. l'exportation montre le bon chemin. Mais echo / * fonctionne, echo / usr / bin / qemu-arm * liste le fichier. J'ai aussi monter sys, proc, devbla/usr/bin
place debla/bin
. Quand je cours,which qemu-arm-static
ça me donne/bin/usr
donc je suppose que ça devrait être cohérent?Je pense que le problème est que vous ne devriez pas copier
qemu-arm
maisqemu-arm-static
. C’est un exécutable compilé statique capable de s’exécuter de l’intérieur du chroot sans aucune bibliothèque.Vous pouvez également rechercher
/proc/sys/fs/binfmt_misc
s'il existe un fichierqemu-arm
. Sinon, redémarrez le servicebinfmt_support
.la source
Pour que cela fonctionne, j'ai installé
qemu-static-arm
etbinfmt-support
de AUR.Lisez les commentaires pour
qemu-user-static
. J'ai dû mettre à jour l'PKGBUILD
URL de téléchargement la plus récente et les hachages pour que makepkg puisse terminer.(Pour installer à partir AUR, téléchargez le tarball,
untar
,cd
, coursemakepkg -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:comme décrit dans la page de manuel de update-binfmts. Après cela,
cat /proc/sys/fs/binfmt_misc
montrera les différents binfmts.Ensuite, assurez-vous de copier le
qemu-*-static
dans leusr/bin/
répertoire dans la chose que vous voulez chroot à et ensuitechroot
devrait fonctionner.la source
Vous pouvez très certainement «chrooter» dans un système de fichiers (monté) destiné à une architecture différente et effectuer un travail significatif, vous avez simplement besoin des bons outils.
Jetez un coup d’œ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 en 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, init et services), il est suffisant d'exécuter certains fichiers binaires à partir de leur emplacement "naturel", avec accès à tous leurs fichiers de configuration, y compris ceux montés par une liaison à partir du répertoire. système 'hôte', etc.
la source
la source
Ajout de 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 puis utilise l'emplacement de l'interpréteur, comme indiqué par,
update-binfmts --display
pour le démarrer. Donc la lignedevrait effectivement être
Sinon, vous pourriez avoir 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
de votre système.la source
Je viens de rencontrer le même problème sur Ubuntu. J'ai
binfmt
configuré etqemu-arm-static
copié le même chemin chrooté que sur le système hôte.Au bout d'une heure, je l'ai fait
set|grep bash
sur une machine hôte. J'ai trouvé que j'avais/bin/bash
deux variables env:SHELL
etSUDO_COMMAND
. Après avoir remplacé les variables, mon chroot sur ARM a fonctionné:la source
Je crois que pour cet OP, tout ce dont il avait besoin était de configurer binfmts, simplement en lançant:
Après avoir exécuté cela, le chroot dans le système de fichiers arm aurait été possible.
la source