如何 chroot 到具有不同架构的文件系统?

Jiv*_*ngs 47 chroot qemu arch-arm

我试图chroot进入的Arch LinuxARM的文件系统x86_64

我已经看到可以qemu通过将二进制文件复制到 chroot 系统来使用静态:

$ cp /usr/bin/qemu-arm archarm-chroot/usr/bin    
Run Code Online (Sandbox Code Playgroud)

但尽管如此,我总是收到以下错误:

chroot: failed to run command ‘/bin/bash’: Exec format error
Run Code Online (Sandbox Code Playgroud)

我知道这意味着架构不同。难道我做错了什么?

Luc*_*Luc 47

我不时使用 ARM chroot:我的手机运行 Linux Deploy 并且映像不时死掉。然后我将它复制到我的计算机并使用 chroot 检查情况,如下所示:

# 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
Run Code Online (Sandbox Code Playgroud)

  • 甚至 ls 也给出了`/bin/ls: no such file or directory`。出口显示出良好的路径。但是 echo /* 正在工作, echo /usr/bin/qemu-arm* 列出文件。我还挂载了 sys、proc、dev (2认同)
  • 感谢您的帮助.. 发现问题的原因是 binfmt 中的解释器指向无效路径 (2认同)

0xA*_*xAF 15

重要提示:请查看其他答案。这是旧的和不准确的答案。

你不能 chroot 进入不同的架构。通过 chrooting,您正在架构上执行二进制文件(来自 chroot)。在 x86(以及 x86_64)上执行 ARM 二进制文件会导致“Exec 格式错误”。

如果您想运行来自不同架构的二进制文件,您将需要一个模拟器。Qemu 是一个很好的候选者,但您需要学习如何使用它。这将涉及创建 RootFS 并为 ARM 编译内核。您可能需要一个工具链来编译 ARM 二进制文件(和内核)。有一件事是肯定的:忘记 chroot 方法,你不能在 x86 (x86_64) 上运行为 ARM 编译的二进制文件。

编辑: 在与@UrichDangel 闲聊后,我意识到,应该可以使用 qemu-user 程序(在这种情况下为 qemu-arm)进入 chroot 环境。Chroot 应该执行为您的主机架构编译的 qemu-arm,然后 qemu-arm 可以执行您的 /bin/sh(为 arm 编译)。

  • 您应该能够结合使用 `binfmt` 和 qemu 来运行非本地目标 - http://wiki.debian.org/QemuUserEmulation (7认同)
  • 我知道如何使用 Qemu 进行仿真。显然,您可以将它与 chroot 一起使用,但显然我不知道如何使用。 (2认同)

Chr*_*olf 10

我认为问题是你不应该复制qemu-arm而是qemu-arm-static. 这是一个静态编译的可执行文件,无需任何库即可从 chroot 内部运行。

您也可以查看/proc/sys/fs/binfmt_misc是否存在文件qemu-arm。如果没有重启服务binfmt_support


小智 9

在 Arch 上,从 AUR安装qemu-user-static和安装binfmt-qemu-static

然后确保将 复制qemu-*-staticusr/bin/您想要 chroot到的目录中,然后chroot应该使用类似的东西chroot /mnt qemu-arm-static /bin/bash


ack*_*ack 7

您绝对可以“chroot”到一个用于不同架构的(挂载)文件系统并做一些有意义的工作,您只需要正确的工具。

看看 PRoot,它是 chroot、mount --bind 和 binfmt_misc 的用户空间实现:https ://proot-me.github.io/

与 QEMU 的用户模式模拟器一起,你就准备好了。

尽管您通常无法执行“完全”引导(即启动 init 和服务),但从它们的“自然”位置运行一些二进制文件就足够了,可以访问它们的所有配置文件,包括一些从“主机”系统等


小智 6

我相信,对于这个 OP,他所需要做的就是配置 binfmts,只需运行:

update-binfmts --enable qemu-arm
Run Code Online (Sandbox Code Playgroud)

运行此命令后,就可以 chroot 进入arm文件系统了。