标签归档:Qemu

Qemu命令行参数解析

1.介绍
1.1特征
qemu是一个快速的动态译指的虚拟机。他支持多种处理器指令集的模拟。他有两种运行模式:
(1)全系统仿真,这种模式下,他就像一个PC,有独立CPU和外设,可支持多种操作系统。
(2)用户模式仿真,在这种模式下,他就像Wine一样,成为一个windows api模拟器
2.安装
支持linux、windows、mac os
3.QEMU PC系统仿真
3.1介绍
qemu系统仿真外设:(PCI,)
- i440FX host PCI bridge and PIIX3 PCI to ISA bridge (PCI桥和PCI到ISA桥)
- Cirrus CLGD 5446 PCI VGA card or dummy VGA card with Bochs VESA extensions (hardware level, including all non standard modes).

(VGA设备)
- PS/2 mouse and keyboard (PS2鼠标键盘)
- 2 PCI IDE interfaces with hard disk and CD-ROM support (两个PCI上的IDE借口,用于接硬盘和光驱)
- Floppy disk (软盘)
- NE2000 PCI network adapters (PCI网卡)
- Serial ports (串口)
- Creative SoundBlaster 16 sound card (声卡)
- ENSONIQ AudioPCI ES1370 sound card (声卡)
- Adlib(OPL2) - Yamaha YM3812 compatible chip (音频兼容芯片)
- PCI UHCI USB controller and a virtual USB hub. (PCI UHCI USB控制器和一个虚拟usb hub)
3.2快速启动
qemu linux.img
3.3调用
usage:qemu [options] [disk_image]
一般使用:
-h:帮助

-version:查看版本

-M machine:选择虚拟机

-fda file:
-fdb file:使用文件作为软盘,可以使用主机的“/dev/fd0”

-hda file:硬盘选项
-hdb file:硬盘选项
-hdc file:硬盘选项
-hdd file:硬盘选项

-cdrom file:光驱选项

-drive option[,option[,option[,...]]]:定义一个新的驱动器,有效选项如下:
file=file:定义镜像文件
if=interface:该选项定义驱动被连接的类型,ide, scsi, sd, mtd, floppy, pflash, virtio.
bus=bus,unit=unit:这些选项定义连接的驱动器定义总线数字和单位ID。
index=index:此选项定义驱动器连接在一个给定的接口类型列表中可用的连接器使用索引。(可能为盘符)
media=media:cdrom还是disk
cyls=c,heads=h,secs=s[,trans=t]:选项同‘-hdachs’
snapshot=snapshot:值为"on" or "off",允许被给的驱动器使能snapshot
cache=cache:值为"none", "writeback", or "writethrough" ,控制主机缓存用于访问数据块
aio=aio:值为"threads", or "native" ,选择线程基于磁盘IO还是本地linux IO
format=format:指定磁盘格式,建议使用raw
serial=serial:给设备指定序列号(可能是串口,也可能和串口无关)
addr=addr:指定PCI地址(仅仅:if=virtio)
默认情况下,连续写入缓存被用于所有的块设备,这意味着主机页缓存将被用于读和写数据,但是仅仅当数据被报知被写入存储子系统,写通

知将被发送到客户机。
Instead of ‘-cdrom’ you can use:qemu -drive file=file,index=2,media=cdrom
Instead of ‘-hda’, ‘-hdb’, ‘-hdc’, ‘-hdd’, you can use:
qemu -drive file=file,index=0,media=disk
qemu -drive file=file,index=1,media=disk
qemu -drive file=file,index=2,media=disk
qemu -drive file=file,index=3,media=disk

-boot:启动选项,软盘(a)、硬盘(c)、光驱(D)、网卡(n),默认是从硬盘启动

-snapshot:快照功能

-no-fd-bootchk:禁止启动检测软盘

-m megs:内存大小

-cpu model:选择cpu模式

-smp n:cpu个数

-numar opts:模拟一个多节点的非统一内存访问,如果cpu内存都被忽略,资源平分

-nographic:通常,QEMU使用SDL显示VGA输出,使用这个选项,使qemu成为简单的命令行应用程序

-k language:键盘布局,默认是en-us

-audio-help:声音子系统帮助显示,驱动列表,可调参数等

-soundhw card1,card2,... or -soundhw all:使能音频并选择声卡

-localtime:设置真实时钟为本地时钟,默认是UTC时间

-full-screen:全屏

-pidfile file:存储qemu进程PID到文件,用于脚本启动

-daemonize:初始化后QEMU进程长期驻留,qemu将不从标准IO分离,除非他准备连接到他的设备中的起其中一个。这个选项用于外部程序启动qemu

而不用去初始化静态条件。

-option-rom file:加载一个可选ROM文件内容,用于加载像EtherBoot这样的东西。

-mtdblock file:

USB选项:
-usb:使能usb驱动,默认项

-usbdevice devname:添加usb设备名称,有效的设备如下:
mouse:虚拟鼠标,会覆盖ps/2鼠标仿真
tablet:使用绝对坐标的指针设备(如:触摸屏),也会覆盖ps/2鼠标
disk:file:基于文件的大容量存储设备
host:bus.addr:通过总线地址传递主机设备(仅仅linux平台有效)
host:vendor_id:product_id:通过pid、vid传递主机设备(仅仅linux平台有效)

Network options: (网络这里先不做重点)
-net nic[,vlan=n][,macaddr=addr][,model=type]:

-net user[,vlan=n][,hostname=name]:

-net tap[,vlan=n][,fd=h][,ifname=name][,script=file]:

-net socket[,vlan=n][,fd=h][,listen=[host]:port][,connect=host:port]:

-net socket[,vlan=n][,fd=h][,mcast=maddr:port]:

-net none:

-tftp prefix:

-smb dir:

-redir [tcp|udp]:host-port:[guest-host]:guest-port:重定向网络

-kernel bzImage: 内核镜像

-append cmdline:内核命令行

-initrd file:使用文件作为ram盘

Debug/Expert options:
-serial dev:重定向虚拟串口到主机设备。默认设备是vc在图形模式下,是stdio在非图形界面。这个选项可被使用多次,可模拟4个串口。使用-

serial none会屏蔽所有串口。有效的字符设备是:
vc:虚拟控制台
pty:仅仅linux有效,虚拟tty(一个虚拟伪终端会被立刻分配)
none:没有设备被分配
null:无效设备
/dev/XXX:仅仅linux有效,使用主机tty,e.g. `/dev/ttyS0'.
/dev/parportN:仅仅linux有效,使用主机并口N,当前仅仅SPP(串行式)特征能被使用。
file:filename:写输出到filename,没有字符被读
stdio:仅仅unix可用
pipe:filename:命名管道
COMn:仅仅windows可用,使用主机串口n
udp:[remote_host]:remote_port[@[src_ip]:src_port]:这实现了UDP网络控制台,当远程主机(remote_host)或源ip(src_ip)未指定

,则会被默认设置为0.0.0.0。当未使用源端口(src_port)

tcp:[host]:port[,server][,nowait][,nodelay]:TCP网络控制方式有两种模式。可以发送串口I/O到一个位置或等待一个连接。默认情况下,TCP

网络控制台通过port发送主机。
Example to send tcp console to 192.168.0.2 port 4444
-serial tcp:192.168.0.2:4444
Example to listen and wait on port 4444 for connection
-serial tcp::4444,server
Example to not wait and listen on ip 192.168.0.100 port 4444
-serial tcp:192.168.0.100:4444,server,nowait

telnet:host:port[,server][,nowait][,nodelay]:telnet协议是用来代替原始的tcp协议,这个选项工作类似于-serial tcp。

unix:path[,server][,nowait]:使用unix域套接字代替tcp套接字,这个选项工作类似于-serial tcp。

-parallel dev:重定向虚拟并口到主机设备。最多可虚拟3个并口。

使用Qemu-img管理虚拟机磁盘镜像(创建虚拟机,虚拟机快照)

一台虚拟机的核心就是一个磁盘镜像,这个镜像可以理解成虚拟机的磁盘,里面有虚拟机的操作系统和驱动等重要文件。本文主要介绍创建虚拟机的一般过程。

创建虚拟机镜像

 

要在一台host上跑起一个虚拟机一般需要两个步骤:

第一步:创建虚拟机镜像

qmeu-img创建的镜像是一个稀疏文件,也就是说刚创建出来的文件并没有8G,它会随着数据的增多慢慢增加,直到8G

 

第二步:启动虚拟机

运行结果: 因为镜像里面没有任何内容,所以提示找不到可引导设备。

点击查看原图

 

使用qemu-img管理镜像



 

qemu-img基本命令


 

上节介绍了使用qemu-img创建镜像,这一节将会介绍qemu-img在镜像管理上的强大功能。

qemu-img有很多命令,包括下面常用的,当然qemu-img -h你懂得。

info

查看镜像的信息

create

创建镜像

check

检查镜像

convert

转化镜像的格式,(raw,qcow ……)

snapshot

管理镜像的快照

rebase

在已有的镜像的基础上创建新的镜像

resize

增加或减小镜像大小

 创建镜像


 

 举例:

 

 

 

虽然ls中看到文件的大小是4G,但是实际上磁盘大小是0。这就是稀疏文件

 

 

转化


将一个镜像文件转化为另外一种格式,qemu-img支持的格式可以看qemu-img -h最后一行。

 

转化命令:

 

-c:采用压缩,只有qcow和qcow2才支持

-f:源镜像的格式,它会自动检测,所以省略之

-O 目标镜像的格式

-o 其他选先

fname:源文件

out_fname:转化后的文件

看例子:

 

 

如果想看要转化的格式支持的-o选项有哪些,可以在命令末尾加上 -o ?

 

增加减少镜像大小


注意:只有raw格式的镜像才可以改变大小

 

快照


查看快照

注意:只有qcow2才支持快照

打快照

 

举例:

 

从快照恢复:

然后从kvm启动这个虚拟机,会发现虚拟机又在打快照时的状态了

 

删除快照:

 

 

使用派生镜像(qcow2)


    当创建的虚拟机越来越多,并且你发现好多虚拟机都是同一个操作系统,它们的区别就是安装的软件不大一样,那么你肯定会希望把他们公共的部分提取出来,只保存那些与公共部分不同的东西,这样镜像大小下去了,空间变多了,管理也方便了。派生镜像就是用来干这事的!

首先看一个原始镜像

现在我们新建一个镜像,但是派生自它

 

 

 

 ^_^,这个镜像才136K,够省了吧。DRY永远的真理啊!

现在我们在vm3_5.qcow2上打了很多安全补丁,然后发现我又想在vm3_5.qcow2上派生新的虚拟机,o(∩∩)o...哈哈,这下怎么办呢?

 

 

这个转化将会将vm3_5和base合并,生成新的vm3_base2.raw,然后你就可以继续无穷无尽的派生之旅了!

 

Qemu中文手册

快速启动
在我们下载并解压linux镜像(linux.img)以后,我们可以输入下面的命令来启动:
qemu linux.img
这样Linux就会启动并会展示给我们一个提示.
调用
用法:qemu [option] [disk_image]
disk_image是代表IDE的硬盘的硬盘镜像.
一般选项:
-M machine
选择模拟的机器(我们可以输入-M?提到一个模拟的机器列表)
-fda file
-fdb file
使用file作为软盘镜像.我们也可以通过将/dev/fd0作为文件名来使用主机软盘.
-hda file
-hdb file
-hdc file
-hdd file
使用file作为硬盘0,1,2,3的镜像.
-cdrom file
使用文件作为CD-ROM镜像(但是我们不可以同时使用'-hdc'和'-cdrom').我们可以通过使用'/dev/cdrom'作为文件名来使用主机的CD-ROM.
-boot [a|c|d]
由软盘(a),硬盘(c)或是CD-ROM(d).在默认的情况下由硬盘启动.
-snapshot
写入临时文件而不是写入磁盘镜像文件.在这样的情况下,并没有写回我们所使用的磁盘镜像文件.然而我们却可以通过按下C-a s来强制写回磁盘镜像文件.
-m megs
设置虚拟内存尺寸为megs M字节.在默认的情况下为128M.
-smp n
模拟一个有n个CPU的SMP系统.为PC机为目标,最多可以支持255个CPU.
-nographic
在通常情况下,Qemu使用SDL来显示VGA输出.使用这个选项,我们可以禁止所有的图形输出,这样Qemu只是一个简单的命令行程序.模拟的串口将会重定向到命令行.所以,我们仍然可以在Qemu平台上使用串口命令来调试Linux内核.
-k language
使用键盘布局语言(例如fr为法语).这个选项只有在不易得到PC键盘的情况下使用.我们在PC/Linux或是PC/Windows主机不需要使用这个选项.可用的布局如下:
ar  de-ch  es  fo    fr-ca  hu  ja  mk    no  pt-br  sv
da  en-gb  et  fr    fr-ch  is  lt  nl    pl  ru     th
de  en-us  fi  fr-be  hr    it  lv  nl-be  pt  sl    tr
默认的为en-us
-audio-help
这个选项将会显示声音子系统的帮助:驱动列表以及可调用的参数.
-soundhw card1,card2 ....  or -soundhw all
允许声音并选择声音硬件.使用?可以列出所有可用的声音硬件
qemu -soundhw sb16,adlib hda
qemu -soundhw es1370 hda
qemu -soundhw all hda
qemu -soundhw ?
-localtime
设置时钟为本地时间(默认为UTC时间).如果在MS-DOS或是Windows上这个选项则需要正确的日期.
-full-screen
以全屏方式启动.
-pidfile file
在file文件中存许Qemu的进程PID.如果我们是由脚本启动的,这个选项是相当有用的.
-win2k-hack
当安装Windows 2000时可以使用这个选项来避免磁盘错误.在安装上Windows 2000系统,我们就不再需要这个选项(这个选项降低IDE的传输速度).
USB选项:
-usb
允许USB驱动(很快就将成为默认的选项)
-usbdevice devname
添加USB设备名.我们可以查看监视器命令usb_add来得到更为详细的信息.
网络选项:
-net nic[,vlan=n][,macaddr=addr]
创建一个新的网卡并与VLAN n(在默认的情况下n=0)进行连接.在PC机上,NIC当前为NE2000.作为可选项的项目,MAC地址可以进行改变.如果没有指定-net选项,则会创建一个单一的NIC.
-net user[,vlan=n]
使用用户模式网络堆栈,这样就不需要管理员权限来运行.如果没有指定-net选项,这将是默认的情况.
-net tap[,vlan=n][,fd=h][,ifname=name][,script=file]
将TAP网络接口name与VLAN
n进行连接,并使用网络配置脚本file进行配置.默认的网络配置脚本为/etc/qemu-ifup.如果没有指定name,OS将会自动指定一个.fd=h可以用来指定一个已经打开的TAP主机接口的句柄.例如:
qemu linux.img -net nic -net tap
下面的是一个更为复杂的例子(两个NIC,每一个连接到一个TAP设备):
qemu linux.img -net nic,vlan=0 -net tap,vlan=0,ifname=tap0 \
              -net nic,vlan=1 -net tap,vlan=1,ifname=tap1
-net socket[,vlan=n][,fd=h][,listen=[host]:port][,connect=host:port]
使 用TCP socket 将VLAN
n与远程的另一个Qemu虚拟机的VLAN进行连接.如果指定了listen,Qemu将在port端口监听连入请求(host是可选的),
connect可以用来使用listen选项与另一个Qemu实例进行连接.fd=h指定了一个已经打开的TCP socket.例如:
# launch a first QEMU instance
qemu linux.img -net nic,macaddr=52:54:00:12:34:56 -net socket,listen=:1234
# connect the VLAN 0 of this instance to the VLAN 0 of the first instance
qemu linux.img -net nic,macaddr=52:54:00:12:34:57 -net
socket,connect=127.0.0.1:1234
-net socket[,vlan=n][,fd=h][,mcast=maddr:port]
创建一个VLAN n,并使用UDP 多址通信套掊口与其他的QEMU虚拟机进行共享,尤其是对于每一个使用多址通信地址和端口的QEMU使用同一个总线.
在这里我们要注意以下几点:
1 几个QEMU可以运行在不同的主机上但却使用同一个总线(在这里假设为这些主机设置了正确的多址通信)
2 mcast支持是与用户模式Linux相兼容的.
3 使用fd=h指定一个已经打开的UDP 多址通信套接口.
例如:
# launch one QEMU instance
qemu linux.img -net nic,macaddr=52:54:00:12:34:56 -net
socket,mcast=230.0.0.1:1234
# launch another QEMU instance on same "bus"
qemu linux.img -net nic,macaddr=52:54:00:12:34:57 -net
socket,mcast=230.0.0.1:1234
# launch yet another QEMU instance on same "bus"
qemu linux.img -net nic,macaddr=52:54:00:12:34:58 -net
socket,mcast=230.0.0.1:1234
下面的为用户模式Linux的例子:
# launch QEMU instance (note mcast address selected is UML's default)
qemu linux.img -net nic,macaddr=52:54:00:12:34:56 -net
socket,mcast=239.192.168.1:1102
# launch UML
/path/to/linux ubd0=/path/to/root_fs eth0=mcast
-net none
表明没有网络设备需要进行配置.如果没有指定-net选项,则会用来覆盖活跃的默认配置.
-tftp prefix
当 使用用户模式网络堆栈,激活一个内置的TFTP服务器.所有的以prefix开始的文件将会使用一个TFTP客户端从主机下载到本地.在本地的TFTP客
户端必须以二进制模式进行配置(使用Unix的TFTP客户端的bin命令).在客户机上的主机IP地址如通常的10.0.2.2.
-smb dir
当使用用户模式的网络堆栈,激活一个内建的SMB服务器,这样Windows系统就可以透明的访问主机的dir目录中的文件.在客户机的Windows系统中,下面的行:
10.0.2.4 smbserver
必 须添加在文件C:\WINDOWS\LMHOSTS' (for windows
9x/Me)或者是C:\WINNT\SYSTEM32\DRIVERS\ETC\LMHOSTS(Windows
NT/2000).然后可以用\\smbserver\qemu的方式访问dir.在这里我们要注就是在主机系统中必须安有SAMBA服务器.
-redir [tcp|udp]:host-port:[guest-host]:guest-port
当 使用用户模式网格栈,将连接到主机端口host-port的TCP或是UDP连接重定向到客户机端口guest-port上。如果没有指定客户机端口,他
的值为10.0.2.15(由内建的DHCP服务器指定默认地址)。例如:要重定向从screen 1到客户机screen
0的X11连接,我们可以使用下面的方法:
# on the host
qemu -redir tcp:6001::6000 [...]
# this host xterm should open in the guest X11 server
xterm -display :1
To redirect telnet connections from host port 5555 to telnet port on
the guest, use the following:
# on the host
qemu -redir tcp:5555::23 [...]
telnet localhost 5555
然后当我们在主机telnet localhost 5555上使用时,我们连接到了客户机的telnet服务器上。
Linux启动相关:
当我们使用这些选项时,我们可以使用一个指定的内核,而没有将他安装在磁盘镜像中。这对于简单的测试各种内核是相当有用的。
-kernel bzImage'
使用bzImage作为内核映像。
-append cmdline'
使用cmdline作为内核的命令行。
-initrd file'
使用file作为初始的ram磁盘。
调试选项:
-serial dev'
重定向虚拟串到主机的设备dev。可用的设备如下:
vc
虚拟终端
pty
(Linux)伪TTY(自动分配一个新的TTY)
null
空设备
/dev/XXX
(Linux)使用主机的tty。例如,'/dev/ttyS0'。主机的串口参数通过模拟进行设置。
/dev/parportN
(Linux)使用主机的并口N。当前只可以使用SPP的并口特征。
file:filename
将输出写入到文件filename中。没有字符可读。
stdio
(Unix)标准输入/输出
pipe:filename
(Unix)有名管道filename
在图形模式下的默认设备为vc,而在非图形模式下为stdio.这个选项可以被多次使用,最多可以模拟4个串口。
'-parallel dev'
重定向虚拟并口到主机的设备dev(与串口相同的设备)。在Linux主机上,
/dev/parportN'可以被用来使用与相应的并口相连的硬件设备。这个选项可以使用多次,最多可以模拟3个并口。
-monitor dev'
重定向临视器到主机的设备dev(与串口相同的设备)。在图形模式下的默认设备为vc,而在非图形模式下为stdio。
'-s'
等待gdb连接到端口1234.
-p port'
改变gdb连接端口。
-S'
在启动时并不启动CPU(我们必须在监视器中输入'c')
'-d'
输出日志到/tmp/qemu.log
-hdachs c,h,s,[,t]'
强 制硬盘0的物理参数(1 <= c <= 16383, 1 <= h <= 16, 1 <= s <=
63),并且可以选择强制BIOS的转换模式(t=none, lba or
auto).通常QEMU可以检测这些参数.这个选项对于老的MS-DOS磁盘映像是相当有用的.
-std-vga'
模拟一个Bochs VBE扩展的标准VGA显卡(默认情况下为Cirrus Logic GD5446 PCI VGA)
-loadvm file'
从一个保存状态启动.
组合键
在图形模拟时,我们可以使用下面的这些组合键:
Ctrl-Alt-f
全屏
Ctrl-Alt-n
切换虚拟终端'n'.标准的终端映射如下:
1 目标系统显示
2 临视器
3 串口
Ctrl-Alt
抓取鼠标和键盘
在虚拟控制台中,我们可以使用Ctrl-Up, Ctrl-Down, Ctrl-PageUp 和 Ctrl-PageDown在屏幕中进行移动.
在模拟时,如果我们使用-nographic'选项,我们可以使用Ctrl-a h来得到终端命令:
Ctrl-a h
打印帮助信息
Ctrl-a x
退出模拟
Ctrl-a s
将磁盘信息保存入文件(如果为-snapshot)
Ctrl-a b
发出中断
Ctrl-a c
在控制台与监视器进行切换
Ctrl-a Ctrl-a
发送Ctrl-a
磁盘映像
从0.6.1起,QEMU支持多种磁盘映像格式,包括增长的磁盘映像,压缩与加密的磁盘映像.
我们可以用下面的命令来创建一个磁盘映像:
qemu-img create myimage.img mysize
这里myimage.img是磁盘映像的文件名,而mysize是以K表示的尺寸.我们可以使用M前缀来使用M表示尺寸或是G作为前缀使用G表示尺寸.
qemu-img的调用方法:
方法:qemu-img command [command options]
可以支持下面的一些命令:
create [-e] [-b base_image] [-f fmt] filename [size]'
commit [-f fmt] filename'
convert [-c] [-e] [-f fmt] filename [-O output_fmt] output_filename'
`info [-f fmt] filename
命令参数
filename
磁盘映像文件名.
base_image
只读的磁盘映像,可以作为拷贝到写映像的基础.写映像上的拷贝只存储修改的数据.
fmt
磁盘映像格式.在大多数情况下可以自动检测.可以支持下面的格式:
raw
raw 磁盘格式(默认).这种格式有简单并且易于移植到其他模拟器的优点.如果我们的文件系统支持holes(例如在Linux上的ext2或是ext3),然
后只有写入的部分保持空白.使用qemu-img info来得到映像使用的实际的大小或是在Unix/Linux上使用 ls -ls.
qcow
QEMU映像格式.最通用的格式.使用他可以获得较小的映像(如果我们的文件系统不支持holes,例如在Windows上,这是相当有用的),可以选用AES加密或是基于zlib的压缩.
cow
在写映像格式上的用户模式的Linux拷贝.在QEMU中作为增长的映像格式使用.这个选项只是为了与以前版本的兼容,并不能在Win32上使用.
vmdk
VMware 3 或是 4 兼容的映像格式.
cloop
Linux压缩的循环映像,重用直接压缩的CD-ROM映像.
size
以K表示的磁盘映像的尺寸.同时可以支持M或是G作为前缀.
output_filename
目的磁盘映像文件名
output_fmt
目标格式
-c
表明目标映像必须是压缩的(只是qcow格式)
-e
表明目标映像必须是加密的(只是qcow格式)