Estoy tratando de chrootingresar a un ARMsistema de archivos Arch Linux desde x86_64.
He visto que es posible hacer uso de estática qemucopiando el binario en el sistema chroot:
$ cp /usr/bin/qemu-arm archarm-chroot/usr/bin
Pero a pesar de esto siempre recibo el siguiente error:
chroot: failed to run command ‘/bin/bash’: Exec format error
Sé que esto significa que las arquitecturas difieren. ¿Estoy haciendo algo mal?

binfmtPrimero debe configurar , eche un vistazo a wiki.debian.org/QemuUserEmulation para una breve introducción tranquila. Un ejemplo para configurar binfmt_misc se puede encontrar en svn.kju-app.org/trunk/qemu/qemu/qemu-binfmt-conf.sh-statica las opciones del enlazadorRespuestas:
No puedes entrar en una arquitectura diferente. Al hacer chrooting, está ejecutando los binarios (desde el chroot) en su arquitectura. La ejecución de archivos binarios ARM en x86 (y x86_64 en ese asunto) conduciría a un "error de formato de ejecución".
Si desea ejecutar binarios de diferentes arquitecturas, necesitará un emulador. Qemu es un buen candidato para esto, pero deberá aprender a usarlo. Esto implicaría crear RootFS y compilar un núcleo para ARM. Necesitará una cadena de herramientas para compilar binarios ARM (y kernel) tal vez. Una cosa es segura: olvide el método chroot, no puede ejecutar binarios compilados para ARM en x86 (x86_64).
Editar: Después de la pequeña charla con @UrichDangel, me di cuenta de que debería ser posible ingresar al entorno chroot con los programas qemu-user (qemu-arm en este caso). Chroot debe ejecutar qemu-arm compilado para su arquitectura de host, luego qemu-arm puede ejecutar su / bin / sh (compilado para arm).
fuente
binfmty qemu en combinación para ejecutar objetivos no nativos - wiki.debian.org/QemuUserEmulationbinfmt/qemu-userla solución es exactamente lo que describe OP, pudiendo chroot en un chroot en el brazo y ejecutar los comandos sin la necesidad de construir un dedicado rootfs etc.Uso un chroot ARM de vez en cuando: mi teléfono ejecuta Linux Deploy y la imagen muere de vez en cuando. Luego lo copio a mi computadora y examino la situación con chroot de esta manera:
fuente
/bin/ls? En ese caso, su$PATHvariable no está configurada o es confusa. Tratarexport PATH=/sbin:/usr/sbin:/usr/bin:/bin. Puede haber otras rutas que debería agregar, pero este es probablemente un buen comienzo. Si eso no funciona, probablemente olvidó copiar binarios al entorno chroot. También puede usar bash para navegar por el sistema de archivos, comoecho /*es aproximadamente equivalente als /*. No sé si SELinux podría interponerse, no hay experiencia allí./bin/ls: no such file or directory. La exportación muestra un buen camino. Pero echo / * está funcionando, echo / usr / bin / qemu-arm * enumera el archivo. También he montado sys, proc, devbla/usr/binlugar debla/bin. Cuando corrowhich qemu-arm-staticme da,/bin/usrasí que supongo que debería ser consistente.Creo que el problema es que no debes copiar
qemu-armperoqemu-arm-static. Este es un ejecutable compilado estático capaz de ejecutarse desde el interior del chroot sin ninguna biblioteca.También puede buscar
/proc/sys/fs/binfmt_miscsi existe un archivoqemu-arm. Si no, reinicie el serviciobinfmt_support.fuente
Para que esto funcione, instalé
qemu-static-armybinfmt-supportdesde AUR.Lee los comentarios para
qemu-user-static. Tuve que actualizar elPKGBUILDcon la URL de descarga más reciente y los hash para que makepkg finalice.(Para instalar desde AUR, descargue el archivo comprimido,
untar,cd, carreramakepkg -i)La respuesta de Christian Wolf es importante.
update-binfmtsno se ejecuta correctamente para habilitar estos formatos. Para hacerlo corrí:como se describe en la página de manual de update-binfmts. Después de eso,
cat /proc/sys/fs/binfmt_miscmostrará los diversos binfmts.Luego, asegúrese de copiarlo
qemu-*-staticen elusr/bin/directorio en el que desea realizar el chroot y luegochrootdebería funcionar.fuente
Definitivamente puede 'hacer chroot' en un sistema de archivos (montado) destinado a una arquitectura diferente y hacer un trabajo significativo, solo necesita las herramientas adecuadas.
Eche un vistazo a PRoot, que es una implementación en el espacio del usuario de chroot, mount --bind y binfmt_misc: https://proot-me.github.io/
Junto con los emuladores de modo de usuario de QEMU, ya está todo listo.
Aunque generalmente no puede realizar un arranque 'completo' (es decir, iniciar init y servicios), es lo suficientemente bueno para ejecutar algunos archivos binarios desde su lugar 'natural', con acceso a todos sus archivos de configuración, incluidos algunos que están montados en enlace desde el sistema 'host', etc.
fuente
fuente
Agregando a la respuesta de Luc: debe asegurarse de que la ubicación del intérprete sea la misma en el chroot que en el sistema de archivos principal. Esto se debe a que el kernel detecta la arquitectura de un ejecutable y luego usa la ubicación del intérprete como se muestra
update-binfmts --displaypara iniciarlo. Entonces la lineaen realidad debería ser
De lo contrario, puede obtener errores "No encontrados" dentro de su chroot ya que su núcleo no puede encontrar el intérprete requerido, si la ubicación de
qemu-arm-staticno está dentro/usr/binde su sistema.fuente
Acabo de encontrar el mismo problema en Ubuntu. Hice
binfmtconfigurar yqemu-arm-staticcopiar en la misma ruta de acceso chroot-ed que en el sistema host.Después de una hora, lo hice
set|grep bashen una máquina host. Descubrí que tenía/bin/bashdos variables env:SHELLySUDO_COMMAND. Después de reemplazar las variables, mi chroot a ARM funcionó:fuente
Creo que, para este OP, todo lo que tenía que hacer era configurar binfmts, simplemente ejecutando:
Después de ejecutar esto, Chroot en el sistema de archivos arm habría sido posible.
fuente