libvirt for qemu

libvirt是目前使用最为广泛的针对KVM虚拟机进行管理的工具和API。libvirtd是一个daemon进程,可以被本地和远程的virsh(命令行工具)调用,Libvirtd通过调用qemu-kvm操作管理虚拟机。libvirt 由应用程序编程接口 (API) 库、一个守护进程 (libvirtd),和默认命令行实用工具(virsh)等部分组成

1
yum install -y qemu-kvm qemu-kvm-tools libvirt virt-install

libvirtd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
systemctl status libvirtd.service
● libvirtd.service - Virtualization daemon
Loaded: loaded (/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2020-08-24 09:22:15 CST; 7h ago
TriggeredBy: ● libvirtd-admin.socket
● libvirtd.socket
● libvirtd-ro.socket
Docs: man:libvirtd(8)
https://libvirt.org
Main PID: 1022 (libvirtd)
Tasks: 20 (limit: 32768)
Memory: 65.7M
CGroup: /system.slice/libvirtd.service
├─1022 /usr/sbin/libvirtd
├─1412 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/lib/libvirt/libvirt_leaseshelper
└─1413 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/lib/libvirt/libvirt_leaseshelper

主要提供的功能包括:

  • 虚拟机生命周期管理:包括不同的领域生命周期操作,比如:启动、停止、暂停、保存、恢复和迁移。支持多种设备类型的热插拔操作,包括:磁盘、网卡、内存和CPU。
  • 本地&&远程访问:通过在本地运行libvirt daemon,本机和远程机器,都可以访问并使用libvirt的功能。远程一般通过简单配置SSH即可。
  • 存储管理:除了虚拟机管理,任何运行了libvirt daemon的主机都可以用来管理不同类型的存储:创建不同格式的文件镜像(qcow2、vmdk、raw等)、挂接NFS共享、列出现有的LVM卷组、创建新的LVM卷组和逻辑卷、对未处理过的磁盘设备分区、挂接iSCSI共享等。
  • 虚拟网络管理:可以用来管理和创建虚拟网络,管理物理和逻辑的网络接口。

配置文件

libvirtd服务的配置文件: /etc/libvirt/libvirtd.conf

客户端主配置文件: /etc/libvirt/libvirt.conf

qemu的主配置文件: /etc/libvirt/qemu.conf

libvirtd.conf

  • 日志配置
1
2
log_filters="1:libvirt 1:util 1:qemu"
log_outputs="1:file:/var/log/libvirt/libvirtd.log"

qemu

libvirt与qemu如何绑定

通过最新qemu源码编译的qemu-kvm,被libvirt进行管理

virsh编辑配置文件的emulator部分:

1
<emulator>/usr/local/bin/qemu-system-x86_64</emulator>

修改后使其生效时,会出现权限错误:

1
2
3
# virsh define ./qemu/win10.xml
error: Failed to define domain from ./qemu/win10.xml
error: internal error: Failed to start QEMU binary /usr/local/bin/qemu-system-x86_64 for probing: libvirt: error : cannot execute binary /usr/local/bin/qemu-system-x86_64: Permission denied

解决方法:

/etc/apparmor.d/usr.sbin.libvirtd文件中,添加一行:

1
2
3
4
5
/usr/local/bin/* PUx,
...
# force the use of virt-aa-helper
...
/usr/local/bin/* rmix,

使能生效:sudo systemctl reload apparmorsudo systemctl restart apparmor.service

原因: libvirtd应用的权限被apparmor-profiles所控制,而/usr/local/bin目录下的可执行文件,没有被添加到apparmor-profiles的配置中,因此使用时检测到没有权限。

  • AppArmor 是一款与SeLinux类似的安全框架/工具,其主要作用是控制应用程序的各种权限,例如对某个目录/文件的读/写,对网络端口的打开/读/写等
  • Ubuntu的默认选择
  • centos中如果出现该错误,可以通过临时禁用SELinux进行测试: setenforce 0

apparmor-profiles的状态:

1
sudo apparmor_status

开启虚拟机时,出现无法执行错误:

1
error: internal error: process exited while connecting to monitor: libvirt:  error : cannot execute binary /usr/local/bin/qemu-system-x86_64: Permission denied

原因:不能在apparmor禁用usr.sbin.libvirtdusr.lib.libvirt.virt-aa-helper,也就是将其生成软连接到/etc/apparmor.d/disable.如果要禁掉可能必须重新编译libvirt同时添加--without-apparmor选项(未测试)

其他apparmor权限的问题

在libvirtd中对qemu的运行存在一些权限的设置,为了方便调试,将权限控制禁用。在配置文件/etc/libvirt/qemu.conf中添加下行代码:

1
security_driver = "none"

重启libvirtd.service服务:

1
sudo systemctl restart libvirtd.service

virsh

查看虚拟机状态

1
2
3
4
5
$virsh list --all
Id Name State
------------------------------
- ubuntu20.04 shut off
- win10 shut off

显示虚拟机的XML配置

1
$virsh dumpxml ubuntu20.04

编辑虚拟机的XML配置文件

1
virsh edit ubuntu20.04

常用命令

命令描述
virsh list显示正在运行的虚拟机
virsh list --all显示所有的虚拟机
virsh start vm-name启动vm-name虚拟机
virsh shutdown vm-name关闭vm-name虚拟机
virsh destroy vm-name虚拟机vm-name强制断电
virsh suspend vm-name挂起vm-name虚拟机
virsh define vm-name将domain注册,但是没有启动,下次启动时生效
virsh undefine vm-name删除虚拟机,慎用
virsh dominfo vm-name查看虚拟机的配置信息
virsh domiflist查看网卡配置信息
virsh domblklist vm-name查看该虚拟机的磁盘位置
virsh edit vm-name修改vm-name的xml配置文件
virsh dumpxml vm-name查看KVM虚拟机当前配置
virsh autostart vm-nameKVM物理机开机自启动虚拟机,配置后会在此目录生成配置文件/etc/libvirt/qemu/autostart/vm-name.xml
virsh autostart --disable vm-name取消开机自启动

命令行参数转XML配置文件

domxml-from-native

1
sudo virsh domxml-from-native qemu-argv aa.txt

错误:

1
error: this function is not supported by the connection driver: virConnectDomainXMLFromNative

最新qemu中删除了该功能,因为在实践中它过于不可靠和不完整而无用

配置

添加显卡显示SDL

1
2
3
<graphics type='sdl' display=':0.0' xauth='/root/.Xauthority'>
<gl enable='yes'/>
</graphics>

以上配置在Xfce桌面环境下可以生效

权限错误:

1
error: internal error: cannot load AppArmor profile 'libvirt-39466e8a-545d-420e-ba0f-b942d09a5bdb'

解决方法:在/etc/apparmor.d/usr.sbin.libvirtd配置文件中添加/usr/local/bin/* rmix,

SDL

1
Could not initialize SDL(x11 not available) - exiting

原因:未找到
解决方法:安装xfce桌面环境

1
yum groups install Xfce

for centos7.8

编译使能SDL

在配置中使能SDL:--enable-sdl

异常错误

mlock

1
qemu-system-x86_64: -realtime mlock=off: warning: '-realtime mlock=...' is deprecated, please use '-overcommit mem-lock=...' instead

实例

虚拟机配置文件:ubuntu20.04

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
```

## 域——domain

## 池——pool


# 升级libvirt

## libvirt5.0.0 for centos7

``` shell
#!/bin/bash

#url="http://mirror.centos.org/centos/7.8.2003/virt/x86_64/libvirt-latest/"
url="http://mirrors.huaweicloud.com/centos/7/virt/x86_64/libvirt-latest/"

curl $url > page.txt

grep "5.0.0-1.el7.x86_64" page.txt > fff.txt

while read line
do
#截取href前多余字符串
aaa=${line: 24}
#截取title后多余字符串
bbb=${aaa%title*}
#设置为href变量
export $bbb
#去掉变量值两边的引号
ccc=`echo $href | sed 's/\"//g'`

echo $url$ccc
wget $url$ccc

done < fff.txt

rm page.txt fff.txt -rf

#yum install ./*

参考

  • Domain XML format
  • QEMUSwitchToLibvirt
  • libvirt原理
  • Changing libvirt emulator: Permission denied
  • 虚拟化技术之kvm管理工具virsh常用基础命令(一)
  • 编译qemu和libvirt使支持SDL
  • Virtualization - libvirt
  • KVM 虚拟机 XML 配置文件详解
  • 虚拟化调试和优化指南
  • Windows 10 Virtualization with KVM