Come posso chroot in un filesystem con un diverso architechture?


38

Sto provando a chrootentrare in un ARMfilesystem Arch Linux da x86_64.

Ho visto che è possibile fare un uso statico qemucopiando il file binario nel sistema chroot:

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

Ma nonostante ciò ottengo sempre il seguente errore:

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

So che questo significa che le architetture differiscono. Sto facendo qualcosa di sbagliato?


2
Devi binfmtprima configurare , dai un'occhiata a wiki.debian.org/QemuUserEmulation per una breve introduzione. Un esempio per la configurazione di binfmt_misc è disponibile all'indirizzo svn.kju-app.org/trunk/qemu/qemu/qemu-binfmt-conf.sh
Ulrich Dangel,

I pacchetti statici Qemu non sembrano essere nei repository Arch.
Jivings,

2
Mi dispiace non usare arch, ma probabilmente dovresti essere in grado di creare un pacchetto qemu statico aggiungendo -staticalle opzioni del linker
Ulrich Dangel,

Risposte:


15

Non puoi chroot in diverse architetture. Con il chrooting, si eseguono i binari (dal chroot) sulla propria architettura. L'esecuzione di binari ARM su x86 (e x86_64 in quella materia) porterebbe a "Errore di formato Exec".

Se vuoi eseguire binari di diversa architettura avrai bisogno di un emulatore. Qemu è un buon candidato per questo, ma dovrai imparare come usarlo. Ciò implicherebbe la creazione di RootFS e la compilazione di un kernel per ARM. Avrai probabilmente bisogno di una toolchain per compilare binari ARM (e kernel). Una cosa è certa: dimentica il metodo chroot, non puoi eseguire i binari compilati per ARM su x86 (x86_64).

Modifica: Dopo la piccola chiacchierata con @UrichDangel, mi sono reso conto che dovrebbe essere possibile entrare nell'ambiente chroot con i programmi utente qemu (qemu-arm in questo caso). Chroot dovrebbe eseguire qemu-arm compilato per l'architettura host, quindi qemu-arm può eseguire il / bin / sh (compilato per arm).


6
Dovresti essere in grado di utilizzare binfmte qemu in combinazione per eseguire obiettivi non nativi - wiki.debian.org/QemuUserEmulation
Ulrich Dangel,

2
So usare Qemu per l'emulazione. Apparentemente puoi usarlo con chroot, anche se chiaramente non riesco a capire come.
Jivings,

@UlrichDangel, Sì, questa è una buona informazione. Ma penso che l'OP non cercasse questo re della soluzione. binfmt sarebbe possibile dopo aver installato correttamente qemu con emulazione qemu-arm, ma credo che voglia entrare nel suo ambiente di emulazione ARM (ad esempio Raspberry Pi) dove avrà bisogno di qemu-system-arm.
0xAF,

@ 0xAF ma la soluzione binfmt/ qemu-userè esattamente ciò che OP ha descritto, essere in grado di eseguire il chroot in un chroot arm ed eseguire i comandi senza la necessità di creare un rootfs dedicato ecc.
Ulrich Dangel,

1
@UlrichDangel, ora un secondo, credo che tu abbia ragione. È possibile inserire il chroot emulato con il braccio qemu (o dovrebbe essere). Modificherò il mio commento su questo.
0xAF,

34

Di tanto in tanto uso un chroot ARM: il mio telefono esegue Linux Deploy e l'immagine scompare di tanto in tanto. Poi lo copio sul mio computer ed esamino la situazione con chroot in questo modo:

# 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

Questo funziona, ma dopo chroot tutti i comandi non danno tale file o directory. Sto usando Fedora 24, problema selinux? Hai bisogno di aiuto per favore
Superbiji,

@Superbiji Funziona in esecuzione /bin/ls? In tal caso, la $PATHvariabile non è impostata o confusa. Prova export PATH=/sbin:/usr/sbin:/usr/bin:/bin. Potrebbero esserci altri percorsi che dovresti aggiungere, ma questo è probabilmente un buon inizio. Se non funziona, probabilmente hai dimenticato di copiare i binari nell'ambiente chroot. Puoi usare bash anche per navigare nel filesystem, come echo /*è approssimativamente equivalente a ls /*. Non so se SELinux potrebbe interferire, nessuna esperienza lì.
Luc,

1
Anche io mi dà /bin/ls: no such file or directory. l'esportazione mostra un buon percorso. Ma echo / * funziona, echo / usr / bin / qemu-arm * elenca il file. Ho anche montato sys, proc, dev
Superbiji

1
Grazie per l'aiuto .. trovato il problema la causa è l'interprete nel punto binfmt verso percorso non valido
Superbiji

1
ok, in qualche modo è stato risolto copiando qemu-arm-static bla/usr/bininvece di bla/bin. Quando corro which qemu-arm-staticmi dà /bin/usrquindi immagino che dovrebbe essere coerente?
Dafnahaktana,

11

Penso che il problema sia che non dovresti copiare qemu-armma qemu-arm-static. Questo è un eseguibile compilato statico in grado di funzionare dall'interno del chroot senza librerie.

Puoi anche cercare /proc/sys/fs/binfmt_miscse esiste un file qemu-arm. In caso contrario, riavviare il servizio binfmt_support.


Ho dovuto eseguire manualmente: update-binfmts --importdir / var / lib / binfmts / --import quindi tutto appariva in / proc / sys / fs / binfmt_misc e il chroot funziona.
Mariano Alvira,

7

Per farlo funzionare ho installato qemu-static-arme binfmt-supportda AUR.

Leggi i commenti per qemu-user-static. Ho dovuto aggiornare il file PKGBUILDcon l'URL di download più recente e gli hash per completare makepkg.

(Per installare da AUR, scaricare il tarball, untar, cd, run makepkg -i)

La risposta di Christian Wolf è importante. update-binfmtsnon viene eseguito correttamente per abilitare questi formati. Per fare ciò ho corso:

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

come descritto nella manpage di update-binfmts. Successivamente, cat /proc/sys/fs/binfmt_miscmostrerà i vari binfmts.

Quindi assicurati di copiare il file qemu-*-staticnella usr/bin/directory nella quale vuoi eseguire il chroot e quindi chrootdovrebbe funzionare.


6

Puoi sicuramente 'chroot' in un filesystem (montato) pensato per un'architettura diversa e fare un lavoro significativo, hai solo bisogno degli strumenti giusti.

Dai un'occhiata a PRoot, che è un'implementazione nello spazio utente di chroot, mount --bind e binfmt_misc: https://proot-me.github.io/

Insieme agli emulatori della modalità utente di QEMU, sei pronto.

Sebbene di solito non sia possibile eseguire un avvio "completo" (ovvero avviare init e servizi), è abbastanza buono eseguire alcuni binari dal loro posto "naturale", con accesso a tutti i loro file di configurazione, inclusi alcuni che sono montati dal bind dal sistema "host", ecc.


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

Aggiungendo alla risposta di Luc: è necessario assicurarsi che la posizione dell'interprete sia la stessa nel chroot come nel file system principale. Questo perché il kernel rileva l'architettura di un eseguibile e quindi utilizza la posizione dell'interprete come mostrato da update-binfmts --displayper avviarlo. Quindi la linea

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

dovrebbe effettivamente essere

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

Altrimenti, potresti avere errori "Not found" all'interno del tuo chroot poiché il tuo kernel non riesce a trovare l'interprete richiesto, se la posizione di qemu-arm-staticnon è all'interno /usr/bindel tuo sistema.


0

Ho appena incontrato lo stesso problema su Ubuntu. Ho binfmtconfigurato e qemu-arm-staticcopiato sullo stesso percorso chroot del sistema host.

Dopo un'ora, l'ho fatto set|grep bashsu una macchina host. Ho scoperto che avevo /bin/bashin due variabili env: SHELLe SUDO_COMMAND. Dopo aver sostituito le variabili, il mio chroot in ARM ha funzionato:

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

0

Credo, per questo PO, tutto ciò che doveva fare era configurare binfmts, semplicemente eseguendo:

update-binfmts --enable qemu-arm

Dopo averlo eseguito, sarebbe stato possibile eseguire il chroot nel filesystem arm.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.