The Quick Guide to QEMU Setup

17
74383
Let's set up QEMU first!

Let's set up QEMU first!

In this series of articles, we will explore the basics of QEMU, OS installation, QEMU networking and embedded system development for the ARM architecture. In this first part, let’s begin with the basics.

When I first began using computers, I was amazed. It required just a mouse-click to play songs, movies or games to entertain every age. It was like magic to me! Over time, I learnt about compiled programs, and source code. My curiosity very soon made source code my passion. Even though compiled software packages are easily available, I love compiling from source. And that is just what I do for QEMU.

QEMU is one of the best emulators out there. Still, very few people use its full capabilities. Though we deal with the basics in this article, look forward to some interesting stuff later in the series!

Building QEMU from source

The first thing is to download the QEMU source code; the current version as of this writing is 0.14 and you’ll find it here. Extract the tar ball and go to the extracted directory:

$ tar -zxvf qemu-0.14.0.tar.gz
$ cd qemu-0.14.0

Run the configuration script. We will build QEMU for i386. (It can be built for other architectures too, like ARM, PPC, SPARC, etc.) Let’s install the Ubuntu distro in the virtual machine — that’s the reason we’ve chosen to build QEMU for the i386 architecture:

$ ./configure –target-list=i386-softmmu

Hopefully, you will not run into any trouble during the configure script run. If there’s any issue, it will probably be some missing library or header files, which you can look for, and install.

Once you are done with the configure script, compile the source code with the make command. After compilation, QEMU binaries should be installed in their proper locations. On my Fedora system, I used the su command to get the necessary root privileges and install the binaries using make install.

To confirm that QEMU has been successfully installed, run qemu, and a pop-up window like what appears in Figure 1 will confirm the successful installation of QEMU.

Testing QEMU after installation
Figure 1: Testing QEMU after installation

Creating a new virtual machine

If you are familiar with other virtualisation software, you might wonder how to go about creating a new VM. The first step is to create the hard disk image for the VM. So let’s install the Ubuntu 9.10 OS in the VM; a disk image of 10 GB is sufficient for this purpose. To create it, run the following commands:

$ qemu-img create ubuntu.img 10G
$ ls -lh ubuntu.img
-rw-r--r--. 1 root root 10G Mar 11 11:54 ubuntu.img

The next step is to install Ubuntu (I already have a downloaded Ubuntu 9.10 (Karmic) ISO image in my current working directory):

$ qemu -hda ubuntu.img -boot d -cdrom ./ubuntu-9.10-desktop-i386.iso -m 512

In the above command, the -hda option specifies the disk image file; and -cdrom is the CD-ROM or ISO image to use as the “optical drive” for the VM. The -m option specifies how much RAM this virtual machine will be given to use (in this case, I have allocated 512 MB of RAM; your choice should be based on your needs and hardware). Finally, we instruct QEMU to boot the VM from the ISO image by using the -boot d option. Once you run the above command, the VM will boot up and present the Ubuntu boot menu (see Figure 2).

Installing Ubuntu in QEMU
Figure 2: Installing Ubuntu in QEMU

Follow the same installation steps you would use on a real machine. Once installed, you can boot the VM from the disk image with the following commands:

$ qemu -m 512 -hda ubuntu.img

Figure 3 shows the VM running after booting from the virtual hard disk.

Booting the installed operating system
Figure 3: Booting the installed operating system

The next thing we need to do is set up networking.

QEMU networking

Setting up networking on QEMU is tricky work. Let’s make use of the virtual network kernel devices TAP and TUN, which are different from hardware Ethernet devices; TAP and TUN are supported only in the kernel (i.e., only in software). TAP operates at the data-link layer, and TUN at the network layer.

QEMU can use the TAP interface to provide full networking support to the guest operating system. Before this, we need to install the VPN (Virtual Private Network) package on the host machine, and set up a bridge between the host and guest OS. Install the openvpn and bridge-utils packages:

# yum install openvpn
# yum install bridge-utils

Now, we will create two scripts for qemu—qemu-ifup and qemu-ifdown, as given below:

#qemu-ifup
/sbin/ifconfig eth1 down
/sbin/ifconfig eth1 0.0.0.0 promisc up
openvpn --mktun --dev tap0
ifconfig tap 0 0.0.0.0 up
brctl addbr br0
brctl addif br0 eth1
brctl addif br0 tap0
brctl stp br0 off
ifconfig br0 10.10.10.2 netmask
255.255.255.0

This script will be used to start QEMU networking. In the first line, the Ethernet device is disabled. For the interface to be a part of a network bridge, it must have an IP address of 0.0.0.0, which is what we have done in the second line. In lines 3 and 4, we create and bring up the TAP device/interface tap0. In the next few steps, a bridge is created with eth1 and tap0 as parts of this bridge. Finally, we assign an IP address to this bridge.

Following is what the qemu-ifdown script looks like:

#qemu-ifdown
ifconfig eth1 down
ifconfig eth1 -promisc
ifup eth1
ifconfig br0 down
brctl delbr br0
openvpn --rmtun --dev tap0

This script will be used to shutdown QEMU networking; it is almost self-explanatory, shutting down both the interfaces, deleting the bridge, and the tap0 device.

Copy these two files to your /etc directory, and test them:

# /etc/qemu-ifup
Wed Apr 6 15:53:50 2011 TUN/TAP device tap0 opened
Wed Apr 6 15:53:50 2011 Persist state set to: ON

# ifconfig br0
br0       Link encap:Ethernet HWaddr 00:25:11:74:5B:0C
          inet addr:10.10.10.2 Bcast:10.10.10.255 Mask:255.255.255.0
          inet6 addr: fe80::225:11ff:fe74:5b0c/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:29 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 b)  TX bytes:7539 (7.3 KiB)

#ifconfig tap0
tap0      Link encap:Ethernet HWaddr C2:10:27:8C:B8:35
          UP BROADCAST MULTICAST MTU:1500 Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

The virtual device tap0 and bridge br0 are up, so our script is working fine. Now bring it down, using the qemu-ifdown script:

# /etc/qemu-ifdown
Error: Connection activation failed: Device not managed by NetworkManager
Wed Apr 6 15:56:44 2011 TUN/TAP device tap0 opened
Wed Apr 6 15:56:44 2011 Persist state set to: OFF

Everything is set up correctly; now it’s time to boot the Ubuntu VM with full networking support. Start the networking (as root), and boot the VM (as an ordinary user):

# /etc/qemu-ifup
$ qemu -m 512 -hda ubuntu.img -net nic -net tap,ifname=tap0,script=no

When the machine boots up, assign an IP address to the eth0 interface inside the VM:

$ sudo ifconfig eth0 10.10.10.100 netmask 255.255.255.0

Now try to ping the bridge IP (results are shown in Figure 4):

$ ping 10.10.10.2

QEMU networking using kernel virtual device
Figure 4: QEMU networking using kernel virtual device

The network is working fine in the VM, now experiment with it. Try setting up a proxy server on the host OS, and connect to the Internet from the guest OS.

This was just an introduction to QEMU. You can look forward to a lot more in subsequent articles on how to use QEMU for embedded systems development.

17 COMMENTS

  1. Great article,
    Gets everyone who’d like to use qemu started up.
    You could also tell us if it is better than virtual box and (or) vmware player for virtualization.
    Keep up the great work.
    Eagerly looking for your next article.

  2. hi
    im a newbie to qemu, when i executed the second step ie “qemu -hda ubuntu.img -boot d -cdrom ./ubuntu-9.10-desktop-i386.iso -m 512” it displays VNC server running on `127.0.0.1:5900 and the terminal got hanged … i dnt know what is the problem… please help me out .

  3. ^ anand

    you need a vnc client to see qemu’s output….

    install vncviewer & try the following command

    vncviewer 127.0.0.1:5900

  4. Hi Anil,

    When i executed the second step ie “qemu -hda ubuntu.img -boot d -cdrom ./ubuntu-9.10-desktop-i386.iso -m 512” it displays VNC server running on `127.0.0.1:5900 and the terminal got hanged … i dnt know what is the problem… please help me out .

    Thanks
    Suresh

  5. Hi I followed the steps but on bootup of qemu it hangs at “Stopping configure virtual network devices, waiting for network configuration” and when it times up, it enters bootup and I do not have eth0. I am wondering what could possibly cause this?

  6. when trying to install ubuntu on the image, it tells me that the command qemu was not found, despite having installed qemu

  7. May I request the author provide some clarification on one little point for future use.
    The scripts for qemu-if{up|down} “assume” a device of eth1 without an explaination of what eth1 is and if there actually is one or should have another name. (i.e. use “myInterface=eth1” with a reason why it might be different.

  8. ” For the interface to be a part of a network bridge, it must have an IP address of 0.0.0.0, which is what we have done in the second line.”
    can you elaverate that? does “0.0.0.0” refer to all sources of interfaces of the hosts? I thought my host interfaces must have a static ip to communicate to a local network, meaning this how I have the access to the internet. If you assign 0.0.0.0, I should not able to connect to the internet.

LEAVE A REPLY

Please enter your comment!
Please enter your name here