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  | systemctl status libvirtd.service  | 
主要提供的功能包括:
- 虚拟机生命周期管理:包括不同的领域生命周期操作,比如:启动、停止、暂停、保存、恢复和迁移。支持多种设备类型的热插拔操作,包括:磁盘、网卡、内存和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  | log_filters="1:libvirt 1:util 1:qemu"  | 
qemu
libvirt与qemu如何绑定
通过最新qemu源码编译的qemu-kvm,被libvirt进行管理
virsh编辑配置文件的emulator部分:
1  | <emulator>/usr/local/bin/qemu-system-x86_64</emulator>  | 
修改后使其生效时,会出现权限错误:
1  | virsh define ./qemu/win10.xml  | 
解决方法:
在
/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 apparmor或sudo 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.libvirtd,usr.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  | virsh list --all  | 
显示虚拟机的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-name | KVM物理机开机自启动虚拟机,配置后会在此目录生成配置文件/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  | <graphics type='sdl' display=':0.0' xauth='/root/.Xauthority'>  | 
以上配置在
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  | ```  | 
参考
- Domain XML format
 - QEMUSwitchToLibvirt
 - libvirt原理
 - Changing libvirt emulator: Permission denied
 - 虚拟化技术之kvm管理工具virsh常用基础命令(一)
 - 编译qemu和libvirt使支持SDL
 - Virtualization - libvirt
 - KVM 虚拟机 XML 配置文件详解
 - 虚拟化调试和优化指南
 - Windows 10 Virtualization with KVM