proot
能够与QEMU
模拟器结合使用,通过--qemu
参数,在不同架构的系统上运行二进制文件。这使得在例如x86_64机器上可以运行ARM架构的程序,或在ARM机器上运行x86架构的程序。以下是一个使用proot
以及--qemu
参数来运行一个不同架构程序的基本示例:
首先,你需要确保安装了适当版本的QEMU用于相应架构的模拟。例如要在x86_64机器上模拟ARM架构,你将需要安装qemu-user-static
包(必须用qemu-user-static, 不用用qemu-user, 区别放在后面了)。在基于Debian的系统上可以这样安装:
sudo apt update
sudo apt install qemu-user-static
CenOS上yum无法直接安装qemu-user-static, 可以这么下载:
wget https://github.com/multiarch/qemu-user-static/releases/download/v5.2.0-2/qemu-aarch64-static
然后获取arm64架构linux的rootfs,
mkdir rootfs_arm
cd rootfs_arm
wget http://cdimage.ubuntu.com/ubuntu-base/releases/20.04/release/ubuntu-base-20.04.1-base-arm64.tar.gz
tar zxvf ubuntu-base-20.04.1-base-arm64.tar.gz
安装完成后,你可以使用以下命令来运行一个ARM架构的环境:
proot --qemu=/usr/bin/qemu-aarch64-static -S <rootfs>
然后就可以运行arm程序了。
在宿主机上运行ps -ef|grep qemu, 可以看到所有运行的aarch64架构的程序,其实都是用qemu-user-static运行的
在这个例子里,proot
利用了--qemu
选项和qemu-arm-static
来创建一个运行ARM程序的环境。/bin/bash
则是我们要在此仿真环境中运行的程序。
请注意,这个例子仅仅是个起始点。根据你的具体需求,你可能需要设置额外的proot
参数,如-b
来绑定目录,或是-k
来指定内核版本。而且,由于架构模拟使用QEMU,性能可能与在原生架构上运行有显著不同。不同的目标程序和系统环境可能需要不同的配置和调整。
qemu-user和qemu-user-static的区别是什么
qemu-user
和 qemu-user-static
都是 QEMU 的用户空间模拟工具,它们允许您在一个架构(比如 x86_64)上执行为另一个架构(比如 ARM)编译的二进制文件。这种模拟是在用户层级上进行的,跟全系统虚拟化(如使用qemu-system-*
)相比,它不模拟整个硬件,而是直接在主机的内核上运行。
两者的主要区别在于:
qemu-user
:
- 当您使用动态链接的二进制时,
qemu-user
需要在目标系统(例如正在模拟的ARM系统)上有相应的动态库版本。这是因为它要求系统动态加载库来执行程序。 - 这意味着除了二进制外,在模拟过程中使用的所有库必须适合被模拟的体系结构。
- 通常适合用于持续集成环境,其中宿主系统可以安装和配置所有必要的模拟环境依赖库。
qemu-user-static
:
qemu-user-static
提供了静态链接的QEMU用户空间二进制文件,可以在没有目标系统库的情况下运行(因为所有必要的库都已编译到二进制内部)。- 这是一种更加独立的解决方案,因为它不需要宿主系统上有目标架构的库。这使得
qemu-user-static
非常适合在隔离的环境(如Docker容器)中使用或在难以满足特定依赖的环境中使用。 qemu-user-static
常用于“chroot”环境,使得我们可以在不同架构的root文件系统内部建立一个简单的“模拟系统”,而不需要模拟整个系统或内核。
在实践中,如果您正在处理容器、chroot
环境或跨架构的构建系统, qemu-user-static
通常是更好的选择,因为它简化了工作流程并增加了灵活性。需要注意的是,静态版本的QEMU模拟器(qemu-*-static
)通常在容器中使用,特别是在创建能够启动不同架构二进制文件的容器时,如利用Multiarch来创建可以在x86_64系统上构建和测试ARM镜像的Docker容器。
在安装qemu-user-static
后,您通常可以在任何位置运行被模拟架构的二进制文件,它在需要时会自行调用静态QEMU用户空间模拟器。