Estoy tratando de chroot
ingresar a un ARM
sistema de archivos Arch Linux desde x86_64
.
He visto que es posible hacer uso de estática qemu
copiando 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?
binfmt
Primero 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-static
a 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
binfmt
y qemu en combinación para ejecutar objetivos no nativos - wiki.debian.org/QemuUserEmulationbinfmt
/qemu-user
la 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$PATH
variable 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/bin
lugar debla/bin
. Cuando corrowhich qemu-arm-static
me da,/bin/usr
así que supongo que debería ser consistente.Creo que el problema es que no debes copiar
qemu-arm
peroqemu-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_misc
si existe un archivoqemu-arm
. Si no, reinicie el serviciobinfmt_support
.fuente
Para que esto funcione, instalé
qemu-static-arm
ybinfmt-support
desde AUR.Lee los comentarios para
qemu-user-static
. Tuve que actualizar elPKGBUILD
con 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-binfmts
no 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_misc
mostrará los diversos binfmts.Luego, asegúrese de copiarlo
qemu-*-static
en elusr/bin/
directorio en el que desea realizar el chroot y luegochroot
deberí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 --display
para 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-static
no está dentro/usr/bin
de su sistema.fuente
Acabo de encontrar el mismo problema en Ubuntu. Hice
binfmt
configurar yqemu-arm-static
copiar en la misma ruta de acceso chroot-ed que en el sistema host.Después de una hora, lo hice
set|grep bash
en una máquina host. Descubrí que tenía/bin/bash
dos variables env:SHELL
ySUDO_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