Jak mogę chrootować do systemu plików z inną architekturą?


38

Próbuję przejść chrootdo systemu ARMplikó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?


2
Musisz binfmtnajpierw 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
Ulrich Dangel

Pakiety statyczne Qemu nie wydają się znajdować w repozytoriach Arch.
Jivings

2
Niestety nie korzystam z arch, ale prawdopodobnie powinieneś być w stanie zbudować statyczny pakiet qemu, dodając -staticdo opcji linkera
Ulrich Dangel

Odpowiedzi:


15

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


6
Powinieneś być w stanie używać binfmti qemu w kombinacji, aby uruchamiać cele inne niż natywne - wiki.debian.org/QemuUserEmulation
Ulrich Dangel

2
Wiem, jak używać Qemu do emulacji. Najwyraźniej możesz go używać z chrootem, chociaż najwyraźniej nie potrafię tego pojąć.
Jivings

@UlrichDangel, Tak, to dobra informacja. Ale myślę, że OP nie szukał tego króla rozwiązań. binfmt byłby możliwy po prawidłowym zainstalowaniu qemu z emulacją qemu-arm, ale wierzę, że chce wejść do swojego środowiska emulacji ARM (np. Raspberry Pi), gdzie potrzebowałby qemu-system-arm.
0xAF

@ 0xAF, ale binfmt/ qemu-userrozwią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.
Ulrich Dangel

1
@UlrichDangel, teraz na sekundę, uważam, że masz rację. Możliwe jest wejście emulowanego chroota za pomocą ramienia qemu (lub powinno być). Zmienię mój komentarz na ten temat.
0xAF

33

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:

# 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

Ten działa, ale po chroot wszystkie polecenia nie dają takiego pliku ani katalogu. Używam Fedory 24, problem z selinux? Potrzebujesz pomocy, proszę
Superbiji,

@Superbiji Czy bieganie /bin/lsdziała? W takim przypadku twoja $PATHzmienna 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 w echo /*przybliżeniu ls /*. Nie wiem, czy SELinux może przeszkadzać, brak doświadczenia.
Luc

1
Nawet ls daje /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, dev
Superbiji,

1
Dzięki za pomoc .. Znalazłem problem, ponieważ przyczyną jest tłumacza w binfmt wskazuje na nieprawidłową ścieżkę
Superbiji

1
ok, jakoś to zostało rozwiązane przez skopiowanie qemu-arm-static bla/usr/binzamiast na bla/bin. Po uruchomieniu which qemu-arm-staticdaje mi to, /bin/usrwięc myślę, że powinno być spójne?
dafnahaktana

11

Myślę, że problem polega na tym, że nie powinieneś kopiować, qemu-armale qemu-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_miscczy istnieje plik qemu-arm. Jeśli nie, uruchom ponownie usługę binfmt_support.


Musiałem ręcznie uruchomić: update-binfmts --importdir / var / lib / binfmts / --import, a następnie wszystko pojawiło się w / proc / sys / fs / binfmt_misc i chroot działa.
Mariano Alvira

7

Aby to działało, zainstalowałem qemu-static-armi binfmt-supportz AUR.

Przeczytaj komentarze do qemu-user-static. Musiałem zaktualizować PKGBUILDnajnowszy adres URL pobierania i skróty do makepkg, aby zakończyć.

(Aby zainstalować z AUR, należy pobrać archiwum, untar, cd, run makepkg -i)

Odpowiedź Christiana Wolfa jest ważna. update-binfmtsnie jest poprawnie wykonany, aby włączyć te formaty. Aby to zrobić, pobiegłem:

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

jak opisano na stronie podręcznika dla update-binfmts. Następnie cat /proc/sys/fs/binfmt_miscpokaże różne binfmts.

Następnie upewnij się, że skopiowałeś qemu-*-staticdo usr/bin/katalogu w rzeczy, do której chcesz chrootować, a wtedy chrootpowinno działać.


6

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.


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 

1

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 --displayaby go uruchomić. Więc linia

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

powinno być

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

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-staticnie znajduje się /usr/binw twoim systemie.


0

Właśnie natrafiłem na ten sam problem na Ubuntu. Miałem binfmtskonfigurowane i qemu-arm-staticskopiowane na tej samej ścieżce chroot-ed jak na systemie hosta.

Po godzinie zrobiłem to set|grep bashna maszynie hosta. Odkryłem, że mam /bin/bashdwie zmienne env: SHELLi SUDO_COMMAND. Po zamianie zmiennych mój chroot na ARM działał:

SHELL=/bin/sh SUDO_COMMAND=/bin/sh chroot hd

0

Sądzę, że dla tego PO wszystko, co musiał zrobić, to skonfigurować binfmts, po prostu uruchamiając:

update-binfmts --enable qemu-arm

Po uruchomieniu tego chroot w systemie plików zbrojenia byłby możliwy.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.