节选
Devices 通常需要指定:
1) 模拟器
2) 磁盘
3) 网卡
4) 图形界面接口
1) 模拟器
范例:
<domain type='qemu' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
<name>QEMU-fedora-i686</name>
<memory>219200</memory>
<os>
<type arch='i686' machine='pc'>hvm</type>
</os>
<devices>
<emulator>/usr/bin/qemu-system-x86_64</emulator>
</devices>
<qemu:commandline>
<qemu:arg value='-newarg'/>
<qemu:env name='QEMU_ENV' value='VAL'/>
</qemu:commandline>
</domain>
QEMU emulated guest on x86_64
<emulator>/usr/bin/qemu-system-x86_64</emulator>
KVM hardware accelerated guest on i686
<emulator>/usr/bin/qemu-kvm</emulator>
LXC container driver
<emulator>/usr/libexec/libvirt_lxc</emulator>
libxl hypervisor driver for Xen
<emulator>/usr/lib/xen/bin/qemu-dm</emulator>
OpenVZ container driver
VirtualBox hypervisor driver
VMware ESX hypervisor driver
VMware Workstation / Player / Fusion hypervisors driver
Microsoft Hyper-V hypervisor driver
IBM PowerVM hypervisor driver (phyp)
Virtuozzo driver
Bhyve driver
没看到,没有???
2) 磁盘
<disk type='file' device='disk'>
<source file='/var/lib/libvirt/images/demo2.img'/>
<target dev='hda'/>
</disk>
disk
disk 元素 用于描述disks属性,如下:
type
可选值有 "file", "block", "dir" , "network" , o"volume"
device
描述映射到Guset OS后的角色。可用值"floppy", "disk", "cdrom", "lun"
, 默认为 "disk"
"lun"仅用于iscsi存储 type为 "block"或者"network"
,光纤存储 type为“volume”
。
"lun"仅可被识别为raw设备,不可用于LVM
model
描述了disk的仿真模式。通常,取决于总线属性。但是在总线(bus)属性为"virtio"的时候,可以扩展为"virtio-transitional", "virtio-non-transitional", "virtio"
rawio
定义disk是否需要rawio功能。可用值 "yes" or "no",默认"no"。
仅用于"lun"
。
sgio
不知道是个什么玩意。定义了SG_IO指令是否用于disk。可用值"filtered" or "unfiltered",默认"filtered"。
仅用于"lun"
。
snapshot
描述了磁盘快照的默认模式
Indicates the default behavior of the disk during disk snapshots:
"internal"
需要一个qcow2格式的文件,用于存储执行快照后的快照和修改的数据文件。
"external"
将把快照文件和live data隔离。
"no"
磁盘不参与快照。
Read-only 磁盘默认 "no", 其他磁盘模式取决于hypervisor的功能。
3) 网卡
<interface type='network'>
<source network='default'/>
<mac address='24:42:53:21:52:45'/>
</interface>
...
<devices>
<interface type='direct' trustGuestRxFilters='yes'>
<source dev='eth0'/>
<mac address='52:54:00:5d:c7:9e'/>
<boot order='1'/>
<rom bar='off'/>
</interface>
</devices>
...
类型 | interface type |
---|---|
Virtual network | type='network' |
Bridge to LAN | type='bridge' |
Userspace SLIRP stack | type='user' |
Generic ethernet connection | type='ethernet' |
Direct attachment to physical interface | type='direct' |
PCI Passthrough | type='hostdev' |
Multicast tunnel | type='mcast' |
TCP tunnel |
type='server' type='client'
|
UDP unicast tunnel | type='udp' |
vhost-user interface | type='vhostuser' |
Virtual network
推荐用于动态地址、无线网络环境。或者主机硬件信息使用<network>
元素单独描述的多主机环境。
环境 | forward mode |
---|---|
isolated | no <forward>
|
NAT | <forward mode='nat'> |
Route | <forward mode='route'/> |
directly | via macvtap |
Bridge |
<forward mode='bridge> ,<forward mode='private'> ,<forward mode='vepa'> ,<forward mode='passthrough'>
|
如果forward mode 设置为bridge,private,vepa,passthrough
,那么DNS和DHCP设置在libvirt外。如果是isolated, nat, routed
模式,DNS和DHCP需要由libvirt提供,IP范围通过 'virsh net-dumpxml [networkname]
'设置。
"default"作为默认虚拟网络,提供指向路由(区别于指向设备)的NAT服务,IP范围192.168.122.0/255.255.255.0
。
Guest将会提供一个关联的tun设备,以vnetN命名。也可以使用<target>
定义。
如果type=network , portgroup
也将一起定义。一个网络可以拥有多个postgroups。
如果type=network , portid
属性有时候也会设置。这提供了UUID(virNetworkPortPtr对象),记录interface和network之间的关联信息。因为Port对象是随着startup、shutdown自动创建删除的,所以该属性只读。
类似于direct
网络,network
也可以定义virtualport
元素,对接vepa (802.1Qbg) ,802.1Qbh compliant switch,Open vSwitch virtual switch。
高级配置,连到switch啥的,还要靠<network>
定义。
Bridge to LAN
推荐用于有固定网线连着的环境
提供一个VM直接连接LAN的网桥。在宿主机上,需要有一个包含一个或多个网卡的桥接设备。Guest VM拥有一个tun设备,以vnetN命名,也可以使用<target>
定义。Guest VM的tun设备和桥接设备绑定。IP和网络配置将取决于LAN环境。这种方式的VM工作方式和物理机相同。
Linux系统,桥接设备通常为linux host bridge。有些主机使用Open vSwitch, 也可以通过配置<virtualport type='openvswitch'/>
到interface来连接Open vSwitch 网桥。Open vSwitch 类型的 <parameters>
有两个元素 interfaceid
和profileid
。
interfaceid
用于以UUID标示唯一的接口信息。如果没有配置,在首次的创建的时候会自动生成。
profileid
用于配置Open vSwithc的接口 "port-profile"。
我将以brige模式为主
4) 图形接口
Graphical framebuffers
...
<devices>
<graphics type='sdl' display=':0.0'/>
<graphics type='vnc' port='5904' sharePolicy='allow-exclusive'>
<listen type='address' address='1.2.3.4'/>
</graphics>
<graphics type='rdp' autoport='yes' multiUser='yes' />
<graphics type='desktop' fullscreen='yes'/>
<graphics type='spice'>
<listen type='network' network='rednet'/>
</graphics>
</devices>
...
graphics
<graphics>
元素 属性有如下值: sdl, vnc, spice, rdp, desktop or egl-headless
sdl
在宿主机桌面以窗口显示。有三个可选参数:
display
xauth
用于认证
fullscreen
可选参数 "yes" "no"
可以配置gl属性 enable="yes" 或者enable="no" 来开启或关闭OpenGL
vnc
开启VNC server.
port
属性定义TCP端口 (配置 -1 会自动分配)。
autoport
属性是自动分配TCP端口的新推荐配置方式。
passwd
属性以明文定义VNC password 。如果passwd
为空,VNC access 禁用。
keymap
属性
connected
属性,仅接受keep
。
sharePolicy
可选属性定义share策略。allow-exclusive
允许客户端独占, 这是默认配置.。force-shared
禁止客户端独占。ignore
不设限。
除了listen/port
, QEMU 还支持socket
属性 以允许unix domain socket path 。
websocket
属性亦可配置端口访问。 ( -1 参数将自动分配端口meaning auto-allocation and autoport having no effect due to security reasons) Since 1.0.6.
虽然VNC天生不支持OpenGL, 它可以配合使用egl-headless
方式来进行OpenGL渲染
spice
开启SPICE server。
port
属性定义TCP端口 (配置 -1 会自动分配)
tlsPort
属性定义安全端口。
autoport
属性是自动分配TCP端口的新推荐配置方式。
passwd
属性以明文定义SPICE password,如果 passwd
为空, SPICE access禁用。
keymap
属性 (看不懂)
connected
属性配置是否允许密码变更期间的控制连接。 keep
允许保持客户端连接, disconnect
断开客户端连接,fail
禁止变更密码。
defaultMode
属性设置默认channal安全策略。 secure
, insecure
和默认值 any
。
SPICE 普通和TLS安全模式都支持。可以在<graphics>
下面设置多个<channel>
,并配置mode
属性为 secure
或insecure
,可以支持多个channel以不同的模式工作在不同的端口。mode
属性会覆盖defaultMode
属性的配置。有效的channel names 有 main
, display
, inputs
, cursor
, playback
, record
,smartcard
,usbredir
<graphics type='spice' port='-1' tlsPort='-1' autoport='yes'>
<channel name='main' mode='secure'/>
<channel name='record' mode='insecure'/>
<image compression='auto_glz'/>
<streaming mode='filter'/>
<clipboard copypaste='no'/>
<mouse mode='client'/>
<filetransfer enable='no'/>
<gl enable='yes' rendernode='/dev/dri/by-path/pci-0000:00:02.0-render'/>
</graphics>
Spice 支持音频,图片,流的压缩。这些通过compression
属性设置,包含如下:
image
设置图片压缩 (参数:auto_glz
, auto_lz
, quic
, glz
,lz
, off
)
jpeg
JPEG在wan传输时压缩 (参数auto
, never·,
always)
zlibwan图片的压缩 (accepts
auto,
never,
always)
playback音频流压缩 (
onor
off`)
streaming
元素 设置streaming mode, mode
属性设置为filter
, al
or off
clipboard
用于设备复制粘贴功能,默认开启。可以通过设置 copypaste
参数为no
关闭。
mouse
设置鼠标模式,可以设置mode
属性为server
or client
。 如果没有设置,qemu默认使用client mode。
filetransfer
设置文件传输功能。默认开启,可以通过设置enable
属性为no
关闭。
Spice还可以开启OpenGL在服务器端渲染。 可以通过配置<gl>
元素, 设置enable
属性来配置是否开启OpenGL支持。因为需要UNIX sockets,所以仅能在本地工作。配置listen
type为 'socket' or 'none'。如果需要远程支持OpenGL,考虑与egl-headless
搭配使用。没有原生Spice OpenGL性能好。
默认,QEMU选择第一个可用GPU DRM 渲染节点。也可以手动指定节点路径。
rdp
启动RDP server.
port
属性定义TCP端口 (配置 -1 会自动分配)。
autoport
属性是自动分配TCP端口的新推荐配置方式。如果使用VirtualBox driver, autoport
会在VM启动的时候,选择 3389-3689之间的可用端口。
multiUser
属性是布尔值,配置是否允许到VM的同时多连接。
replaceUser
属性是布尔值,配置当新客户端连接到VM时是否关闭已存在的连接。
desktop
类似于sdl
,在宿主机桌面显示。只是使用VirtualBox viewer。可选属性display
fullscreen
。
egl-headless
提供本地和远程的OpenGL加速。作为对比,原生OpenGL support仅能工作在宿主机本地(使用UNIX sockets),不过原生OpenGL support拥有更好性能。
因为不提供图形接口,所以必须与vnc或spice一起使用。仅支持QEMU。
<gl>
的子元素<rendernode >
可以被用于指定用于OpenGL渲染的到DRI设备的绝对路径
listen
<listen>
元素用于设置监听设备。 仅 vnc
, spice
, rdp
支持。
address
指定监听哪个ip或者hostname
也可以忽视这个参数,调用config files配置。
如果在listen
和graphics
元素中都有配置,必须保持一致
network
以网络定义监听地址。网络需要存在于libvirt的网络列表。该网络会被解析,选择一个合适的地址写入XML文件中。
比如,IPV4地址段,会选择该段第一个地址作为监听地址写入XML文件。如果网络是网桥,网桥的IPV4地址会被使用。如果direct模式,第一个forward设备的第一个地址会被使用。
socket
监听在unix socket。支持vnc
和spice
。
我觉得用不到,不研究 。
none
没有任何属性。
Libvirt支持APIs接口virDomainOpenGraphics()
和virDomainOpenGraphicsFD()
。
必须通过这个两个接口之一,发送FD到QEMU来连接图形设备。
支持vnc
和 spice