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

Viewed 1169

Say I have a x86 machine. It's easy to create a x86 VM through Linux KVM API.

See: vm_init() in kvm-host:

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");

In this project, it's easy to create a x86 VM on a x86 machine.

My question is, however, what if i want that VM to be a ARM architecture?

I believe that is applicable because we have qemu-system-arm, and what I try to achieve is exactly what it does.

2 Answers

What you are asking for is not possible. KVM cannot run virtual machines for different architectures than the one the kernel was built for and runs on. If you want to run an ARM VM using KVM you will have to do that on an ARM processor. KVM merely takes advantage of the hardware capabilities of the underlying CPU for virtualization, which means that instructions are effectively ran by the host CPU, so you cannot run ARM code on an x86 machine.

What qemu-system-arm does on an x86 machine is emulate all the instructions in software and in userspace, without any help from the host kernel/CPU. You will be able to use KVM with qemu-system-arm only if you are on an ARM machine which supports KVM. For more info see KVM Processor Support.

You can build a vm with qemu-arm-system registered as the appropriate interpreter with only arm executable files inside its file system. It is kinda overkill, since you can do the same with just chroot, and owing to the interposition of qemu have about the same level of system control.

This github link has a recipe for it; but you can find a bunch by searching around. Once you set this up, you could readily wrap it inside a vm if you wished.

Related