如何使用 qemu 在 amd64 主机上启动虚拟机 guest armv8

Mau*_*ber 5 virtualization arm cross-platform qemu

当我希望客户系统是ARMv8(Raspberry Pi 3,更具体地对 Cortex A53 处理器感兴趣)时,如何在 Ubuntu 18.04 x86_64 主机系统上运行带有qemu的虚拟机?

背景:

我想在上述主机系统上为具有 ARMv8 的真机编译一个项目。目前,这是通过直接在主机系统中交叉编译来完成的。出于许多不同的原因,我想设置一个虚拟机来为 ARMv8 编译(虚拟)本机二进制文件。二进制文件稍后需要在真正的 ARMv8 机器上运行。

除了要在主机系统上安装的 Qemu 和正确的 qemu-system-aarch64 之外,还需要操作系统的映像。理想情况下与真实 ARMv8 设备上运行的相同。Ubuntu IoT Core 18.04 64 位可从https://ubuntu.com/download/raspberry-pi获取,我将其保存到名为 ubuntu18045arm64rpi3.img.xz 的本地文件夹中。

提取后,我得到了提取的图像“ubuntu18045arm64rpi3.img”

要启动具有给定映像和所需架构的虚拟机,我输入以下内容:

sudo qemu-system-aarch64 -m 1024 -cpu cortex-a53 -M virt -drive if=none,file=ubuntu18045arm64rpi3.img,id=hd0
Run Code Online (Sandbox Code Playgroud)

这给了我一个这样的窗口: qemu监视器

现在我的主要问题是:

  1. 我期望虚拟机启动,我可以在其中从给定的映像安装操作系统。我做错了什么或者如何实现这个目标?

  2. 稍后,我想在来宾 ARMv8 计算机上安装编译器(如果尚未安装)并在那里编译我的项目。之后我计划将编译好的二进制文件传输到真正的 ARMv8 机器上,并期望它们能够顺利运行。以目前的方法可以做到这一点吗?

Pet*_*ell 1

您不能只将磁盘映像传递给 aarch64 QEMU 并让它启动。您需要传递一个内核来启动,或者传递一个 BIOS(可能是 UEFI)映像(然后可以从磁盘映像读取内核)。

这篇博文有一个在 QEMU 上运行 Debian 的示例;Ubuntu 启动可能是类似的。 https://translatedcode.wordpress.com/2017/07/24/installing-debian-on-qemus-64-bit-arm-virt-board/

您的链接是树莓派特定磁盘映像 - 因为您没有要求 QEMU 为树莓派板建模,所以我建议不要使用它。你想要 Ubuntu 提供的任何东西作为最普通/通用的 aarch64 镜像。如果您要选择“通过 UEFI 启动”路线,那么您需要一个适用于 SBSA/UEFI 系统的磁盘映像。

关于已编译二进制文件的可移植性的第二个问题,这实际上与任何两个 Linux 系统相同。如果两个系统具有相同的操作系统/发行版版本(因此它们具有相同的库版本等),并且安装了相同的运行时库集,并且您没有告诉编译器编译以使用目标 CPU 没有的 CPU 功能没有,那么它应该可以工作。

顺便说一下,在这个模拟设置中进行编译将比当前的交叉编译设置或直接在真实的 AArch64 硬件上编译二进制文件慢得多。