Próbuję przejść chroot
do systemu ARM
plików Arch Linux x86_64
.
Widziałem, że można to zrobić za pomocą static qemu
, kopiując plik binarny do systemu chroot:
$ cp /usr/bin/qemu-arm archarm-chroot/usr/bin
Ale mimo to zawsze pojawia się następujący błąd:
chroot: failed to run command ‘/bin/bash’: Exec format error
Wiem, że to oznacza, że architektury się różnią. czy robię coś źle?
binfmt
najpierw skonfigurować , zajrzyj na wiki.debian.org/QemuUserEmulation, aby uzyskać krótkie krótkie wprowadzenie. Przykład konfiguracji binfmt_misc można znaleźć na stronie svn.kju-app.org/trunk/qemu/qemu/qemu-binfmt-conf.sh-static
do opcji linkeraOdpowiedzi:
Nie możesz chrootować w innej architekturze. Podczas chrootowania uruchamiasz pliki binarne (z chroot) w swojej architekturze. Wykonywanie plików binarnych ARM na x86 (i x86_64 w tym przypadku) prowadziłoby do „błędu formatu wykonania”.
Jeśli chcesz uruchomić pliki binarne z innej architektury, potrzebujesz Emulatora. Qemu jest dobrym kandydatem do tego, ale musisz nauczyć się z niego korzystać. Wymagałoby to utworzenia RootFS i kompilacji jądra dla ARM. Być może będziesz potrzebować łańcucha narzędzi do kompilacji plików binarnych ARM (i jądra). Jedno jest pewne: zapomnij o metodzie chroot, nie możesz uruchamiać plików binarnych skompilowanych dla ARM na x86 (x86_64).
Edycja: Po krótkiej rozmowie z @UrichDangel zdałem sobie sprawę, że powinno być możliwe wejście do środowiska chroot za pomocą programów qemu-user (w tym przypadku qemu-arm). Chroot powinien wykonywać qemu-arm skompilowany dla architektury hosta, a następnie qemu-arm może wykonać / bin / sh (skompilowany dla arm).
źródło
binfmt
i qemu w kombinacji, aby uruchamiać cele inne niż natywne - wiki.debian.org/QemuUserEmulationbinfmt
/qemu-user
rozwiązanie jest dokładnie tym, co opisał OP, ponieważ jest w stanie chrootować się w chroot ramię i uruchamiać polecenia bez potrzeby budowania dedykowanych rootfów itp.Od czasu do czasu używam chroota ARM: na moim telefonie działa Linux Deploy, a obraz od czasu do czasu umiera. Następnie kopiuję go na komputer i badam sytuację z chroot w następujący sposób:
źródło
/bin/ls
działa? W takim przypadku twoja$PATH
zmienna jest rozbrojona lub zniekształcona. Spróbowaćexport PATH=/sbin:/usr/sbin:/usr/bin:/bin
. Mogą istnieć inne ścieżki, które powinieneś dodać, ale to prawdopodobnie dobry początek. Jeśli to nie zadziała, prawdopodobnie zapomniałeś skopiować pliki binarne do środowiska chroot. Możesz także użyć bash do przeglądania systemu plików, podobnie jak wecho /*
przybliżeniuls /*
. Nie wiem, czy SELinux może przeszkadzać, brak doświadczenia./bin/ls: no such file or directory
. eksport pokazuje dobrą ścieżkę. Ale echo / * działa, echo / usr / bin / qemu-arm * wyświetla plik. Mam również mount sys, proc, devbla/usr/bin
zamiast nabla/bin
. Po uruchomieniuwhich qemu-arm-static
daje mi to,/bin/usr
więc myślę, że powinno być spójne?Myślę, że problem polega na tym, że nie powinieneś kopiować,
qemu-arm
aleqemu-arm-static
. Jest to statycznie skompilowany plik wykonywalny, który może uruchamiać się w chroocie bez żadnych bibliotek.Możesz także sprawdzić,
/proc/sys/fs/binfmt_misc
czy istnieje plikqemu-arm
. Jeśli nie, uruchom ponownie usługębinfmt_support
.źródło
Aby to działało, zainstalowałem
qemu-static-arm
ibinfmt-support
z AUR.Przeczytaj komentarze do
qemu-user-static
. Musiałem zaktualizowaćPKGBUILD
najnowszy adres URL pobierania i skróty do makepkg, aby zakończyć.(Aby zainstalować z AUR, należy pobrać archiwum,
untar
,cd
, runmakepkg -i
)Odpowiedź Christiana Wolfa jest ważna.
update-binfmts
nie jest poprawnie wykonany, aby włączyć te formaty. Aby to zrobić, pobiegłem:jak opisano na stronie podręcznika dla update-binfmts. Następnie
cat /proc/sys/fs/binfmt_misc
pokaże różne binfmts.Następnie upewnij się, że skopiowałeś
qemu-*-static
dousr/bin/
katalogu w rzeczy, do której chcesz chrootować, a wtedychroot
powinno działać.źródło
Zdecydowanie możesz „chroot” do (zamontowanego) systemu plików przeznaczonego dla innej architektury i wykonać znaczącą pracę, potrzebujesz tylko odpowiednich narzędzi.
Zobacz PRoot, który jest implementacją chroot, mount --bind i binfmt_misc w przestrzeni użytkownika: https://proot-me.github.io/
Razem z emulatorami trybu użytkownika QEMU wszystko gotowe.
Chociaż zwykle nie można wykonać „pełnego” rozruchu (tj. Uruchomienie init i usług), wystarczy uruchomić niektóre pliki binarne z ich „naturalnego” miejsca, z dostępem do wszystkich ich plików konfiguracyjnych, w tym niektórych, które są zamontowane na bindach z system „hosta” itp.
źródło
źródło
Dodanie do odpowiedzi Luca: musisz upewnić się, że lokalizacja interpretera jest taka sama w chroot, jak w głównym systemie plików. Wynika to z faktu, że jądro wykrywa architekturę pliku wykonywalnego, a następnie używa lokalizacji interpretera, jak pokazano za pomocą,
update-binfmts --display
aby go uruchomić. Więc liniapowinno być
W przeciwnym razie możesz dostać błąd „Nie znaleziono” wewnątrz twojego chroota, ponieważ twoje jądro nie może znaleźć wymaganego interpretera, jeśli lokalizacja
qemu-arm-static
nie znajduje się/usr/bin
w twoim systemie.źródło
Właśnie natrafiłem na ten sam problem na Ubuntu. Miałem
binfmt
skonfigurowane iqemu-arm-static
skopiowane na tej samej ścieżce chroot-ed jak na systemie hosta.Po godzinie zrobiłem to
set|grep bash
na maszynie hosta. Odkryłem, że mam/bin/bash
dwie zmienne env:SHELL
iSUDO_COMMAND
. Po zamianie zmiennych mój chroot na ARM działał:źródło
Sądzę, że dla tego PO wszystko, co musiał zrobić, to skonfigurować binfmts, po prostu uruchamiając:
Po uruchomieniu tego chroot w systemie plików zbrojenia byłby możliwy.
źródło