A. virsh命令和调用libvirt api有什么区别
libvirt是用来管理虚拟机或虚拟化功能的软件集合,主要包括:libvirt API,libvirtd进程和virsh工具集三部分。最初的目的是为不同的hypervisor提供统一的管理接口。
The goal of libvirt: to provide a common and stable layer sufficient to securely manage domains on a node, possibly remote。
1. Libvirt API
不同版本的API具体参见:http://libvirt.org/hvsupport.html,主要为不同的虚拟化技术方案对外提供统一的接口,其设计思想为:
(1)isolation from HV API changes - 隔离底层硬件虚拟化接口对上层的影响
(2)portable across HV - 支持多种os,如linux,windows,solairs等
(3)rapid application development - 提供封装的API,加快软件开发的过程
(4)TLS, SASL, SSH, PolicyKit - 提供各种加密协议,保证了上层应用对下层资源的安全访问
通过封装最原始的C库,实现了多种编程语言的接口:Perl, python, OCaml, Java, Ruby,C#, Php,并对目前在应用层编程中常用的协议进行封装,形成不同的协议库,方便在应用层编程中调用,目前主要支持:
(1)Mapping to CIM/DMTF: libvirt-cim
公共信息模型CIM,是一个与具体实现无关的、用于描述管理信息的概念性模型。
(2)Mapping to AMQP/QMF: libvirt-qmf
AMQP是一个提供统一消息服务的应用层标准协议,是一种二进制协议,提供客户端应用与消息中间件之间异步、安全、高效地交互。
基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同开发语言等条件的限制。
(3)Mapping to SNMP: libvirt-snmp
该库使得libvirt具备SNMP的功能,开发人员能够通过SNMP来监控和设置每个node上不同domain的信息
(4)Mapping to GObject: libvirt-glib
2. daemon进程(libvirtd )
该后台进程主要实现以下功能:
(1)远程代理
所有remote client发送来的命令,由该进程监测执行
(2)本地环境初始化
libvirt服务的启停,用户connection的响应等
(3)根据环境注册各种Driver(qemu, xen, storage…)的实现
不同虚拟化技术以Driver的形式实现,由于libvirt对外提供的是统一的接口,所以各个Driver就是实现这些接口, 即将Driver注册到libvirt中
3. virsh 工具集
即将libvirt API封装,以Command Line Interface提供的对外接口。
4. libvirt层次体系结构
为了便于理解,将libvirt分为三个层次结构,具体参见下图。
参照上图,来理一下通过virsh命令或接口创建虚拟机实例的代码执行路径:
(1)virsh命令或API接口c创建虚拟机 -- 接口层
virsh create vm.xml 或者 virDomainPtr virDomainCreateXML (virConnectPtr conn, const char * xmlDesc, unsigned int flags)
(2)调用libvirt提供的统一接口 -- 抽象驱动层
conn->driver->domainCreateXML(conn, xmlDesc, flags); //此处的domainCreateXML即抽象的统一接口,这里并不需要关心底层的driver是kvm,还是xen
(3)调用底层的相应虚拟化技术的接口 -- 具体驱动层
domainCreateXML = qemuDomainCreateXML; //如果driver=qemu,那么此处即调用的qemu注册到抽象驱动层上的函数qemuDomainCreateXML
(4)拼装shell命令,并执行
以qemu为例,qemuDomainCreateXML首先会拼装一条创建虚拟机的命令,比如qemu -hda disk.img,然后创建一个新的线程来执行
回过头来思考,libvirt通过4步,将最底层的直接在shell中输入命令来完成的操作进行了抽象封装,给应用程序开发人员提供了统一的,易用的接口。
5. 抽象驱动层
目前,libvirt以下几种类型的抽象驱动,每一种类型的驱动代表某以功能模块的抽象封装:
(1)虚拟化驱动(virDriverPtr)
(2)虚拟网络驱动(virNetworkDriverPtr)
(3)物理网卡驱(virInterfaceDriverPtr)
(4)存储驱动(virStorageDriverPtr)
(5)监控驱动(virDeviceMonitorPtr)
(6)安全驱动(virSecretDriverPtr)
(7)过滤驱动(virNWFilterDriverPtr)
(8)状态驱动(virStateDriverPtr)
B. openstack的虚拟化技术有个kvm,什么是kvm什么qemu,libvirt
在所谓的kvm技术中,应用到的其实有2个东西:qemu+kvm
kvm负责cpu虚拟化+内存虚拟化,实现了cpu和内存的虚拟化,但kvm不能模拟其他设备;
qemu是模拟IO设备(网卡,磁盘),kvm加上qemu之后就能实现真正意义上服务器虚拟化。
因为用到了上面两个东西,所以一般都称之为qemu-kvm。
libvirt则是调用kvm虚拟化技术的接口用于管理的,用libvirt管理方便,直接用qemu-kvm的接口太繁琐
C. 如何使用KVM libvirt命令管理虚拟机
在Ubuntu系统上安装KVM组件服务
使用如下命令:
$ sudo apt-get install kvm qemu
$ sudo apt-get install virtinst python-libvirt virt-viewer virt-manager
安装桥接网卡
$ sudo apt-get install bridge-utils
使用qemu命令创建虚拟机的虚拟磁盘文件
使用如下命令创建一个10G的磁盘空间用于安装和允许虚拟机
$qemu-img create -f qcow2 lion.disk 10G
创建虚拟机Domain配置文件用于创建虚拟机实例
使用vim命令创建lionServer.xml配置文件,输入如下内容:
<domain type='kvm' id='1'>
<name>lion</name>
<memory unit='KiB'>1048576</memory>
<currentMemory unit='KiB'>1048576</currentMemory>
<vcpu placement='static'>1</vcpu>
<os>
<type arch='x86_64' machine='pc-i440fx-xenial'>hvm</type>
<boot dev='cdrom'/>
</os>
<features>
<acpi/>
<apic/>
<pae/>
</features>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>restart</on_crash>
<devices>
<emulator>/usr/bin/qemu-system-x86_64</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/home/hxb/image/lion.disk'/>
<backingStore/>
<target dev='vda' bus='virtio'/>
<alias name='virtio-disk0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
</disk>
<disk type='file' device='cdrom'>
<source file='/home/hxb/iso/ubuntu.iso' />
<target dev='hdb' bus='ide'/>
</disk>
<controller type='usb' index='0'>
<alias name='usb'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
</controller>
<controller type='pci' index='0' model='pci-root'>
<alias name='pci.0'/>
</controller>
<controller type='ide' index='0'>
<alias name='ide'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
</controller>
<interface type='network'>
<mac address='52:54:00:7d:4d:d1'/>
<source network='br1' bridge='virbr1'/>
<target dev='vnet0'/>
<model type='virtio'/>
<alias name='net0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
<serial type='pty'>
<source path='/dev/pts/3'/>
<target port='0'/>
<alias name='serial0'/>
</serial>
<console type='pty' tty='/dev/pts/3'>
<source path='/dev/pts/3'/>
<target type='serial' port='0'/>
<alias name='serial0'/>
</console>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
<graphics type='vnc' port='5900' autoport='yes' listen='0.0.0.0'>
<listen type='address' address='0.0.0.0'/>
</graphics>
<sound model='ich6'>
<alias name='sound0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</sound>
<video>
<model type='cirrus' vram='16384' heads='1'/>
<alias name='video0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</video>
<memballoon model='virtio'>
<alias name='balloon0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
</memballoon>
</devices>
<seclabel type='dynamic' model='apparmor' relabel='yes'>
<label>libvirt-d828c766-9826-99a9-f495-67a3a55a5643</label>
<imagelabel>libvirt-d828c766-9826-99a9-f495-67a3a55a5643</imagelabel>
</seclabel>
</domain>
使用virsh命令创建新的虚拟机实例
使用如下命令:
定义虚拟机domain,
$virsh define lionServer.xml
启动虚拟机lion
$virsh start lion
显示系统中的虚拟机列表
$virsh list
在创建的虚拟机实例lion上安装操作系统
打开VirtualManager工具,打开虚拟机管理工具,选择lion虚拟机进行连接。
连接虚拟机lion成功后,进行系统的安装。
完成虚拟机lion的系统安装后,需要进行虚拟机domain的配置修改,将系统引导从cdrom切换到硬盘hd,重启虚拟机后,既可以正常登陆lion虚拟机。
使用如下命令进行boot配置修改:
$ virsh edit lion
...
<os>
<type arch='x86_64' machine='pc-i440fx-xenial'>hvm</type>
<boot dev='cdrom'/>
</os>
...
将 <boot dev='cdrom'/> 修改为 <boot dev='hd'/>
如何删除创建的lion虚拟机
1)关闭lion虚拟机
$ virsh shutdown lion
2) 删除lion虚拟机
$virsh destroy lion
3) 取消lion domain的定义
$virsh undefine lion