QEMU is an an open source processor emulator (and virtualizer). This document descripes howto run the OpenWrt x86 port in QEMU.
It is mixed descriptions from windows and linux, so please read through all of it before starting.
Choosing different emulation settings can affect performance greatly.
Example: 30s iperf-s@openwrt(qemu running on host) to host
ne2k_pci:0.0-31.3 sec 14.6 MBytes 3.92 Mbits/sec pcnet: 0.0-30.0 sec 2.38 GBytes 682 Mbits/sec e1000: 0.0-30.0 sec 6.23 GBytes 1.79 Gbits/sec vmxnet3: 0.0-30.0 sec 8.67 GBytes 2.48 Gbits/sec virtio-net-pci: 0.0-30.0 sec 44.6 GBytes 12.8 Gbits/sec
Qemu runs on many different systems.
Many Linux Distributions like Debian, Ubuntu, Suse, Fedora provide a qemu package in their package repositories.
Example for Debian 7 (Wheezy):
sudo apt-get install qemu
Qemu is rapidly developing so features, syntax might change between versions.
The QEMU Wiki Links page provides you with several unoffical download links of Windows builds.
Command line to get it booting (without a storage device):
qemu-system-arm -M realview-eb-mpcore -kernel openwrt-realview-vmlinux-initramfs.elf -net nic -net user -nographic
Basically, use the generated initramfs image as the
This target does not support booting from hard disk (
-hda or other syntax); emulation of the PCI bus is missing (source). However, realview does support SD card image files (
-sd filename.img); see below.
(Note: The SD card image generation is in OpenWRT SVN r46924 on newer; it will be part of the Designated Driver release.)
Download a nightly kernel and SD-card image from https://downloads.openwrt.org/snapshots/trunk/realview/generic/ - download both
openwrt-realview-sdcard.img. Alternatively, you can build your own by choosing the
realview target in
make menuconfig and then start the build with
make world (look for the generated files under
Then start QEMU with the following command:
qemu-system-arm -M realview-pbx-a9 -m 1024M -nographic \ -kernel openwrt-realview-vmlinux.elf \ -sd openwrt-realview-sdcard.img \ -append "console=ttyAMA0 verbose debug root=/dev/mmcblk0p1"
-sd rootfs.ext4 \ -append "root=/dev/mmcblk0"
at least qemu 2.0 required
slightly modified from target/linx/arm64/README:
qemu-system-aarch64 -machine virt -cpu cortex-a57 -machine type=virt -nographic \ -smp 1 -m 2048 \ -kernel bin/arm64/openwrt-arm64-qemu-virt-initramfs.Image \ --append "console=ttyAMA0"
Use QEMU >= 2.2 (earlier versions can have bugs with MIPS16) ticket 16881 - Ubuntu 14.03.x LTS uses qemu 2.0 which is has this bug.
The "malta" platform is meant for use with QEMU for emulating a MIPS system.
malta target supports both big and little-endian variants, pick the matching files and qemu version (
qemu-system-mipsel -kernel openwrt-malta-le-vmlinux-initramfs.elf -nographic -m 256
In recent enough versions one can enable ext4 root filesystem image building, and since r46269 ( only in trunk, it's not part of the 15.05 CC release) it's possible to boot straight from that image (without an initramfs):
qemu-system-mipsel -M malta \ -hda openwrt-malta-le-root.ext4 \ -kernel openwrt-malta-le-vmlinux.elf \ -nographic -append "root=/dev/sda console=ttyS0"
The x86-64 target has support for ESXI images by default. Booting the VMDK / VDI images might not work with newer qemu versions.
IMG/VDI/VMDK with "-hda" switch do not work with qemu 2.x .
pc-q35-2.0 / q35 emulates a different machine. With new syntax (no -hda , -net) the IMG / VDI / VMDK works here.
Some emulated network cards might have performance issues.
qemu-system-x86_64 \ -enable-kvm \ -M pc-q35-2.0 \ -drive file=openwrt-x86_64-combined-ext4.vdi,id=d0,if=none \ -device ide-hd,drive=d0,bus=ide.0 \ -drive file=data.qcow2,id=d1,if=none \ -device ide-hd,drive=d1,bus=ide.1 \ -soundhw ac97 \ -netdev bridge,br=virbr0,id=hn0 \ -device e1000,netdev=hn0,id=nic1 \ -netdev user,id=hn1 \ -device e1000,netdev=hn1,id=nic2 qemu-system-x86_64 -M q35 -drive file=openwrt-x86_64-combined-ext4.img,id=d0,if=none,bus=0,unit=0 -device ide-hd,drive=d0,bus=ide.0
Normally openwrt works on most of the hardware mentioned in the table of hardware
(search in this wiki), and also on most o0f the hardware that support intel x86 ISA or
gog.is/site:wiki.openwrt.org x86 in the address bar.
Anyway some embedded x86 board have particular hardware that is not always well supported
by the openwrt platform, even if all the
kmod packages are included in the basic image.
One of this x86 compatible hardware family are systems based on intel atom and chipset
ich8m (maybe also others), like the Lex twitter system 3I525U.
On that system openwrt is able to run but, for example, is not able to
manage really well the possibility of having two wan connections with
different metric. The request will be always routed to the interface with
higher metric also using
ping -I <wan2_interface> 184.108.40.206. Moreover software
Nmap will fail to be bind to certain interfaces.
Someone with more knowledge could explain why this happens but as workaround
one can use a more complete linux system (for example debian) as base and then virtualize
gog.is/site:wiki.openwrt.org virtualization OR qemu OR kvm OR hypervisor in the address bar)
openwrt, that in the end requires really a little resources most of the time,
or one can assign plenty of resources because at the end the base system is quite powerful.
Debian was installed on a 2Gb cf card through a usb stick and netinstaller, having only the basic system utilities and ssh utilities. 1.1Gb of space were used, 600mb free and the rest swap.
Install the following packages:
apt-get install qemu-kvm bridge-utils libvirt-bin virtinst
Then, if you don't want to use any user but just work with root (the objective is: let run openwrt on the twitter system, not having a well setup debian system):
Then we have to prepare the network. Modify
/etc/network/interfaces a follows (adapt according to your needs)
auto br0 br1 br2 br3 iface br0 inet dhcp bridge_ports eth0 iface br1 inet dhcp bridge_ports eth1 iface br2 inet dhcp bridge_ports eth2 iface br3 inet dhcp bridge_ports eth3
The bridges ( https://wiki.debian.org/BridgeNetworkConnections ) are helpful because they allows different network adapters, real or virtual ( network.interfaces to exchange data (as the word 'bridge' suggests) and not only, because the bridge will have a certain mac address but also the virtual interfaces attached to it can have different mac addresses. Here the marvels of the linux networking system have to be explained by someone with more knowledge.
Then we need to create our virtual machine. The additional packages, apart from
qemu, will help here. We can issue the following command, using the x86 generic image
placed in the folder
virt-install --name=openwrt --ram=256 --vcpus=1 --os-type=linux --disk path=/root/openwrt_kvm/openwrt-x86-generic-combined-ext4.img,bus=ide --network bridge=br0,model=e1000 --import # be careful to the model, e1000 let's openwrt recognize the interface. # http://manpages.ubuntu.com/manpages/lucid/man1/virt-install.1.html
If you want to interact with the system from command line, use
For example to force the shutdown of a virtual machine
virsh destroy openwrt
or to delete the virtual machine (but not the disk file)
virsh undefine openwrt.
For having multiple interfaces
virt-install --name=openwrt --ram=256 --vcpus=1 --os-type=linux --disk path=/root/openwrt_kvm/openwrt-x86-generic-combined-ext4.img,bus=ide \ --network bridge=br0,model=e1000 --network bridge=br3,model=e1000 --importRemember that the console requires
ctrl+5to exit (german keyboard).
To mark a virtual machine for the autostart, type:
virsh autostart openwrt.