There are times when you need to run a virtual machine — but you’re already ON a virtual machine. Fortunately, it’s possible, but you need to enable nested virtualization. For me, this comes up often when I’m running OpenStack or Kubernetes on a Google Compute Engine instance. To solve the problem, follow these steps:
- Install the latest version of the gcloud command-line tool.
- Create a new instance so you have a base disk to work with. Because you’ll eventually want to use the image in a zone that includes nested virtualization, create it in zone us-central1-b. You can do this from the UI, or using the command line. By default, the disk will have the same name as the instance:
gcloud compute instances create temp-image-base --image-family=projects/ubuntu-os-cloud/global/images/family/ubuntu-1604-lts --zone=us-central1-b
- Stop the instance:
gcloud compute instances stop temp-image-base --zone=us-central1-b
- Now create a new disk, based on that disk, with nested virtualization enabled:
gcloud compute images create nested-vm-image \ --source-disk=temp-image-base --source-disk-zone=us-central1-b \ --licenses="https://www.googleapis.com/compute/v1/projects/vm-options/global/licenses/enable-vmx"
- Next create the new instance using the new image:
gcloud compute instances create nested-vm --zone us-central1-b --image=nested-vm-image --machine-type=n1-standard-32 --boot-disk-size=250GB
- Connect to the instance:
gcloud compute ssh nested-vm --zone=us-central1-b
- Confirm that nested virtualization is enabled by looking for a non-zero response to:
> grep -cw vmx /proc/cpuinfo > 1
- Finally, install a hypervisor such as KVM:
sudo apt-get update && sudo apt-get install qemu-kvm -y
From there, you’re ready to run VMs on your VM.
While these instructions only apply to Google Compute Engine, you can easily run into the same issues on bare metal, or on cloud instances that come from other providers, such as Amazon Web Services. The solution depends on your environment. For example, if you’re trying to run nested virtualization on your desktop machine, it might be a matter of changing BIOS settings. For Hyper-V, you need to change settings on the VM itself (assuming that other requirements, such as an appropriate processor, are met).
For Amazon Web Services, in most cases, when you run an “instance” that is, itself, a virtual machine, so if you want to run Virtualbox or other virtualization solutions such as VMware or Hyper-V, you’re going to have a problem. Fortunately, many cloud service providers also include the ability to rent “bare metal” instances, which give you direct access to the hardware. From there, you will need to follow the same instructions as you would for local hardware.