Wie kann ich in ein Dateisystem mit einer anderen Architektur chrooten?

38

Ich versuche, chrootin ein Arch Linux- ARMDateisystem von x86_64.

Ich habe gesehen, dass es möglich ist, Static zu verwenden, qemuindem man die Binärdatei in das Chroot-System kopiert:

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

Trotzdem bekomme ich immer folgende Fehlermeldung:

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

Ich weiß, das bedeutet, dass sich die Architekturen unterscheiden. Mache ich etwas falsch?

Jivings
quelle
2
Sie müssen binfmtzuerst konfigurieren. Eine kurze Einführung finden Sie unter wiki.debian.org/QemuUserEmulation . Ein Beispiel für die Konfiguration von binfmt_misc finden Sie unter svn.kju-app.org/trunk/qemu/qemu/qemu-binfmt-conf.sh
Ulrich Dangel
Statische Qemu-Pakete scheinen sich nicht in den Arch-Repositorys zu befinden.
Jivings
2
Es tut mir leid, ich verwende Arch nicht, aber Sie sollten wahrscheinlich in der Lage sein, ein statisches QEMU-Paket zu erstellen, indem Sie -staticdie Link- Optionen hinzufügen
Ulrich Dangel

Antworten:

15

Sie können nicht in eine andere Architektur eintauchen. Durch das Chrooten führen Sie die Binärdateien (aus der Chroot) auf Ihrer Architektur aus. Das Ausführen von ARM-Binärdateien auf x86 (und in diesem Fall auf x86_64) würde zu einem "Exec-Format-Fehler" führen.

Wenn Sie Binärdateien von einer anderen Architektur ausführen möchten, benötigen Sie einen Emulator. Qemu ist ein guter Kandidat dafür, aber Sie müssen lernen, wie man es benutzt. Dazu müsste RootFS erstellt und ein Kernel für ARM kompiliert werden. Sie benötigen möglicherweise eine Toolchain zum Kompilieren von ARM-Binärdateien (und Kernel). Eines ist sicher: Vergessen Sie die Chroot-Methode, Sie können keine für ARM kompilierten Binärdateien auf x86 (x86_64) ausführen.

Edit: Nach dem kleinen Gespräch mit @UrichDangel wurde mir klar, dass es möglich sein sollte, mit qemu-user-Programmen (in diesem Fall qemu-arm) in die chroot-Umgebung zu gelangen. Chroot sollte qemu-arm ausführen, der für Ihre Host-Architektur kompiliert wurde, dann kann der qemu-arm Ihr / bin / sh ausführen (für arm kompiliert).

0xAF
quelle
6
Sie sollten binfmtund qemu in Kombination verwenden können, um nicht native Ziele auszuführen
Ulrich Dangel
2
Ich kann Qemu für die Emulation verwenden. Anscheinend kannst du es mit chroot verwenden, obwohl ich nicht herausfinden kann, wie.
Jivings
@UlrichDangel, Ja, das ist eine gute Information. Aber ich denke, die OP suchte nicht nach diesem König der Lösung. binfmt wäre möglich, wenn er qemu mit qemu-arm-Emulation richtig installiert hätte, aber ich glaube, er möchte in seine ARM-Emulationsumgebung (z. B. Raspberry Pi) eintreten, wo er qemu-system-arm benötigt.
0xAF
@ 0xAF aber die binfmt/ qemu-userLösung ist genau das, was OP beschrieben hat, in der Lage zu sein, in eine Arm-Chroot zu chrooten und die Befehle auszuführen, ohne ein dediziertes Rootfs usw. zu erstellen
Ulrich Dangel
1
@UlrichDangel, jetzt aber gleich, ich glaube du hast recht. Es ist möglich, emulierte Chroot mit dem Qemu-Arm zu betreten (oder sollte es sein). Ich werde meinen Kommentar dazu bearbeiten.
0xAF
33

Von Zeit zu Zeit verwende ich eine ARM-Chroot: Auf meinem Telefon wird Linux Deploy ausgeführt, und das Image stirbt ab und zu. Ich kopiere es dann auf meinen Computer und untersuche die Situation mit chroot wie folgt:

# 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
quelle
Dieser funktioniert, aber nach chroot all gibt der Befehl keine solche Datei oder Verzeichnis. Ich benutze Fedora 24, Selinux-Problem? Brauchen Sie Hilfe bitte
Superbiji
@Superbiji Funktioniert Laufen /bin/ls? In diesem Fall ist Ihre $PATHVariable nicht gesetzt oder verstümmelt. Versuchen Sie es export PATH=/sbin:/usr/sbin:/usr/bin:/bin. Es gibt möglicherweise andere Pfade, die Sie hinzufügen sollten, aber dies ist wahrscheinlich ein guter Anfang. Wenn das nicht funktioniert, haben Sie wahrscheinlich vergessen, die Binärdateien in die Chroot-Umgebung zu kopieren. Sie können auch das Dateisystem verwenden bash zu stöbern, wie echo /*in etwa entspricht ls /*. Ich weiß nicht, ob SELinux in die Quere kommen könnte, keine Erfahrung dort.
Luc
1
Sogar ls gibt /bin/ls: no such file or directory. Export zeigt guten Weg. Aber echo / * funktioniert, echo / usr / bin / qemu-arm * listet die Datei auf. Ich habe auch Mount Sys, Proc, Dev
Superbiji
1
Danke für die Hilfe .. fand das Problem die Ursache ist Dolmetscher in binfmt Punkt zu ungültigem Pfad
Superbiji
1
ok, irgendwie wurde es durch Kopieren qemu-Arm-statisch zu lösen bla/usr/binstatt bla/bin. Wenn ich es laufen which qemu-arm-staticlasse gibt es mir /bin/usralso denke ich sollte es konsistent sein?
dafnahaktana
10

Ich denke , das Problem ist , dass man nicht kopieren sollte qemu-armaber qemu-arm-static. Dies ist eine statisch kompilierte ausführbare Datei, die aus der Chroot-Umgebung ohne Bibliotheken ausgeführt werden kann.

Sie können auch nachsehen, /proc/sys/fs/binfmt_miscob eine Datei vorhanden ist qemu-arm. Wenn nicht, starten Sie den Dienst neu binfmt_support.

Christian Wolf
quelle
Ich musste manuell ausführen: update-binfmts --importdir / var / lib / binfmts / --import, dann wurde alles in / proc / sys / fs / binfmt_misc angezeigt und die Chroot funktioniert.
Mariano Alvira
7

Um dies zum Laufen zu bringen, habe ich qemu-static-armund binfmt-supportvon AUR installiert .

Lesen Sie die Kommentare für qemu-user-static. Ich musste das PKGBUILDmit der neuesten Download-URL und den Hashes aktualisieren, damit makepkg fertig wurde.

(Um von AUR zu installieren, laden Sie die Tarball, untar, cd, Run makepkg -i)

Die Antwort von Christian Wolf ist wichtig. update-binfmtswird nicht ordnungsgemäß ausgeführt, um diese Formate zu aktivieren. Dazu lief ich:

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

wie in der manpage für update-binfmts beschrieben. Danach cat /proc/sys/fs/binfmt_miscwerden die verschiedenen Binfmts angezeigt.

Stellen Sie dann sicher, dass Sie das qemu-*-staticin das usr/bin/Verzeichnis kopieren , in das Sie chroot möchten, und dann chrootsollte das funktionieren.

Mariano Alvira
quelle
6

Sie können definitiv in ein (bereitgestelltes) Dateisystem "chroot", das für eine andere Architektur gedacht ist, und Sie können einige sinnvolle Arbeiten ausführen. Sie benötigen nur die richtigen Tools.

Schauen Sie sich PRoot an, eine User-Space-Implementierung von chroot, mount --bind und binfmt_misc: https://proot-me.github.io/

Zusammen mit den Emulatoren für den Benutzermodus von QEMU sind Sie bereit.

Obwohl Sie normalerweise keinen vollständigen Startvorgang durchführen können (dh Init und Dienste starten), ist es gut genug, einige Binärdateien von ihrem "natürlichen" Ort aus auszuführen und auf alle ihre Konfigurationsdateien zuzugreifen, einschließlich einiger, die über das Bind-Mount-Verfahren bereitgestellt werden "Host" -System usw.

ack
quelle
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
quelle
1

Zur Antwort von Luc hinzufügen: Sie müssen sicherstellen, dass der Speicherort des Interpreters in der Chroot mit dem im Hauptdateisystem übereinstimmt. Dies liegt daran, dass der Kernel die Architektur einer ausführbaren Datei erkennt und dann den Speicherort des Interpreters verwendet, wie durch gezeigt update-binfmts --display, um ihn zu starten. Also die Leitung

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

sollte eigentlich sein

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

Andernfalls erhalten Sie möglicherweise "Nicht gefunden" -Fehler in Ihrer Chroot, da Ihr Kernel den erforderlichen Interpreter nicht finden kann, wenn sich der Speicherort von qemu-arm-staticnicht in /usr/binIhrem System befindet.

Marten Jacobs
quelle
0

Ich bin auf Ubuntu auf dasselbe Problem gestoßen. Ich habe den gleichen Chroot-Pfad wie auf dem Host-System binfmtkonfiguriert und qemu-arm-statickopiert.

Nach einer Stunde habe ich set|grep bashauf einem Hostcomputer. Ich fand, dass ich /bin/bashin zwei Umgebungsvariablen hatte: SHELLund SUDO_COMMAND. Nach dem Ersetzen der Variablen funktionierte meine Chroot zu ARM:

SHELL=/bin/sh SUDO_COMMAND=/bin/sh chroot hd
Victor Sergienko
quelle
0

Ich glaube, für dieses OP musste er lediglich binfmts konfigurieren, indem er einfach Folgendes ausführte:

update-binfmts --enable qemu-arm

Danach wäre ein chroot in das arm-Dateisystem möglich gewesen.

user175914
quelle