QEMU (简体中文)

From ArchWiki
Revision as of 03:59, 4 February 2012 by Jobinson99 (talk | contribs)
Jump to navigation Jump to search

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 – فارسی

Tango-preferences-desktop-locale.pngThis article or section needs to be translated.Tango-preferences-desktop-locale.png

Notes: please use the first argument of the template to provide more detailed indications. (Discuss in Talk:QEMU (简体中文)#)

Qemu是一个广泛使用的开源计算机仿真器和虚拟机。 当作为仿真器时,可以模拟不同架构的计算机,比如在x86_64机器上模拟arm,通过动态转化,这样的运行效率还不算低。 当作为一个虚拟机时,qemu可以通过直接使用真机的系统资源,让虚拟系统能够获得接近于真机的性能表现。qemu支持xen或者kvm模式下的虚拟化。当用kvm时,qemu可以虚拟x86、服务器和嵌入式powerpc,s390的系统。

Qemu的主页在 http://bellard.org/qemu/ .

qemu 和 qemu-kvm 的区别

根据需要,可以从系统维护的源official repositories选择安装 qemu或者 qemu-kvm

KVM (Kernel Virtual Machine 仿核机?)是linux内建的一个功能模块,可让虚拟机中的程序利用真机上核芯提供的硬件虚拟化功能,让虚拟机获得接近真机的性能。现已支持英特尔和威盛的处理器(x86 和 x86_64), PPC 440, PPC 970, 和S/390处理器。

上游qemu是一个完整的虚拟机,大部分情况下不支持硬件加速。qemu现在已经合并了kvm的所有功能,在同样真机的架构上运行虚拟机将课获得kvm的加速特性。比如,当运行 qemu-system-x86 在一个x86核芯的系统上时,将可自动获得kvm的硬件级加速特性。

并非所有的核芯都支持KVM! You will need an x86-based machine running a recent ( >= 2.6.22 ) Linux kernel on an Intel processor with VT-x (virtualization technology) extensions or an AMD processor with SVM (Secure Virtual Machine) extensions (also called AMD-V). Xen has a complete list of compatible processors. For Intel processors, see also the Intel® Virtualization Technology List.



1、要模拟其他处理器,可选择安装QEMU,安装 qemu 包。

2、如果不需要模拟其他处理器,可以只安装KVM,安装 qemu-kvm 包。


要运行qemu你会需要硬盘镜像. 这是一个保存模拟硬盘内容的特殊文件.


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

来创建名为"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 shouldn't worry too much about the size of the disk - the qcow2 format compresses the image so that the empty space doesn't add up to the size of the file.


The installation CD-ROM/floppy shouldn't 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 doesn't 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 "/dev/cdrom", 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


Qemu能够运行任何版本的Windows,不过默认的98, Me and XP运行起来很慢,而 Windows 95 和 Windows 2000都很快,尤其是2000(跑得甚至比98快),最快的是95,它的速度已经可以让你忘记自己是在使用虚拟机。:)

如果你同时拥有Win95和Win98/WinME,推荐使用98lite(来自 http://www.litepc.com )。因为此版本不再使用默认的ie,而是替之用Win95的Explorer。并且此版本还能最小化安装Windows(把你通常不想要的都可以不要了),这样可以获得一个最小、最快、并且还稳定的Windows系统,看起来不错哦。


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 C:\WINNT\SECURITY 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) 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 -win2k-hack 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)."


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.


If you have servers on your host OS they will be accessible with the ip-address without any further configuration. So you could just FTP or SSH, etc to from windows to share data, or if you would like to use 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 smb.conf:

   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 Samba server with the IP address If you are running Win9x as a guest OS, you may need to add smbserver

to C:\Windows\lmhosts (Win9x has Lmhosts.sam as a SAMple, rename it!).


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.

提示: Create a second, raw hard drive image. This way you will be able to transfer data easily and use qcow overlay images for the primary drive.
警告: 挂载时千万不要启动虚拟机!

挂载 qcow2 镜像

你可以使用 qemu-nbd 挂载 qcow2 镜像. 参见 Wikipedia:Qcow#Mounting_qcow2_images.


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 /dev/hdaN 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 /dev/loop0, 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 /dev/md0 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 /dev/hdaN inside /dev/md0 (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 Template:Keypress 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 Template:Keypress to return to the main menu.

Press Template:Keypress and check that the cylinder size is now 16k.

Now, create a single primary partition corresponding to /dev/hdaN. 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 /dev/hdaN partition contains the necessary tools.

优化 Windows 9x 核芯使用率

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?


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 ( >= 2.6.22) Linux kernel on an Intel processor with VT-x (virtualization technology) extensions, or an AMD processor with SVM (Secure Virtual Machine) 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 ( < 0.15.0) does have initial KVM support (qemu --enable-kvm), 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 the official repositories, which is released by the KVM development team and contains 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.

Note: qemu >= 0.15.0 has full support for KVM, as the qemu-kvm tree has been completely merged into the upstream qemu tree. There should be no difference between qemu -enable-kvm and qemu-kvm if your version of qemu is >= 0.15.0.

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

grep -E "(vmx|svm)" --color=always /proc/cpuinfo

And load the appropriate module from your /etc/rc.conf.

  • For Intel® processors add kvm-intel to your MODULES array in /etc/rc.conf
  • for AMD® processors add kvm-amd to your MODULES array in /etc/rc.conf

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

gpasswd -a <Your_User_Account> kvm



如果虚拟机只是需要简单的联接外网,你只需给他加添简单的网络接口即可。方法就是在启动时加上 -net nic,vlan=1 -net user,vlan=1 选项即可。比如:

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

注意这里只支持 TCP 和 UDP 协议。尤其注意 ICMP 协议,这里 ping 不会工作。







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


 # modprobe bridge



 eth0="eth0 up"
 br0="dhcp"      #如果你原来的本地链接是DHCP方式获取配置的话
 #br0="br0 netmask up"      #如果你原来的本地链接是静态设置的话
 INTERFACES=(eth0 br0)




 # modprobe tun


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



 Cmnd_Alias      QEMU=/sbin/ifconfig,/sbin/modprobe,/usr/sbin/brctl,/usr/bin/tunctl



一切配置妥当,我们就可以开始体验了。 启动带桥接模式网络接口的QEMU大致有三个步骤

  • 通过tunctl申请一个可用的虚拟网络接口——tap设备。
  • 配置这个设备并桥接到桥接网络接口,然后启动qemu
  • 退出qemu时,别网络删掉这个虚拟网络接口。


IFACE=`sudo tunctl -b -u $USERID`

qemu-kvm -net nic -net tap,ifname="$IFACE" $*

sudo tunctl -d $IFACE &> /dev/null

需要注意一点,由于我们前面创建了/etc/qemu-ifup这个脚本,因此我们只需要把申请到的虚拟网络接口名通过-net tap,ifname="网络接口名"告诉qemu,他自己会用这个接口名为参数,调用/etc/qemu-ifup来完成桥接和配置这个网络接口的过程。


QEMU 可以使用一下几个图形输出:std, cirrus, vmware, qxl, xenfs 和 vnc。

使用 vnc 选项,你可以单独运行客户机,并且通过 VNC 连接。其他选项是使用std, vmware, cirrus:


使用 -vga std 你可以得到最高 2560 x 1600 像素的分辨率。


尽管有一点怪怪的,但是这种方法确实比 std 和 cirrus 效果好。在客户机中,安装 VMware 驱动:

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

Windows 客户机

如果你使用微软 Windows 客户机,你也许想使用远程桌面协议(RDP)连接到客户虚拟机。使用:(如果你使用 VLAN 或与客户机不在同一个网络之中)

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

然后用 rdesktop 或者 freerdp 连接到客户机,例如:

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



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


如果你发现一些键不工作或“按下”错误的键(尤其是方向键),你也许需要在选项中指定你的键盘布局。键盘布局可以在 /usr/share/qemu/keymaps 找到。

qemu -k [keymap] [disk_image]

启动时运行 QEMU 虚拟机

想要在启动时运行 QEMU 虚拟机,你可以使用下面的 rc-script 和配置文件.

qemu_${vm}_type 调用的 QEMU 二进制文件。如果指定,会被加到 /usr/bin/qemu- 之后,这个程序会被使用来启动虚拟机。也就是说,如你可以启动比如 qemu-system-arm 镜像使用 qemu_my_arm_vm_type="system-arm"。如果不指定,/usr/bin/qemu 会被使用。
qemu_${vm} 启动的 QEMU 命令行。默认带有 -name ${vm} -pidfile /var/run/qemu/${vm}.pid -daemonize -nographic选项。
qemu_${vm}_haltcmd 安全关闭虚拟机的命令。我使用 -monitor telnet:.. 以及通过发送system_powerdown 到 monitor,通过 ACPI 关闭我的虚拟机。你可以使用 ssh 或其他方法。
qemu_${vm}_haltcmd_wait 等待关闭虚拟机的时间。默认是30秒。rc-script 会在这个时间后 kill qemu 进程。


# VMs that should be started on boot
# use the ! prefix to disable starting/stopping a VM

# NOTE: following options will be prepended to qemu_${vm}
# -name ${vm} -pidfile /var/run/qemu/${vm}.pid -daemonize -nographic


qemu_vm1="-enable-kvm -m 512 -hda /dev/mapper/vg0-vm1 -net nic,macaddr=DE:AD:BE:EF:E0:00 \
 -net tap,ifname=tap0 -serial telnet:localhost:7000,server,nowait,nodelay \
 -monitor telnet:localhost:7100,server,nowait,nodelay -vnc :0"

qemu_vm1_haltcmd="echo 'system_powerdown' | nc.openbsd localhost 7100" # or netcat/ncat

# You can use other ways to shutdown your VM correctly
#qemu_vm1_haltcmd="ssh powermanager@vm1 sudo poweroff"

# By default rc-script will wait 30 seconds before killing VM. Here you can change this timeout.

qemu_vm2="-enable-kvm -m 512 -hda /srv/kvm/vm2.img -net nic,macaddr=DE:AD:BE:EF:E0:01 \
 -net tap,ifname=tap1 -serial telnet:localhost:7001,server,nowait,nodelay \
 -monitor telnet:localhost:7101,server,nowait,nodelay -vnc :1"

qemu_vm2_haltcmd="echo 'system_powerdown' | nc.openbsd localhost 7101"


. /etc/rc.conf
. /etc/rc.d/functions

[ -f /etc/conf.d/qemu.conf ] && source /etc/conf.d/qemu.conf

QEMU_DEFAULT_FLAGS='-name ${vm} -pidfile ${PIDDIR}/${vm}.pid -daemonize -nographic'

case "$1" in
    [ -d "${PIDDIR}" ] || mkdir -p "${PIDDIR}"
    for vm in "${QEMU_MACHINES[@]}"; do
       if [ "${vm}" = "${vm#!}" ]; then
         stat_busy "Starting QEMU VM: ${vm}"
         eval vm_cmdline="\$qemu_${vm}"
         eval vm_type="\$qemu_${vm}_type"

         if [ -n "${vm_type}" ]; then

         eval "qemu_flags=\"${QEMU_DEFAULT_FLAGS}\""

         ${vm_cmd} ${qemu_flags} ${vm_cmdline} >/dev/null
         if [  $? -gt 0 ]; then
    add_daemon qemu

    for vm in "${QEMU_MACHINES[@]}"; do
      if [ "${vm}" = "${vm#!}" ]; then
        # check pidfile presence and permissions
        if [ ! -r "${PIDDIR}/${vm}.pid" ]; then

        stat_busy "Stopping QEMU VM: ${vm}"

        eval vm_haltcmd="\$qemu_${vm}_haltcmd"
        eval vm_haltcmd_wait="\$qemu_${vm}_haltcmd_wait"
        vm_pid=$(cat ${PIDDIR}/${vm}.pid)
        # check process existence
        if ! kill -0 ${vm_pid} 2>/dev/null; then
          rm -f "${PIDDIR}/${vm}.pid"

        # Try to shutdown VM safely
        if [ -n "${vm_haltcmd}" ]; then
          eval ${vm_haltcmd} >/dev/null

          while [ "${_w}" -lt "${vm_haltcmd_wait}" ]; do
            sleep 1
            if ! kill -0 ${vm_pid} 2>/dev/null; then
              # no such process
            _w=$((_w + 1))

          # No haltcmd - kill VM unsafely

        if [ -n "${_vm_running}" ]; then
            # kill VM unsafely
            kill ${vm_pid} 2>/dev/null
            sleep 1

        # report status
        if kill -0 ${vm_pid} 2>/dev/null; then
          # VM is still alive
          #kill -9 ${vm_pid}

        # remove pidfile
        rm -f "${PIDDIR}/${vm}.pid"
    rm_daemon qemu

    $0 stop
    sleep 1
    $0 start

    echo "usage: $0 {start|stop|restart}"


External links