如何将根目录转换为具有不同架构的文件系统?


38

我正尝试从中chroot导入Arch Linux ARM文件系统x86_64

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

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

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

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

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


2
您必须先配置binfmt,然后查看wiki.debian.org/QemuUserEmulation以获取简短的简短介绍。有关配置binfmt_misc的示例,请参见svn.kju-app.org/trunk/qemu/qemu/qemu-binfmt-conf.sh
Ulrich Dangel

Qemu静态软件包似乎不在Arch存储库中。
Jivings 2012年

2
抱歉,我没有使用arch,但是您应该可以通过添加-static链接器选项来构建静态qemu软件包
Ulrich Dangel 2012年

Answers:


15

您不能切换到其他架构。通过chroot,您正在架构上执行二进制文件(来自chroot)。在x86(和x86_64)上执行ARM二进制文件将导致“ Exec格式错误”。

如果要运行来自不同体系结构的二进制文件,则需要一个仿真器。Qemu是一个不错的选择,但是您将需要学习如何使用它。这将涉及创建RootFS并为ARM编译内核。您可能需要一个工具链来编译ARM二进制文件(和内核)。肯定有一件事情:忘记chroot方法,就不能在x86(x86_64)上运行为ARM编译的二进制文件。

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


6
您应该可以binfmt结合使用qemu和qemu来运行非本机目标-wiki.debian.org/QemuUserEmulation
Ulrich Dangel 2012年

2
我知道如何使用Qemu进行仿真。显然,您可以将其与c​​hroot一起使用,尽管显然我无法弄清楚该如何做。
Jivings 2012年

@UlrichDangel,是的,这是一个很好的信息。但是我认为OP并不是在寻找解决方案之王。一旦正确安装了qemu和qemu-arm仿真器,binfmt就可以实现,但是我相信他想进入需要qemu-system-arm的ARM仿真环境(例如Raspberry Pi)。
0xAF 2012年

@ 0xAF执行但binfmt/ qemu-user溶液正是OP所描述的,能够chroot到成臂的chroot和运行命令,而不需要建立一个专用的rootfs等
乌尔里希Dangel

1
@UlrichDangel,不过现在,我相信你是对的。可以使用qemu-arm输入模拟的chroot(或应该输入)。我将对此发表评论。
0xAF 2012年

33

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

这是可行的,但是在chroot all命令之后没有给出这样的文件或目录。我正在使用Fedora 24,selinux问题?请需要帮助
Superbiji'9

@Superbiji跑步/bin/ls有效吗?在这种情况下,您的$PATH变量未设置或出现乱码。尝试export PATH=/sbin:/usr/sbin:/usr/bin:/bin。您可能还应该添加其他路径,但这可能是一个好的开始。如果那不起作用,您可能忘记了将二进制文件复制到chroot环境。您也可以使用bash浏览文件系统,就像echo /*大致相当于ls /*。我不知道SELinux是否会妨碍您,没有经验。
吕克(Luc)2013年

1
连ls也给/bin/ls: no such file or directory。出口显示出良好的道路。但是echo / *是有效的,echo / usr / bin / qemu-arm *列出了文件。我也安装了sys,proc,dev
Superbiji

1
感谢您的帮助。.发现问题的原因是binfmt中的解释器指向无效路径
Superbiji

1
好的,以某种方式通过将qemu-arm-static复制到bla/usr/bin而不是来解决bla/bin。当我运行which qemu-arm-static它给我,/bin/usr所以我想它应该是一致的?
dafnahaktana

10

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

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


我必须手动运行:update-binfmts --importdir / var / lib / binfmts / --import,然后所有内容都会显示在/ proc / sys / fs / binfmt_misc中,并且chroot可以工作。
Mariano Alvira

7

为了得到这个工作装我qemu-static-armbinfmt-support来自AUR。

阅读有关的评论qemu-user-static。我必须PKGBUILD使用最新的下载URL和哈希值进行更新,以使makepkg完成。

(从AUR安装,下载压缩包,untarcd,奔跑makepkg -i

克里斯蒂安·沃尔夫的答案很重要。update-binfmts无法正确执行以启用这些格式。为此,我运行了:

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

如update-binfmts手册中所述。之后,cat /proc/sys/fs/binfmt_misc将显示各种binfmts。

然后确保将chroot 复制qemu-*-staticusr/bin/要chroot 的目录中,然后即可chroot工作。


6

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

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

连同QEMU的用户模式仿真器,一切就绪。

尽管您通常无法执行“完全”启动(即启动init和服务),但足以从其“自然”位置运行某些二进制文件,并且可以访问其所有配置文件,包括从配置文件绑定安装的一些二进制文件。 “主机”系统等



1

补充到Luc的答案:您需要确保解释器在chroot中的位置与在主文件系统中的位置相同。这是因为内核检测到可执行文件的体系结构,然后使用解释器的位置(如所示)update-binfmts --display启动它。所以线

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

实际上应该是

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

否则,如果chroot的位置qemu-arm-static不在/usr/bin您的系统内部,则您的chroot内可能会出现“找不到”错误,因为内核找不到所需的解释器。


0

我只是在Ubuntu上遇到了同样的问题。我确实已经binfmt配置并qemu-arm-static复制到了与主机系统相同的chroot-ed路径。

一个小时后,我set|grep bash在主机上做了。我发现我有/bin/bash两个env变量:SHELLSUDO_COMMAND。替换变量后,我的chroot到ARM可以工作了:

SHELL=/bin/sh SUDO_COMMAND=/bin/sh chroot hd

0

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

update-binfmts --enable qemu-arm

运行此命令后,可以将chroot放入arm文件系统中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.