Como posso fazer chroot em um sistema de arquivos com uma arquitetura diferente?

Como posso fazer chroot em um sistema de arquivos com uma arquitetura diferente?

Estou tentando chrootentrar em um sistema de arquivos Arch Linux ARMdo x86_64.

Eu vi que é possível fazer isso usando static qemucopiando o binário para o sistema chroot:

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

Mas apesar disso, sempre recebo o seguinte erro:

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

Eu sei que isso significa que as arquiteturas são diferentes. Estou fazendo algo errado?

Responder1

Eu uso um chroot ARM de vez em quando: meu telefone roda Linux Deploy e a imagem morre de vez em quando. Em seguida, copio-o para o meu computador e examino a situação com o chroot assim:

# 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

Responder2

IMPORTANTE:Por favor, veja as outras respostas. Esta é uma resposta antiga e imprecisa.

Você não pode fazer chroot em arquiteturas diferentes. Ao fazer chroot, você está executando os binários (do chroot) em sua arquitetura. A execução de binários ARM em x86 (e x86_64 nesse caso) levaria a um "erro de formato Exec".

Se você deseja executar binários de arquiteturas diferentes, você precisará de um emulador. Qemu é um bom candidato para isso, mas você precisará aprender como usá-lo. Isso envolveria a criação de RootFS e a compilação de um kernel para ARM. Você precisará de um conjunto de ferramentas para compilar binários ARM (e kernel), talvez. Uma coisa é certa: esqueça o método chroot, você não pode executar binários compilados para ARM em x86 (x86_64).

Editar: Após uma conversa fiada com @UrichDangel, percebi que deveria ser possível entrar no ambiente chroot com programas qemu-user (qemu-arm neste caso). Chroot deve estar executando o qemu-arm compilado para sua arquitetura Host, então o qemu-arm pode executar seu /bin/sh (compilado para arm).

Responder3

No Arch, instaleqemu-user-staticebinfmt-qemu-staticda AUR.

Em seguida, certifique-se de copiar qemu-*-staticpara o usr/bin/diretório onde você deseja fazer o chroot e então chrootdeve funcionar com algo comochroot /mnt qemu-arm-static /bin/bash

Responder4

Você pode definitivamente fazer 'chroot' em um sistema de arquivos (montado) destinado a uma arquitetura diferente e fazer algum trabalho significativo, você só precisa das ferramentas certas.

Dê uma olhada em PRoot, que é uma implementação de chroot, mount --bind e binfmt_misc no espaço do usuário:https://proot-me.github.io/

Junto com os emuladores de modo de usuário do QEMU, está tudo pronto.

Embora normalmente você não possa executar uma inicialização 'completa' (ou seja, iniciar o init e os serviços), é bom o suficiente para executar alguns binários a partir de seu local 'natural', com acesso a todos os seus arquivos de configuração, incluindo alguns que são montados por ligação a partir do sistema 'host', etc.

informação relacionada