¿Cómo puedo pasar a un sistema de archivos con una arquitectura diferente?

38

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?

Jivings
fuente
2
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
Ulrich Dangel
Los paquetes estáticos de Qemu no parecen estar en los repositorios de Arch.
Jivings
2
Lo siento, no uso Arch, pero probablemente deberías poder construir un paquete qemu estático agregando -statica las opciones del enlazador
Ulrich Dangel

Respuestas:

15

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).

0xAF
fuente
66
Debería poder usar binfmty qemu en combinación para ejecutar objetivos no nativos - wiki.debian.org/QemuUserEmulation
Ulrich Dangel
2
Sé cómo usar Qemu para la emulación. Aparentemente puedes usarlo con chroot, aunque claramente no puedo entender cómo.
Jivings
@UlrichDangel, sí, esta es una buena información. Pero creo que el OP no buscaba este rey de la solución. binfmt sería posible una vez que haya instalado adecuadamente qemu con la emulación qemu-arm, pero creo que quiere ingresar a su entorno de emulación ARM (por ejemplo, Raspberry Pi) donde necesitaría qemu-system-arm.
0xAF
@ 0xAF pero el binfmt/ 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.
Ulrich Dangel
1
@UlrichDangel, ahora en un segundo, creo que tienes razón. Es posible ingresar a chroot emulado con el qemu-arm (o debería serlo). Editaré mi comentario sobre eso.
0xAF
34

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:

# 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
Luc
fuente
Este funciona, pero después de chroot, todos los comandos no proporcionan dicho archivo o directorio. Estoy usando Fedora 24, problema selinux? Necesito ayuda por favor
Superbiji
@Superbiji ¿Funciona correr /bin/ls? En ese caso, su $PATHvariable no está configurada o es confusa. Tratar export 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, como echo /*es aproximadamente equivalente a ls /*. No sé si SELinux podría interponerse, no hay experiencia allí.
Luc
1
Incluso ls da /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, dev
Superbiji
1
Gracias por ayudar ... encontré el problema, la causa es que el intérprete en binfmt apunta a una ruta inválida
Superbiji
1
ok, de alguna manera se resolvió copiando qemu-arm-static en bla/usr/binlugar de bla/bin. Cuando corro which qemu-arm-staticme da, /bin/usrasí que supongo que debería ser consistente.
dafnahaktana
11

Creo que el problema es que no debes copiar qemu-armpero qemu-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 archivo qemu-arm. Si no, reinicie el servicio binfmt_support.

Lobo cristiano
fuente
Tuve que ejecutar manualmente: update-binfmts --importdir / var / lib / binfmts / --import, luego todo apareció en / proc / sys / fs / binfmt_misc y el chroot funciona.
Mariano Alvira
7

Para que esto funcione, instalé qemu-static-army binfmt-supportdesde AUR.

Lee los comentarios para qemu-user-static. Tuve que actualizar el PKGBUILDcon la URL de descarga más reciente y los hash para que makepkg finalice.

(Para instalar desde AUR, descargue el archivo comprimido, untar, cd, carrera makepkg -i)

La respuesta de Christian Wolf es importante. update-binfmtsno se ejecuta correctamente para habilitar estos formatos. Para hacerlo corrí:

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

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 el usr/bin/directorio en el que desea realizar el chroot y luego chrootdebería funcionar.

Mariano Alvira
fuente
6

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.

ack
fuente
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 
Maxim Akristiniy
fuente
1

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 linea

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

en realidad debería ser

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

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.

Marten Jacobs
fuente
0

Acabo de encontrar el mismo problema en Ubuntu. Hice binfmtconfigurar y qemu-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: SHELLy SUDO_COMMAND. Después de reemplazar las variables, mi chroot a ARM funcionó:

SHELL=/bin/sh SUDO_COMMAND=/bin/sh chroot hd
Victor Sergienko
fuente
0

Creo que, para este OP, todo lo que tenía que hacer era configurar binfmts, simplemente ejecutando:

update-binfmts --enable qemu-arm

Después de ejecutar esto, Chroot en el sistema de archivos arm habría sido posible.

usuario175914
fuente