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

38

J'essaie d' chrootentrer dans un ARMsystème de fichiers Arch Linux x86_64.

J'ai vu qu'il était possible d'utiliser statique qemuen 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?

Jivings
la source
2
Vous devez d' binfmtabord 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
Ulrich Dangel le
Les packages statiques Qemu ne semblent pas se trouver dans les référentiels Arch.
Jivings
2
Désolé, je n'utilise pas arch, mais vous devriez probablement pouvoir créer un paquet statique avec qemu en ajoutant -staticcette option à l'éditeur de liens.
Ulrich Dangel

Réponses:

15

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

0xAF
la source
6
Vous devriez pouvoir utiliser binfmtet qemu en combinaison pour exécuter des cibles non natives - wiki.debian.org/QemuUserEmulation
Ulrich Dangel
2
Je sais comment utiliser Qemu pour l'émulation. Apparemment, vous pouvez l'utiliser avec chroot, bien que je ne puisse clairement pas comprendre comment.
Jivings
@ UlrichDangel, Oui, c'est une bonne information. Mais je pense que les OP ne cherchaient pas ce roi de solution. binfmt serait possible une fois qu'il aurait correctement installé qemu avec l'émulation qemu-arm, mais je crois qu'il souhaite entrer dans son environnement d'émulation ARM (par exemple, Raspberry Pi) où il aurait besoin de qemu-system-arm.
0xAF
@ 0xAF mais la solution binfmt/ qemu-userest 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.
Ulrich Dangel
1
@ UlrichDangel, maintenant sur une seconde si, je crois que vous avez raison. Il est possible d'entrer le chroot émulé avec le qemu-bras (ou devrait l'être). Je vais modifier mon commentaire à ce sujet.
0xAF
34

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:

# 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
Luc
la source
Celui-ci fonctionne, mais après la commande chroot, toute commande ne donne aucun fichier ni répertoire de ce type. J'utilise Fedora 24, problème de selinux? Besoin d'aide s'il vous plaît
Superbiji
@Superbiji Est-ce que la course à pied /bin/lsfonctionne? Dans ce cas, votre $PATHvariable est non définie ou tronquée. Essayez export 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, ce echo /*qui revient à dire ls /*. Je ne sais pas si SELinux pourrait gêner, aucune expérience là-bas.
Luc
1
Même ls donne /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, dev
Superbiji
1
Merci de nous aider .. a trouvé le problème la cause est interprète dans binfmt point à chemin invalide
Superbiji
1
ok, d’une manière ou d’une autre, le problème a été résolu en copiant qemu-arm-static à la bla/usr/binplace de bla/bin. Quand je cours, which qemu-arm-staticça me donne /bin/usrdonc je suppose que ça devrait être cohérent?
dafnahaktana
11

Je pense que le problème est que vous ne devriez pas copier qemu-armmais qemu-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_miscs'il existe un fichier qemu-arm. Sinon, redémarrez le service binfmt_support.

Christian Wolf
la source
J'ai dû exécuter manuellement: update-binfmts --importdir / var / lib / binfmts / --import, puis tout est apparu dans / proc / sys / fs / binfmt_misc et le chroot fonctionne.
Mariano Alvira
7

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

Lisez les commentaires pour qemu-user-static. J'ai dû mettre à jour l' PKGBUILDURL 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, course makepkg -i)

La réponse de Christian Wolf est importante. update-binfmtsn'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 cela, cat /proc/sys/fs/binfmt_miscmontrera les différents binfmts.

Ensuite, assurez-vous de copier le qemu-*-staticdans le usr/bin/répertoire dans la chose que vous voulez chroot à et ensuite chrootdevrait fonctionner.

Mariano Alvira
la source
6

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.

ack
la source
2
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 
Maxim Akristiniy
la source
1

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 --displaypour le démarrer. Donc la ligne

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

devrait effectivement être

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

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-staticn'est pas à l'intérieur /usr/binde votre système.

Marten Jacobs
la source
0

Je viens de rencontrer le même problème sur Ubuntu. J'ai binfmtconfiguré et qemu-arm-staticcopié le même chemin chrooté que sur le système hôte.

Au bout d'une heure, je l'ai fait set|grep bashsur une machine hôte. J'ai trouvé que j'avais /bin/bashdeux variables env: SHELLet SUDO_COMMAND. Après avoir remplacé les variables, mon chroot sur ARM a fonctionné:

SHELL=/bin/sh SUDO_COMMAND=/bin/sh chroot hd
Victor Sergienko
la source
0

Je crois que pour cet OP, tout ce dont il avait besoin était de configurer binfmts, simplement en lançant:

update-binfmts --enable qemu-arm

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

utilisateur175914
la source