Notes on running QEMU on Debian Etch

Kragen Javier Sitaker, 2007 to 2009 (3 minutes)

I'm running QEMU with kqemu on my old 700MHz laptop.

User-mode stuff is slowed down only slightly. This command line:

time for x in $(seq 10000); do :; :; :; :; done

takes 1.17 1.19 1.20 1.22 user seconds in emulation and 1.13 1.13 1.14 1.14 user seconds outside QEMU.

However, it takes about 100ms of system time in place of about 10ms. (The -kernel-kqemu flag may solve this; haven't measured.)

I had some kind of keyboard problem when I ran QEMU 0.8.2-4etch1 with -snapshot. Like, the keyboard just didn't work. That problem went away when I built QEMU 0.9.1 from source and started using that, but I still can't use -snapshot and -loadvm together.

Networking: tap

This was a bad idea (for me).

By default, QEMU uses user networking, which proxies network connections through normal sockets, like slipknot or slirp or term. (In fact, it uses slirp.) I thought this didn't give me a way to talk to it over the network (for example, if I'm running a web server on it).

So I thought -net tap could help with this, but it has some drawbacks. It requires running QEMU as root, and then the network interface on the emulated machine needs to be configured statically, e.g. in /etc/network/interfaces, since -net tap doesn't provide DHCP by default. And then you have to set up IP masquerading, more or less as follows:

qemu -net nic -net tap,script=ifup "$image"

In file ifup:

set -e
/sbin/ifconfig "$1" 172.20.0.1
echo 1 > /proc/sys/net/ipv4/ip_forward
/sbin/iptables -t nat -A POSTROUTING --source 172.20.0.0/24 -j MASQUERADE

This does actually work, but you have to configure the network stuff inside of QEMU: IP address, netmask, default gateway, and worst of all, DNS server. And I think it might allow other people on your LAN to masquerade through you.

What would be ideal would be bridging the virtual interface to my real Ethernet interface, but I never got around to doing this.

Networking: -redir

It turns out there's an easier way. I can use the default user networking, and if I have a web server on the emulated host on port 8080, I can say

qemu -redir tcp:8000::8080 "$image"

and connect my web browser to http://localhost:8000/.

This works beautifully. The one downside I've found is that if you're using qemu -loadvm, the inner virtual machine has to re-request DHCP before the redirection works.

Startup: -loadvm

Bootup takes an annoyingly long time. But, if you don't regularly have any permanent changes you want to save, you can use the savevm command to save an image of the virtual machine state after a boot, and then use qemu -loadvm to start QEMU in the already-booted state.

Topics