Ich versuche, chroot
in ein Arch Linux- ARM
Dateisystem von x86_64
.
Ich habe gesehen, dass es möglich ist, Static zu verwenden, qemu
indem 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?
binfmt
zuerst 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-static
die Link- Optionen hinzufügenAntworten:
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).
quelle
binfmt
und qemu in Kombination verwenden können, um nicht native Ziele auszuführenbinfmt
/qemu-user
Lö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 erstellenVon 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:
quelle
/bin/ls
? In diesem Fall ist Ihre$PATH
Variable nicht gesetzt oder verstümmelt. Versuchen Sie esexport 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, wieecho /*
in etwa entsprichtls /*
. Ich weiß nicht, ob SELinux in die Quere kommen könnte, keine Erfahrung dort./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, Devbla/usr/bin
stattbla/bin
. Wenn ich es laufenwhich qemu-arm-static
lasse gibt es mir/bin/usr
also denke ich sollte es konsistent sein?Ich denke , das Problem ist , dass man nicht kopieren sollte
qemu-arm
aberqemu-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_misc
ob eine Datei vorhanden istqemu-arm
. Wenn nicht, starten Sie den Dienst neubinfmt_support
.quelle
Um dies zum Laufen zu bringen, habe ich
qemu-static-arm
undbinfmt-support
von AUR installiert .Lesen Sie die Kommentare für
qemu-user-static
. Ich musste dasPKGBUILD
mit der neuesten Download-URL und den Hashes aktualisieren, damit makepkg fertig wurde.(Um von AUR zu installieren, laden Sie die Tarball,
untar
,cd
, Runmakepkg -i
)Die Antwort von Christian Wolf ist wichtig.
update-binfmts
wird nicht ordnungsgemäß ausgeführt, um diese Formate zu aktivieren. Dazu lief ich:wie in der manpage für update-binfmts beschrieben. Danach
cat /proc/sys/fs/binfmt_misc
werden die verschiedenen Binfmts angezeigt.Stellen Sie dann sicher, dass Sie das
qemu-*-static
in dasusr/bin/
Verzeichnis kopieren , in das Sie chroot möchten, und dannchroot
sollte das funktionieren.quelle
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.
quelle
quelle
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 Leitungsollte eigentlich sein
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-static
nicht in/usr/bin
Ihrem System befindet.quelle
Ich bin auf Ubuntu auf dasselbe Problem gestoßen. Ich habe den gleichen Chroot-Pfad wie auf dem Host-System
binfmt
konfiguriert undqemu-arm-static
kopiert.Nach einer Stunde habe ich
set|grep bash
auf einem Hostcomputer. Ich fand, dass ich/bin/bash
in zwei Umgebungsvariablen hatte:SHELL
undSUDO_COMMAND
. Nach dem Ersetzen der Variablen funktionierte meine Chroot zu ARM:quelle
Ich glaube, für dieses OP musste er lediglich binfmts konfigurieren, indem er einfach Folgendes ausführte:
Danach wäre ein chroot in das arm-Dateisystem möglich gewesen.
quelle