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

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

我正在chroot尝试ARMx86_64.

我发现可以qemu通过将二进制文件复制到 chroot 系统来使用 static:

$ cp /usr/bin/qemu-arm archarm-chroot/usr/bin    

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

chroot: failed to run command ‘/bin/bash’: Exec format error

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

答案1

我时不时地使用 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

答案2

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

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

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

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

答案3

在 Arch 上,安装qemu-user-staticbinfmt-qemu-static来自 AUR 。

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

答案4

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

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

与 QEMU 的用户模式模拟器一起,一切都已准备就绪。

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

相关内容