Qemu Libvirt

目录



《KVM实战:原理、进阶与性能调优》学习笔记

Qemu 命令

[root@foundation0 ~]# qemu-img create -f raw rhel7.img 40G
Formatting 'rhel7.img', fmt=raw size=42949672960

上述就是用qemu-img create命令创建了一个空白的guest image,以raw格式,image文件的名字是“rhel7.img”,大小是40G。虽然我们看到它的大小是40G,但是它并不占用任何磁盘空间。

[root@foundation0 ~]# du -sh rhel7.img
0       rhel7.img

启动客户机,并在其中用准备好的ISO安装系统,命令行如下:

qemu-system-x86_64 -enable-kvm -m 8G -smp 4 -boot once=d -cdrom RHEL-7.2-20151030.0-Server-x86_64-dvd1.iso rhel7.img

其中,-m 8G是给客户机分配8G内存,-smp 4是指定客户机为对称多处理器结构并分配4个CPU,-boot once=d是指定系统的启动顺序为首次光驱,以后再使用默认启动项(硬盘)[1],-cdrom**是分配客户机的光驱。默认情况下,QEMU会启动一个VNC server端口(5900),可以用vncviwer工具[2]来连接到QEMU的VNC端口查看客户机。




libvirt 简介

提到KVM的管理工具,首先不得不介绍的就是大名鼎鼎的libvirt,因为libvirt是目前使用最为广泛的对KVM虚拟机进行管理的工具和应用程序接口,而且一些常用的虚拟机管理工具(如virsh、virt-install、virt-manager等)和云计算框架平台(如OpenStack、ZStack、OpenNebula、Eucalyptus等)都在底层使用libvirt的应用程序接口。

libvirt支持多种虚拟化方案,既支持包括KVM、QEMU、Xen、VMware、VirtualBox、Hyper-V等在内的平台虚拟化方案,也支持OpenVZ、LXC等Linux容器虚拟化系统,还支持用户态Linux(UML)的虚拟化。

libvirt对多种不同的Hypervisor的支持是通过一种基于驱动程序的架构来实现的。libvirt对不同的Hypervisor提供了不同的驱动:对Xen有Xen的驱动,对QEMU/KVM有QEMU驱动,对VMware有VMware驱动。在libvirt源代码中,可以很容易找到qemu_driver.c、xen_driver.c、xenapi_driver.c、VMware_driver.c、vbox_driver.c这样的驱动程序源代码文件。

libvirt作为中间适配层,可以让底层Hypervisor对上层用户空间的管理工具是完全透明的,因为libvirt屏蔽了底层各种Hypervisor的细节,为上层管理工具提供了一个统一的、较稳定的接口(API)。通过libvirt,一些用户空间管理工具可以管理各种不同的Hypervisor和上面运行的客户机,它们之间基本的交互框架如图:

Qemu Libvirt

比如,在example.com节点上运行了libvirtd,而且允许SSH访问,在远程的某台管理机器上就可以用如下的命令行来连接到example.com上,从而管理其上的域。

virsh -c qemu+ssh://root@example.com/system

以RHEL 7.3为例,libvirt相关的配置文件都在/etc/libvirt/目录之中,如下:

[root@foundation0 ~]# ll /etc/libvirt/
total 72
-rw-r--r--. 1 root root   450 Jun 21  2017 libvirt-admin.conf
-rw-r--r--. 1 root root   547 Jun 21  2017 libvirt.conf
-rw-r--r--. 1 root root 15786 Jun 21  2017 libvirtd.conf
-rw-r--r--. 1 root root  1175 Jun 21  2017 lxc.conf
drwx------. 2 root root  4096 Nov  9 18:10 nwfilter
drwx------. 4 root root   197 Nov  9 18:12 qemu
-rw-r--r--. 1 root root 26773 Jun 21  2017 qemu.conf
-rw-r--r--. 1 root root  2169 Jun 21  2017 qemu-lockd.conf
drwxr-xr-x. 3 root root    42 Nov 28 11:18 storage
-rw-r--r--. 1 root root  2134 Jun 21  2017 virtlockd.conf
-rw-r--r--. 1 root root  1997 Jun 21  2017 virtlogd.conf

libvirt.conf 文件用于配置一些常用libvirt连接(通常是远程连接)的别名。

libvirtd.conf 是libvirt的守护进程libvirtd的配置文件,被修改后需要让libvirtd重新加载配置文件(或重启libvirtd)才会生效。

qemu.conf 是libvirt对QEMU的驱动的配置文件,包括VNC、SPICE等,以及连接它们时采用的权限认证方式的配置,也包括内存大页、SELinux、Cgroups等相关配置。

qemu 目录下存放的是使用QEMU驱动的域的配置文件。

在默认情况下,libvirtd在监听一个本地的Unix domain socket,而没有监听基于网络的TCP/IP socket,需要使用“-l或--listen”的命令行参数来开启对libvirtd.conf配置文件中TCP/IP socket的配置。另外,libvirtd守护进程的启动或停止,并不会直接影响正在运行中的客户机。libvirtd在启动或重启完成时,只要客户机的XML配置文件是存在的,libvirtd会自动加载这些客户的配置,获取它们的信息。当然,如果客户机没有基于libvirt格式的XML文件来运行(例如直接使用qemu命令行来启动的客户机),libvirtd则不能自动发现它。

Unix Domain Socket是网络socket的优化,适用于服务端与客户端在同一台机器上的情况。相比网络socket,它可以提高通信效率。


libvirt 的 Python API 的使用

在4.1.1节中已经介绍过,许多种编程语言都提供了libvirt的绑定。Python作为一种在Linux上比较流行的编程语言,也提供了libvirt API的绑定。在使用Python调用libvirt之前,需要安装libvirt-python软件包,或者自行编译和安装libvirt及其Python API。




virsh 常用命令

virsh这个命令行工具使用libvirt API实现了很多命令来管理Hypervisor、节点和域,实现了qemu命令行中的大多数参数和QEMU monitor中的多数命令[1]。这里只能说,virsh实现了对QEMU/KVM中的大多数而不是全部功能的调用,这是和开发模式及流程相关的,libvirt中实现的功能和最新的QEMU/KVM中的功能相比有一定的滞后性。一般来说,一个功能都是先在QEMU/KVM代码中实现,然后再修改libvirt的代码来实现的,最后由virsh这样的用户空间工具添加相应的命令接口去调用libvirt来实现。当然,除了QEMU/KVM以外,libvirt和virsh还实现了对Xen、VMware等其他Hypervisor的支持,如果考虑到这个因素,virsh等工具中有部分功能也可能是QEMU/KVM中本身就没有实现的。

Qemu Libvirt

Qemu Libvirt

从 console 中退出虚拟机:

快捷键: ctrl+]

彻底删除虚拟机

#解除标记

virsh undefine 虚拟机名称

然后删除虚拟机存储所在的位置

宿主机和 Hypervisor 的管理命令

一旦建立有特权的连接,virsh也可以对宿主机和Hypervisor进行管理,主要是对宿主机和Hypervisor信息的查询。

Qemu Libvirt

网络的管理命令

virsh可以对节点上的网络接口和分配给域的虚拟网络进行管理。

Qemu Libvirt

查看宿主机的网卡配置:

[root@foundation0 ~]# virsh iface-list
 Name                 State      MAC Address
---------------------------------------------------
 br0                  active     00:0c:29:72:8d:d1
 lo                   active     00:00:00:00:00:00

[root@foundation0 ~]# virsh iface-edit br0
<interface type='bridge' name='br0'>
  <start mode='onboot'/>
  <protocol family='ipv4'>
    <ip address='172.25.254.250' prefix='24'/>
    <ip address='172.25.0.250' prefix='24'/>
  </protocol>
  <bridge stp='off' delay='0'>
    <interface type='ethernet' name='ens33'>
    </interface>
  </bridge>
</interface>



存储池和存储卷的管理命令

virsh也可以对节点上的存储池和存储卷进行管理。

Qemu Libvirt

上一篇:WSL2之QEMU安装与使用


下一篇:FreeNOS之Qemu(一)