Difference between revisions of "QEMU"

From ArchWiki
Jump to: navigation, search
m (Installing QEMU: replaced <pre> with spaces)
Line 1: Line 1:
 
[[Category:Emulators (English)]]
 
[[Category:Emulators (English)]]
 +
[[Category:Virtualization]]
 
[[fr:Qemu]]
 
[[fr:Qemu]]
 
{{i18n|QEMU}}
 
{{i18n|QEMU}}

Revision as of 13:57, 20 September 2011

This template has only maintenance purposes. For linking to local translations please use interlanguage links, see Help:i18n#Interlanguage links.


Local languages: Català – Dansk – English – Español – Esperanto – Hrvatski – Indonesia – Italiano – Lietuviškai – Magyar – Nederlands – Norsk Bokmål – Polski – Português – Slovenský – Česky – Ελληνικά – Български – Русский – Српски – Українська – עברית – العربية – ไทย – 日本語 – 正體中文 – 简体中文 – 한국어


External languages (all articles in these languages should be moved to the external wiki): Deutsch – Français – Română – Suomi – Svenska – Tiếng Việt – Türkçe – فارسی

From the QEMU about page,

QEMU is a generic and open source machine emulator and virtualizer.

When used as a machine emulator, QEMU can run OSes and programs made for one machine (e.g. an ARM board) on a different machine (e.g. your own PC). By using dynamic translation, it achieves very good performance.

When used as a virtualizer, QEMU achieves near native performances by executing the guest code directly on the host CPU. QEMU supports virtualization when executing under the Xen hypervisor or using the KVM kernel module in Linux. When using KVM, QEMU can virtualize x86, server and embedded PowerPC, and S390 guests.

Difference between qemu and qemu-kvm

Depending on your needs, you can choose either to install upstream Template:Package Official or Template:Package Official from the [extra] repository. Upstream qemu is a pure emulator, with no hardware acceleration (actually, it does have initial KVM support when qemu is started with -enable-kvm parameter, but this implementation is still buggy and nowhere as complete as in qemu-kvm, many functions still do not work). Upstream qemu is capable of emulating many different platforms (arm, i386, m68k, mips, ppc, sparc, x86_64, etc). On the other hand you have qemu-kvm, which is qemu (i386 and x86_64 architecture support only) with KVM (kernel virtual machine) additions, allowing you to run virtual machines at close to native speed. qemu-kvm is the version you want if you have a capable CPU and only need to run virtual machines for the i386 and x86_64 architecture (Linux, Windows, BSD, etc).

Not all processors support KVM. You will need an x86 machine running a recent Linux kernel on an Intel processor with VT (virtualization technology) extensions, or an AMD processor with SVM extensions (also called AMD-V). Xen has a complete list of compatible processors. For Intel processors, see also the Intel® Virtualization Technology List.

Installing QEMU

To install the machine emulator version:

# pacman -S qemu

To install the KVM version (please see the page on KVM for more details):

# pacman -S qemu-kvm

Choosing Windows version

QEMU can run any version of Windows. However, 98, Me and XP will run at quite a low speed. You should choose either Windows 95 or Windows 2000. Surprisingly, 2000 seems to run faster than 98. The fastest one is 95, which can from time to time make you forget that you are running an emulator :)

If you own both Win95 and Win98/WinME, then 98lite (from http://www.litepc.com) might be worth trying. It decouples Internet Explorer from operating system and replaces it with original Windows 95 Explorer. It also enables you to do a minimal Windows installation, without all the bloat you normally cannot disable. This might be the best option, because you get the smallest, fastest and most stable Windows this way.

Creating the hard disk image

To run QEMU you will probably need a hard disk image. This is a file which stores the contents of the emulated hard disk.

Use the command:

qemu-img create -f qcow2 win.qcow 4G

to create the image file named "win.qcow". The "4G" parameter specifies the size of the disk - in this case 4 GB. You can use suffix M for megabytes (for example "256M"). You should not worry too much about the size of the disk - the qcow2 format compresses the image so that the empty space does not add up to the size of the file.

Preparing the installation media

The installation CD-ROM/floppy should not be mounted, because QEMU accesses the media directly. It is a good idea to dump CD-ROM and/or floppy to a file, because it both improves performance and does not require you to have direct access to the devices (that is, you can run QEMU as a regular user). For example, if the CD-ROM device node is named Template:Filename, you can dump it to a file with the command:

dd if=/dev/cdrom of=win98icd.iso

Do the same for floppies:

dd if=/dev/fd of=win95d1.img

When you need to replace floppies within QEMU, just copy the contents of one floppy over another. For this reason, it is useful to create a special file that will hold the current floppy:

touch floppy.img

Installing the operating system

This is the first time you will need to start the emulator. One thing to keep in mind: when you click inside the QEMU window, the mouse pointer is grabbed. To release it press Template:Keypress + Template:Keypress.

If you need to use a bootable floppy, run QEMU with:

qemu -cdrom [[cdrom''image]] -fda [[floppy''image]] -boot a [[hd_image]]

or if you are on a x86_64 system (will avoid many problems afterwards):

qemu-system-x86_64 -cdrom [[cdrom''image]] -fda [[floppy''image]] -boot a [[hd_image]]

If your CD-ROM is bootable or you are using ISO files, run QEMU with:

qemu -cdrom [[cdrom''image]] -boot d [[hd''image]]

or if you are on a x86_64 system (will avoid many problems afterwards):

qemu-system-x86_64 -cdrom [[cdrom''image]] -boot d [[hd''image]]

Now partition the virtual hard disk, format the partitions and install the OS.

A few hints:

  1. If you are using Windows 95 boot floppy, then choosing SAMSUNG as the type of CD-ROM seems to work
  2. There are problems when installing Windows 2000. Windows setup will generate a lot of edb*.log files, one after the other containing nothing but blank spaces in Template:Filename which quickly fill the virtual hard disk. A workaround is to open a Windows command prompt as early as possible during setup (by pressing Template:Keypress + Template:Keypress) which will allow you to remove these log files as they appear by typing:
del %windir%\security\*.log
Note: According to the official QEMU website, "Windows 2000 has a bug which gives a disk full problem during its installation. When installing it, use the Template:Codeline QEMU option to enable a specific workaround. After Windows 2000 is installed, you no longer need this option (this option slows down the IDE transfers)."

Running the system

To run the system simply type:

qemu [hd_image]

A good idea is to use overlay images. This way you can create hard disk image once and tell QEMU to store changes in external file. You get rid of all the instability, because it is so easy to revert to previous system state :)

To create an overlay image, type:

qemu-img create -b [[base''image]] -f qcow2 [[overlay''image]]

Substitute the hard disk image for base_image (in our case win.qcow). After that you can run qemu with:

qemu [overlay_image]

or if you are on a x86_64 system:

qemu-system-x86_64 [overlay_image]

and the original image will be left untouched. One hitch, the base image cannot be renamed or moved, the overlay remembers the base's full path.

Moving data between host and guest OS

If you have servers on your host OS they will be accessible with the ip-address 10.0.2.2 without any further configuration. So you could just FTP or SSH, etc to 10.0.2.2 from windows to share data, or if you would like to use Samba.

Samba

QEMU supports Samba which allows you to mount host directories during the emulation. It seems that there is an incompatibility with Samba 3.x. and some versions of QEMU. But at least with a current snapshot of QEMU it should be working.

First, you need to have a working Samba installation. Then add the following section to your Template:Filename:

[qemu]
   comment = Temporary file space
   path = /tmp
   read only = no
   public = yes

Now start qemu with:

qemu [hd_image] -smb qemu

Then you should be able to access your host's smb-server with the ip-address 10.0.2.2. If you are running Win9x as guest OS, you may need to add

10.0.2.2 smbserver

to Template:Filename (Win9x has Lmhosts.sam as a SAMple, rename it!).

Mounting the hard disk image - raw image

Fortunately there is a way to mount the hard disk image with a loopback device. Login as root, make a temporary directory and mount the image with the command:

mount -o loop,offset=32256 [[hd''image]] [[tmp''dir]]

Now you can copy data in both directions. When you are done, umount with:

umount [hd_image]

The drawback of this solution is that you cannot use it with qcow images (including overlay images). So you need to create you images without \"-f qcow\" option.

Tip: create a second, raw harddrive image. This way you will be able to transfer data easily and use qcow overlay images for the primary drive.

REMEMBER: never run QEMU while the image is mounted!

Mounting qcow2 image

You may mount a qcow2 image using qemu-nbd. See Wikipedia:Qcow#Mounting_qcow2_images.

Using any real partition as the single primary partition of a hard disk image

Sometimes, you may wish to use one of your system partition from within QEMU (for instance, if you wish booting both your real machine or QEMU using a given partition as root). You can do this using software RAID in linear mode (you need the linear.ko kernel driver) and a loopback device: the trick is to dynamically prepend a master boot record (MBR) to the real partition you wish to embed in a QEMU raw disk image.

Suppose you have a plain, unmounted Template:Filename partition with some filesystem on it you wish to make part of a QEMU disk image. First, you create some small file to hold the MBR:

dd if=/dev/zero of=/path/to/mbr count=32

Here, a 16 KB (32 * 512 bytes) file is created. It is important not to make it too small (even if the MBR only needs a single 512 bytes block), since the smaller it will be, the smaller the chunk size of the software RAID device will have to be, which could have an impact on performance. Then, you setup a loopback device to the MBR file:

losetup -f /path/to/mbr

Let's assume the resulting device is Template:Filename, because we would not already have been using other loopbacks. Next step is to create the "merged" MBR + /dev/hdaN disk image using software RAID:

 modprobe linear
 mdadm --build --verbose /dev/md0 --chunk=16 --level=linear --raid-devices=2 /dev/loop0 /dev/hdaN

The resulting Template:Filename is what you will use as a QEMU raw disk image (do not forget to set the permissions so that the emulator can access it). The last (and somewhat tricky) step is to set the disk configuration (disk geometry and partitions table) so that the primary partition start point in the MBR matches the one of Template:Filename inside Template:Filename (an offset of exactly 16 * 512 = 16384 bytes in this example). Do this using fdisk on the host machine, not in the emulator: the default raw disc detection routine from QEMU often results in non kilobyte-roundable offsets (such as 31.5 KB, as in the previous section) that cannot be managed by the software RAID code. Hence, from the the host:

 fdisk /dev/md0

Press 'x' to enter the expert menu. Set number of 's'ectors per track so that the size of one cylinder matches the size of your mbr file. For two heads and a sector size of 512, the number of sectors per track should be 16, so we get cylinders of size 2x16x512=16k.

Now, press 'r' to return to the main menu.

Press 'p' and check that now the cylinder size is 16k.

Now, create a single primary partition corresponding to Template:Filename. It should start at cylinder 2 and end at the end of the disk (note that the number of cylinders now differs from what it was when you entered fdisk.

Finally, 'w'rite the result to the file: you are done. You know have a partition you can mount directly from your host, as well as part of a QEMU disk image:

 qemu -hdc /dev/md0 [...]

You can of course safely set any bootloader on this disk image using QEMU, provided the original Template:Filename partition contains the necessary tools.

Optimizing Windows 9x CPU usage

Windows 9x does not use hlt instruction, so the emulator always eats up 100% CPU even if no computation is being done. Grab the file http://www.user.cityline.ru/~maxamn/amnhltm.zipTemplate:Linkrot, unpack it, copy it to the image and run the .bat file. Since the link is down: http://forums.virtualbox.org/viewtopic.php?f=2&t=9918&start=0 which leads you to http://estu.nit.ac.jp/~e982457/other/cpuidle/idle.htm but you really want http://www.benchtest.com/rain.html kk?

Using the Kernel-based Virtual Machine

KVM is a full virtualization solution for Linux on x86 hardware containing virtualization extensions (Intel VT or AMD-V). It consists of a loadable kernel module, kvm.ko, that provides the core virtualization infrastructure and a processor specific module, kvm-intel.ko or kvm-amd.ko. Using KVM, one can run multiple virtual machines running unmodified Linux or Windows images. Each virtual machine has private virtualized hardware: a network card, disk, graphics adapter, etc.

This technology requires an x86 machine running a recent Linux kernel on an Intel processor with VT (virtualization technology) extensions, or an AMD processor with SVM extensions. It is included in the mainline Linux kernel since 2.6.20 and is enabled by default in the Arch Linux kernel.

Even though QEMU in recent versions do have initial KVM support (Template:Codeline), it is not recommended to use this, as many KVM-related functions still have not been implemented in upstream QEMU. Instead, you should go for the qemu-kvm package in [extra], which is released by the KVM development team and contain all of the latest features (and bugfixes) of KVM userspace. Please refer to the KVM page itself, for more information on using QEMU with KVM on Arch Linux.

To take advantage of KVM, you simply need a compatible processor (the following command must return something on screen)

egrep '^flags.*(vmx|svm)' /proc/cpuinfo

And load the appropriate module from your rc.conf

Also, you will need to add yourself to the group 'kvm'.

Networking

Basic Networking

To add basic networking to your virtual machine, you may have to simply load QEMU with these options: Template:Codeline. For example, to load a cdrom, you could use:

 qemu -kernel-kqemu  -no-acpi -net nic,vlan=1 -net user,vlan=1 -cdrom dsl-4.3rc1.iso

Note that this only supports the TCP and UDP protocols. In particular ICMP and thus ping will not work.

Tap Networking with QEMU

Basic Idea

Tap networking in QEMU lets virtual machines register themselves as though with separate Ethernet adapters and have their traffic bridged directly onto your local area network. This is sometimes very desirable, if you want your virtual machines to be able to talk to each other, or for other machines on your LAN to talk to virtual machines.

Security Warning

You probably should not use this networking method if your host Arch machine is directly on the Internet. It can expose your virtual machines directly to attack!

In general, Arch disclaims any responsibility for security implications (or implications of any kind, really) from following these instructions.

Nitty Gritty

To set all this up, you will need to install the following packages:

  • bridge-utils (for brctl, to manipulate bridges)
  • uml_utilities (for tunctl, to manipulate taps)
  • sudo (for manipulating bridges and tunnels as root)
# pacman -S bridge-utils uml_utilities sudo

We will replace the normal Ethernet adapter with a bridge adapter and bind the normal Ethernet adapter to it. See http://en.gentoo-wiki.com/wiki/KVM#Networking_2 .

Make sure IPv4 forwarding is set. You should have the line Template:Codeline in your Template:Filename.

Take the following steps:

1. Add bridge and tun to your MODULES line in Template:Filename:

MODULES=( ... bridge tun)

2. Configure your bridge br0 to have your real ethernet adapter (herein assumed eth0) in it, in Template:Filename:

 bridge_br0="eth0"
 control_br0="setfd br0 0"
 BRIDGE_INTERFACES=(br0)
Note: This is not described anywhere, but adding the control_br0 line is vital for the bridge to work! For more details look here: https://bugs.archlinux.org/task/16625

3. Change your networking configuration so that you just bring up your real ethernet adapter without configuring it, allowing real configuration to happen on the bridge interface. In Template:Filename:

 eth0="eth0 up"
 br0="dhcp"
 INTERFACES=(eth0 br0)

Remember, especially if you are doing DHCP, it is essential that the bridge comes up AFTER the real adapter, otherwise the bridge will not be able to talk to anything to get a DHCP address!

If DHCP does not work, try with a static IP address in Template:Filename:

eth0="eth0 0.0.0.0"
br0="br0 192.168.0.3 netmask 255.255.255.0 broadcast 192.168.0.255"
INTERFACES=(eth0 br0)
gateway="default gw 192.168.0.1"
ROUTES=(gateway)

and then in Template:Filename:

domain lan
nameserver 192.168.0.1

4. Install the script that QEMU uses to bring up the tap adapter in Template:Filename with root:kvm 750 permissions:

 #!/bin/sh
 
 echo "Executing /etc/qemu-ifup"
 echo "Bringing up $1 for bridged mode..."
 sudo /sbin/ifconfig $1 0.0.0.0 promisc up
 echo "Adding $1 to br0..."
 sudo /usr/sbin/brctl addif br0 $1
 sleep 2

5. Use visudo to add the following to your sudoers file:

 Cmnd_Alias      QEMU=/sbin/ifconfig,/sbin/modprobe,/usr/sbin/brctl,/usr/bin/tunctl
 %kvm     ALL=NOPASSWD: QEMU

6. Make sure the user(s) wishing to use this new functionality are in the kvm group. Exit and log in again if necessary.

7. You launch qemu using the following run-qemu script:

 #!/bin/bash
 USERID=`whoami`
 IFACE=$(sudo tunctl -b -u $USERID)
 
 qemu-kvm -net nic -net tap,ifname="$IFACE" $*
 
 sudo tunctl -d $IFACE &> /dev/null

Then to launch a VM, do something like this

$ run-qemu -hda myvm.img -m 512 -vga std

8. If you cannot get a DHCP address in the host, it might be because the iptables are up by default in the bridge. In that case (from http://www.linux-kvm.org/page/Networking ):

 # cd /proc/sys/net/bridge
 # ls
 bridge-nf-call-arptables  bridge-nf-call-iptables
 bridge-nf-call-ip6tables  bridge-nf-filter-vlan-tagged
 # for f in bridge-nf-*; do echo 0 > $f; done

And when you still cannot get networking to work, see: Linux_Containers#Bridge_device_setup

Networking with VDE2

What is VDE?

VDE stands for Virtual Distributed Ethernet. It started as an enhancement of uml_switch. It is a toolbox to manage virtual networks.

The idea is to create virtual switches, which are basically sockets, and to "plug" both physical and virtual machines in them. The configuration I show here is quite simple; However, VDE is much more powerfull than this, it can plug virtual switches together, run them on different hosts and monitor the traffic in the switches. Your are invited to read the documentation of the project.

The advantage of this method is you do not have to add sudo privileges to your users. Regular users should not be allowed to run modprobe.

Basics

VDE is in extra, so...

# pacman -S vde2

In my config, I use tun/tap to create a virtual interface on my host. Load the Template:Codeline module (or add it to your Template:Codeline array in Template:Filename):

# modprobe tun

Now create the virtual switch:

# vde_switch -tap tap0 -daemon -mod 660 -group kvm

This line creates the switch, creates tap0, "plugs" it, and allows the users of the group Template:Codeline to use it.

The interface is plugged in but not configured yet. Just do it:

# ifconfig tap0 192.168.100.254 netmask 255.255.255.0

That is all! Now, you just have to run KVM with these Template:Codeline options as a normal user:

$ qemu-kvm -net nic -net vde -hda ...

Configure your guest as you would do in a physical network. I gave them static addresses and let them access the WAN using IP forwarding and masquerading on my host:

# echo "1" > /proc/sys/net/ipv4/ip_forward
# iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o eth0 -j MASQUERADE

Putting it together

I added this init script to run all this at start-up :

#!/bin/bash                                                                                        

. /etc/rc.conf
. /etc/rc.d/functions
case "$1" in
  start)
    stat_busy "Starting VDE Switch"
    vde_switch -tap tap0 -daemon -mod 660 -pidfile $PIDFILE -group kvm
    if [ $? -gt 0 ]; then
      stat_fail
    else
        echo "1" > /proc/sys/net/ipv4/ip_forward &&  \
        iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o eth0 -j MASQUERADE &&  \
        ifconfig tap0 192.168.100.254 netmask 255.255.255.0 && \
        stat_done || stat_fail
    fi
    ;;
  stop)
    stat_busy "Stopping VDE Switch"
    # err.. well, i should remove the switch here...
    stat_done
    ;;
  restart)
    $0 stop
    sleep 1
    # Aem.. As long as stop) is not implemented, this just fails
    $0 start
    ;;
  *)
    echo "usage: $0 {start|stop|restart}"  
esac
exit 0

Well, I know it is dirty and could be more configurable. Feel free to improve it. VDE has an rc script too, but I had to make one anyway for the IP forwarding stuff.

Alternative method

If the above method does not work or you do not want to mess with kernel configs, TUN, dnsmasq and iptables you can do the following for the same result.

vde_switch -daemon -mod 660 -group kvm
slirpvde --dhcp --daemon

Then to start the vm with a connection to the network of the host:

kvm -net nic,macaddr=52:54:00:00:EE:03 -net vde whatever.qcow

Graphics

QEMU can use the following different graphic outputs: std, cirrus, vmware, qxl, xenfs and vnc. With the Template:Codeline option you can run your guest standalone and connect to it via VNC. Other options are using Template:Codeline, Template:Codeline, Template:Codeline:

std

With Template:Codeline you can get a resolution of up to 2560 x 1600 pixels.

vmware

Althought it is a bit buggy, it performs better than std and cirrus. On the guest, install the VMware drivers:

pacman -S xf86-video-vmware xf86-input-vmmouse

Windows guest

If you use a MS Windows guest, you might want to use RDP to connect to your guest VM. Use: (if you are using a VLAN or are not in the same network as the guest)

qemu -nographic -net user,hostfwd=tcp::5555-:3389

Then connect with either rdesktop or freerdp to the guest, for example:

xfreerdp -g 2048x1152 localhost:5555 -z -x lan

Front-ends for QEMU

There are a few GUI Front-ends for QEMU:

  • community/qemu-launcher
  • community/qemulator
  • community/qtemu

Keyboard seems broken / Arrow keys do not work

Should you find that some of your keys do not work or "press" the wrong key (in particular, the arrow keys), you likely need to specify your keyboard layout as an option. The keyboard layouts can be found in Template:Filename.

qemu -k [keymap] [disk_image]

Starting QEMU virtual machines on boot

To run QEMU VMs on boot, you can use following rc-script and config.

Config file options
QEMU_MACHINES List of VMs to start
qemu_${vm}_type QEMU binary to call. If specified, will be prepended with Template:Codeline and that binary will be used to start the VM. I.e. you can boot e.g. qemu-system-arm images with qemu_my_arm_vm_type="system-arm". If not specified, Template:Codeline will be used.
qemu_${vm} QEMU command line to start with. Will always be prepended with Template:Codeline.
qemu_${vm}_haltcmd Command to shutdown VM safely. I am using Template:Codeline and power off my VMs via ACPI by sending Template:Codeline to monitor. You can use ssh or some other ways.
qemu_${vm}_haltcmd_wait How much time to wait for safe VM shutdown. Default is 30 seconds. rc-script will kill qemu process after this timeout.

Config file example: Template:File

rc-script: Template:File

External links

A very good QEMU guide by AlienBOB: http://alien.slackbook.org/dokuwiki/doku.php?id=slackware:qemu