如何在 x86 上通过 Linux KVM API 实例化基于 ARM 的 VM?

How to instantiate an ARM-based VM through Linux KVM API on x86?

假设我有一台 x86 机器。通过 Linux KVM API.

创建 x86 VM 很容易

参见:kvm-host中的vm_init()

if ((v->kvm_fd = open("/dev/kvm", O_RDWR)) < 0)
        return throw_err("Failed to open /dev/kvm");

    if ((v->vm_fd = ioctl(v->kvm_fd, KVM_CREATE_VM, 0)) < 0)
        return throw_err("Failed to create vm");

    if (ioctl(v->vm_fd, KVM_SET_TSS_ADDR, 0xffffd000) < 0)
        return throw_err("Failed to set TSS addr");
...
if ((v->vcpu_fd = ioctl(v->vm_fd, KVM_CREATE_VCPU, 0)) < 0)
        return throw_err("Failed to create vcpu");

在这个项目中,很容易在 x86 机器上创建 x86 VM。

但是,我的问题是,如果我希望该 VM 是 ARM 架构怎么办?

我认为这是适用的,因为我们有 qemu-system-arm,而我试图实现的正是它所做的。

您所要求的是不可能的。 KVM 不能 运行 虚拟机用于不同于构建内核的架构和 运行s 的虚拟机。如果您想 运行 使用 KVM 的 ARM VM,您将必须在 ARM 处理器上执行此操作。 KVM 只是利用底层 CPU 的硬件功能进行虚拟化,这意味着指令实际上是由主机 运行 CPU,所以你不能 运行 ARM 代码x86 机器。

qemu-system-arm 在 x86 机器上所做的是在没有主机 kernel/CPU 的任何帮助的情况下模拟软件和用户空间中的所有指令。只有在支持 KVM 的 ARM 机器上,您才能将 KVM 与 qemu-system-arm 一起使用。有关详细信息,请参阅 KVM Processor Support

您可以使用注册为适当解释器的 qemu-arm-system 构建一个 vm,其文件系统中只有 arm 可执行文件。这有点矫枉过正,因为你可以只用 chroot 做同样的事情,而且由于 qemu 的介入,系统控制水平大致相同。

这个github link有一个食谱;但你可以通过搜索找到一堆。设置完成后,您可以根据需要轻松地将其包装在虚拟机中。