Estou tentando chroot
entrar em um ARM
sistema de arquivos Arch Linux a partir de x86_64
.
Vi que é possível usar a estática qemu
copiando o binário no 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 diferem. Estou fazendo algo errado?
binfmt
primeiro, dê uma olhada no wiki.debian.org/QemuUserEmulation para obter uma breve introdução. Um exemplo para configurar o binfmt_misc pode ser encontrado em svn.kju-app.org/trunk/qemu/qemu/qemu-binfmt-conf.sh-static
às opções de vinculadorRespostas:
Você não pode criar uma arquitetura diferente. Fazendo chroot, você está executando os binários (a partir do chroot) em sua arquitetura. A execução de binários ARM no x86 (e x86_64 nesse assunto) levaria ao "erro de formato Exec".
Se você deseja executar binários de arquitetura diferente, precisará de um emulador. O Qemu é um bom candidato para isso, mas você precisará aprender como usá-lo. Isso envolveria a criação do RootFS e a compilação de um kernel para o ARM. Você precisará de uma cadeia 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 no x86 (x86_64).
Edit: Após a pequena conversa com @UrichDangel, eu percebi, deveria ser possível entrar no ambiente chroot com programas qemu-user (qemu-arm neste caso). O 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).
fonte
binfmt
e qemu em combinação para executar as metas não nativas - wiki.debian.org/QemuUserEmulationbinfmt
/qemu-user
solução é exatamente o OP descrito, sendo capaz de chroot em em um chroot braço e executar os comandos sem a necessidade de construir um rootfs dedicados etc.De vez em quando, uso um chroot do ARM: meu telefone executa o Linux Deploy e a imagem morre de vez em quando. Depois, copio-o para o meu computador e examino a situação com o chroot assim:
fonte
/bin/ls
funciona? Nesse caso, sua$PATH
variável está desconfigurada ou ilegível. Tenteexport PATH=/sbin:/usr/sbin:/usr/bin:/bin
. Pode haver outros caminhos que você deve adicionar, mas este provavelmente é um bom começo. Se isso não funcionar, você provavelmente esqueceu de copiar binários no ambiente chroot. Você pode usar o bash para navegar pelo sistema de arquivos também, comoecho /*
é aproximadamente equivalente als /*
. Não sei se o SELinux pode atrapalhar, não há experiência lá./bin/ls: no such file or directory
. a exportação mostra um bom caminho. Mas echo / * está funcionando, echo / usr / bin / qemu-arm * lista o arquivo. Eu também montar sys, proc, Devbla/usr/bin
vez debla/bin
. Quando corro,which qemu-arm-static
isso me dá,/bin/usr
então acho que deve ser consistente?Eu acho que o problema é que você não deve copiar,
qemu-arm
masqemu-arm-static
. Este é um executável compilado estático, capaz de executar de dentro do chroot sem nenhuma biblioteca.Você também pode procurar
/proc/sys/fs/binfmt_misc
se existe um arquivoqemu-arm
. Caso contrário, reinicie o serviçobinfmt_support
.fonte
Para chegar a este trabalho que eu instalado
qemu-static-arm
ebinfmt-support
de AUR.Leia os comentários para
qemu-user-static
. Eu tive que atualizar oPKGBUILD
URL de download e os hashes mais recentes para o makepkg terminar.(Para instalar a partir AUR, baixe o tarball,
untar
,cd
, runmakepkg -i
)A resposta de Christian Wolf é importante.
update-binfmts
não é executado corretamente para ativar esses formatos. Para fazer isso, eu corri:conforme descrito na página de manual para update-binfmts. Depois disso,
cat /proc/sys/fs/binfmt_misc
mostrará os vários binfmts.Em seguida, certifique-se de copiar o arquivo
qemu-*-static
para ousr/bin/
diretório em que você deseja fazer o chroot e, em seguida,chroot
deve funcionar.fonte
Você pode definitivamente '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 no PRoot, que é uma implementação no espaço do usuário de chroot, mount --bind e binfmt_misc: https://proot-me.github.io/
Juntamente com os emuladores de modo de usuário do QEMU, você está pronto.
Embora você normalmente não possa executar uma inicialização 'completa' (ou seja, iniciando init e serviços), é bom executar alguns binários a partir do local 'natural', com acesso a todos os seus arquivos de configuração, incluindo alguns que são montados em bind sistema 'host' etc.
fonte
fonte
Adicionando a resposta de Luc: você precisa garantir que a localização do intérprete seja a mesma no chroot e no sistema de arquivos principal. Isso ocorre porque o kernel detecta a arquitetura de um executável e, em seguida, usa o local do intérprete como mostrado
update-binfmts --display
para iniciá-lo. Então a linharealmente deveria ser
Caso contrário, você poderá obter os espelhos "Não encontrado" dentro do seu chroot, pois o kernel não consegue encontrar o intérprete necessário, se o local
qemu-arm-static
não estiver dentro/usr/bin
do seu sistema.fonte
Acabei de encontrar o mesmo problema no Ubuntu. Eu
binfmt
configurei eqemu-arm-static
copiei para o mesmo caminho chroot-ed que no sistema host.Depois de uma hora, eu fiz
set|grep bash
em uma máquina host. Eu descobri que tinha/bin/bash
duas variáveis env:SHELL
eSUDO_COMMAND
. Depois de substituir as variáveis, meu chroot para o ARM funcionou:fonte
Acredito que, para este OP, tudo o que ele precisava fazer era configurar o binfmts, simplesmente executando:
Depois de executar isso, o chroot no sistema de arquivos arm seria possível.
fonte