COSCUP 2020 just ended and I learned a lot in the two days. One of the many cool things is that I can actually run FreeBSD on my server! So be it inside a VM. Whatever, it is still very cool to have actual UNIX running on ARM. Friends in the FreeBSD community at COSCUP provided a ton of assistant. I’ll probably never figure out how to make FreeBSD boot in a ARM VM. A huge thank-you to everyone that helped.
Let’s clarify now. I mean we’ll be running FreeBSD for Aarch64 while using KVM. Running the AMD64 version using QEMU will be too easy. Yet even though FreeBSD officially supports Aarch64 on various hardware and QEMU. ARM being ARM, that (Linux) kernel configurations differ very much from vendor to vendor. It still took me a while to boot FreeBSD properly.
Even tho the document states there’s images for Aarch64. It is never linked to in FreeBSD’s official website. I had to navigate myself to download.freebsd.org and find the file. Then decompress it after downloading.
wget wget https://download.freebsd.org/ftp/releases/VM-IMAGES/12.1-RELEASE/aarch64/Latest/FreeBSD-12.1-RELEASE-arm64-aarch64.qcow2.xz unxz FreeBSD-12.1-RELEASE-arm64-aarch64.qcow2.xz
Now we need a UEFI image. (Or U-Boot, I didn’t bother with it) My installation of QEMU doesn’t come with one nor I can find one in my package manager. Some Googling turns up one.
Then expand the rootfs since the default size is only big enough to hold a minimal system. The system is configured to resize the rootfs when it sees disk space growth. I gave it an extra 80G.
qemu-img resize FreeBSD-12.1-RELEASE-arm64-aarch64.qcow2 +80G
Now we are ready to boot FreeBSD. The parameters I use are more or less the ones in FreeBS
Now we are ready to boot FreeBSD. The parameters I use are more or less the ones in FreeBSD’s documents. And modified a bit to make it work on my machine (ex:
virtio doesn’t work for unknown reasons).
qemu-system-aarch64 -m 4096M -cpu host,pmu=off -M virt,gic-version=3 --enable-kvm -smp 8 \ -bios edk2-aarch64-code.fd -serial telnet::4444,server -nographic \ -drive file=FreeBSD-12.1-RELEASE-arm64-aarch64.qcow2,id=hd0 \ -device e1000,netdev=net0 \ -netdev user,id=net0
QEMU is listening on
localhost:4444 for a telent connection. Run
telnet localhost 4444 to boot the system. And that’s it. FreeBSD is running in a VM on an ARM server!
Oh, remember to run
shutdown -p now to shutdown FreeBSD. Unlike Linux,
shutdown now doesn’t perfrorm a ACPI shutdown. It just drops you into single user mode. And BSD commands tends to stop parsing arguments after the first non-argument.
rm directory -r on Linux removes
directory recursively. But on BSD it will removes
-r non recursively.