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ě?
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).
Č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
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
.
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
.
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.
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
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.
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
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.