使用proot+Qemu在x86_64平台运行arm架构程序

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-userqemu-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用户空间模拟器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值