[[!meta title="NetBSD/evbarm under QEMU"]] This page attempts to document running NetBSD/evbarm under the [QEMU](http://www.qemu.org/) open source processor emulator. This can be extremely useful for development and testing. # Requirements * qemu 4.1.0 or higher * disk image * [NetBSD 9.x armv7](https://nycdn.netbsd.org/pub/NetBSD-daily/netbsd-9/latest/evbarm-earmv7hf/binary/gzimg/armv7.img.gz) * [NetBSD 9.x arm64](https://nycdn.netbsd.org/pub/NetBSD-daily/netbsd-9/latest/evbarm-aarch64/binary/gzimg/arm64.img.gz) * Tianocore EDK2 firmware * [QEMU_EFI.fd for armv7](https://snapshots.linaro.org/components/kernel/leg-virt-tianocore-edk2-upstream/4480/QEMU-ARM/RELEASE_GCC5/QEMU_EFI.fd) * [QEMU_EFI.fd for arm64](https://snapshots.linaro.org/components/kernel/leg-virt-tianocore-edk2-upstream/4480/QEMU-AARCH64/RELEASE_GCC5/QEMU_EFI.fd) # Installing QEMU on NetBSD You can install latest qemu with the following commands. It is assumed that your pkgsrc tree is in /usr/pkgsrc directory. # cd /usr/pkgsrc/emulators/qemu # make install # Preparing the disk image The disk image (armv7.img.gz or arm64.img.gz) must first be uncompressed. The *qemu-img* tool can then resize the image to the desired size. On first boot, NetBSD will grow the root file-system to match the size of the disk. $ gunzip arm64.img.gz $ qemu-img resize arm64.img 20g # Booting the system (arm64) $ qemu-system-aarch64 -M virt -cpu cortex-a53 -smp 4 -m 4g \ -drive if=none,file=arm64.img,id=hd0 -device virtio-blk-device,drive=hd0 \ -netdev type=user,id=net0 -device virtio-net-device,netdev=net0,mac=00:11:22:33:44:55 \ -bios QEMU_EFI.fd -nographic # Booting the system (arm64) directly into the kernel with hardware accelerated virtualization on a Linux host $ qemu-system-aarch64 -M virt,accel=kvm -cpu host -m 256 \ -drive if=none,file=arm64.img,id=hd0 -device virtio-blk-device,drive=hd0 \ -device virtio-rng-pci -kernel netbsd-GENERIC64.img -append "root=NAME=netbsd-root" \ -netdev type=user,id=net0 -device virtio-net-device,netdev=net0,mac=00:11:22:33:44:55 \ -display none -serial stdio * As of today, a regular ELF kernel won't boot, use `netbsd-GENERIC64.img` (`.img` suffix) * `-device virtio-rng-pci` is needed for the boot not to hang on `Waiting for entropy...` # Booting the system (armv7) $ qemu-system-arm -M virt -cpu cortex-a15 -smp 4 -m 2g \ -drive if=none,file=armv7.img,id=hd0 -device virtio-blk-device,drive=hd0 \ -netdev type=user,id=net0 -device virtio-net-device,netdev=net0,mac=00:11:22:33:44:55 \ -bios QEMU_EFI.fd -nographic # Enabling graphics support To enable graphics support, remove the following command-line argument: -nographic and replace it with: -display sdl,gl=on -device ramfb -device usb-ehci,id=ehci \ -device usb-mouse,bus=ehci.0 -device usb-kbd,bus=ehci.0 # Bridged networking To bridge a QEMU guest to your network, you need to create a tap(4) interface for your VM, then connect it to a physical interface with a bridge(4) interface. The following example assumes NetBSD as a host OS, and a physical interface named *bge0*. [[!template id=filecontent name="/etc/ifconfig.bridge0" text=""" descr "LAN VM bridge" up !brconfig bridge0 add bge0 """]] [[!template id=filecontent name="/etc/ifconfig.tap0" text=""" link f2:0b:a4:d1:f2:69 descr "NetBSD Arm64 VM" up !brconfig bridge0 add tap0 """]] Then replace the *-netdev* part of the qemu command with: -net nic -net tap,ifname=tap0,script=no