it-swarm-eu.dev

Jak mohu chrootovat do souborového systému s jinou architekturou?

Snažím se chroot do souborového systému Arch Linux ARM from x86_64.

Viděl jsem, že je možné udělat pomocí statického qemu zkopírováním binární do chroot systému:

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

Ale i přes toto vždy dostávám následující chybu:

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

Vím, že to znamená, že architektury se liší. Dělám něco špatně?

39
Jivings

DŮLEŽITÉ: Podívejte se prosím na další odpovědi. Toto je stará a nepřesná odpověď.

Nemůžete chrootovat do jiné architektury. Chrootováním provádíte binární soubory (z chrootu) ve vaší architektuře. Provedení ARM binární soubory v x86 (a x86_64 v tomto ohledu)) by vedlo k „chybě formátu Exec“.

Pokud chcete spustit binární soubory z jiné architektury, budete potřebovat emulátor. Qemu je na to dobrý kandidát, ale musíte se naučit, jak jej používat. To by zahrnovalo vytvoření RootFS a kompilaci jádra pro ARM. Budete potřebovat toolchain pro kompilaci ARM binární soubory (a jádro). Jedna věc je jistá: Zapomeňte na metodu chroot, nemůžete spustit binární soubory kompilované pro ARM) = na x86 (x86_64).

Edit: Po malém rozhovoru s @ UrichDangelem jsem si uvědomil, že by mělo být možné vstoupit do prostředí chroot pomocí programů qemu-user (v tomto případě qemu-arm). Chroot by měl být prováděním kompilace qemu-arm pro vaši hostitelskou architekturu, pak qemu-arm může vykonat váš/bin/sh (kompilovaný pro rameno).

15
0xAF

Čas od času používám chroot ARM: chroot: můj telefon spouští Linux Deploy a obraz umírá občas. Poté jej zkopíruji do svého počítače a situaci chrootem prozkoumám takto:

# 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
36
Luc

Myslím, že problém je, že byste neměli kopírovat qemu-arm ale qemu-arm-static. Toto je statický kompilovaný spustitelný soubor schopný běžet z chrootu bez knihoven.

Můžete se také podívat do /proc/sys/fs/binfmt_misc pokud existuje soubor qemu-arm. Pokud ne restartujte službu binfmt_support.

11
Christian Wolf

Aby to fungovalo, nainstaloval jsem qemu-static-arm a binfmt-support od AUR.

Přečtěte si komentáře pro qemu-user-static. Musel jsem aktualizovat PKGBUILD nejnovější adresou URL ke stažení a hashem, aby makepkg dokončil.

(Chcete-li nainstalovat z AUR, stáhněte si tarball, untar, cd, spusťte makepkg -i)

Odpověď Christian Wolfa je důležitá. update-binfmts není aktivován správně, aby tyto formáty povolil. K tomu jsem běžel:

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

jak je popsáno v manuálu pro update-binfmts. Potom, cat /proc/sys/fs/binfmt_misc zobrazí různé binfmty.

Pak zkopírujte qemu-*-static do usr/bin/ adresář ve věci, na kterou chcete chrootovat, a pak by měl fungovat chroot.

7
Mariano Alvira

Rozhodně můžete „chrootovat“ do (připojeného) souborového systému určeného pro jinou architekturu a vykonávat nějakou smysluplnou práci, potřebujete pouze ty správné nástroje.

Podívejte se na PRoot, což je implementace chrootu, mount --bind a binfmt_misc v uživatelském prostoru: https://proot-me.github.io/

Spolu s emulátory uživatelského režimu QEMU jste všichni nastaveni.

Ačkoli obvykle nemůžete provést „plný“ boot (tj. Spustit init a služby), stačí spustit některé binární soubory z jejich „přirozeného“ místa s přístupem ke všem jejich konfiguračním souborům, včetně těch, které jsou připojeny z Hostitelský systém atd.

6
ack
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 
2
Maxim Akristiniy

Přidání Lucovy odpovědi: musíte se ujistit, že umístění tlumočníka je v chrootu stejné jako v hlavním systému souborů. Je to proto, že jádro detekuje architekturu spustitelného souboru a poté používá umístění interpretu, jak ukazuje update-binfmts --display pro spuštění. Takže řádek

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

ve skutečnosti by mělo být

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

V opačném případě můžete získat "Nenalezeno" - zrcadla uvnitř vašeho chrootu, protože vaše jádro nemůže najít požadovaného tlumočníka, pokud umístění qemu-arm-static není uvnitř /usr/bin ve vašem systému.

1
Marten Jacobs

Právě jsem narazil na stejný problém na Ubuntu. Nechal jsem nakonfigurovat binfmt a zkopírovat qemu-arm-static Na stejnou cestu chroot-ed jako v hostitelském systému.

Po hodině jsem udělal set|grep bash Na hostitelském počítači. Zjistil jsem, že mám /bin/bash Ve dvou proměnných env: Shell a Sudo_COMMAND. Po nahrazení proměnných můj chroot na ARM pracoval:

Shell=/bin/sh Sudo_COMMAND=/bin/sh chroot hd
0
Victor Sergienko

Věřím, že pro tento OP všechno, co potřeboval udělat, bylo nakonfigurovat binfmty jednoduše spuštěním:

update-binfmts --enable qemu-arm

Po spuštění by bylo možné chroot do ramenového souborového systému.

0
user175914