This blog post serves as a basic guide on how to run a FreeBSD 14 virtual machine in QEMU using a headless Ubuntu 22.04 linux host. The assumption here is both the host and guest operating systems are amd64 (a.k.a. x86_64).
Install QEMU packages
qemu-system-x86 package. Do not install recommended packages as
those will include a huge number of graphics packages we are not interested in
for a headless server.
sudo apt-get install -y --no-install-recommends qemu-system-x86
Also install the
qemu-utils package. This package provides the
which will be necessary for resizing the FreeBSD image.
sudo apt-get install -y qemu-utils
Lastly install the
ovmf package. This package provides a UEFI bios capable of
booting modern operating systems like the FreeBSD VM images.
sudo apt-get install -y ovmf
Download FreeBSD VM image
FreeBSD offers pre-made images specifically for use in VMs. These images do not
need to be installed like a typical
.iso image made for booting from CD-ROM
or USB stick. The FreeBSD download page can be found here.
Look under the VM column for VM images.
The image we want for QEMU is the
.qcow2 format image for the amd64 architecture,
without the ZFS overlay. For this guide we’ll download FreeBSD-14.0-RELEASE-amd64.qcow2.xz
Now extract the image.
Resize the image
Next, resize the image. By default you get just enough disk space for a minimal bootable OS. Once you install a few packages there will be insufficient disk space. The ideal size of the disk depends on your use case. In this example we expand the disk by 16 gigabytes.
qemu-img resize FreeBSD-14.0-RELEASE-amd64.qcow2 +16G
Boot the FreeBSD VM
We can finally boot the VM! QEMU needs a number of non-default options for booting a headless FreeBSD VM.
note: you must still resize the partition inside the VM after this step.
sudo qemu-system-x86_64 -m 4096 -smp 4 -bios /usr/share/ovmf/OVMF.fd -serial mon:stdio -nographic -drive file=FreeBSD-14.0-RELEASE-amd64.qcow2 -enable-kvm
-m 4096 option indicates the VM should have 4 gigabytes of system memory.
-smp 4 option indicates the VM should have 4 CPU cores.
-bios /usr/share/ovmf/OVMF.fd option indicates the VM should boot with UEFI.
-serial mon:stdio option indicates the VM should use your pseudo terminal as the serial terminal.
-nographic option indicates the VM should not have a display.
-drive <image> option indicates our VM image to boot.
-enable-kvm option indicates the VM should use Linux’s hardware acceleration.
Resize the OS partition
Once FreeBSD is booted, you can login with username
root (there is no password).
Then we must run the
growfs command inside the VM to resize the OS partition
scheme to fill the expanded image we created.
And that’s it! It’s probably a good idea to set a password on root, create service users, etc. The packer tool from HashiCorp can help automate such steps but that’s a blog post for another day.