libvirt简介
参考QEMU和QEMU-KVM的关系,可以了解到,KVM实现对CPU的底层虚拟化和内存的虚拟化,使Linux内核成为虚拟化层,需要x86架构的,支持虚拟化功能的硬件支持(比如Intel VT,AMD-V),是一种全虚拟化架构。QEMU是一套由Fabrice Bellard编写的模拟处理器的自由软件,它是一个完整的可以单独运行的软件,可以独立模拟出整台计算机,包括CPU,内存,IO设备,通过一个特殊的“重编译器”对特定的处理器的二进制代码进行翻译,从而具有了跨平台的通用性。
总的来说,QEMU是一个独立的虚拟化解决方案,并不依赖KVM(它本身自己可以做CPU和内存的模拟,只不过效率较低),而KVM是另一套虚拟化解决方案,对CPU进行虚拟效率较高(采用了硬件辅助虚拟化),但本身不提供其他设备的虚拟化,借用了QEMU的代码进行了定制,所以KVM方案一定要依赖QEMU。
Libvirt是用于管理虚拟化平台的开源的API,后台程序和管理工具。它可以用于管理KVM、Xen、VMware ESX,QEMU和其他虚拟化技术。
Libvirt主要由三个部分组成:API库,一个守护进程libvirtd和一个默认命令行管理工具 virsh。
更多内容参考libvirt 介绍。
实验环境
不能直接在OpenStack环境中实验,因为这样会破坏OpenStack。而且,使用kolla安装的OpenStack,没有virsh命令,libvirt是运行在容器中的。
所以,我们搭建一个新的实验环境:两个节点分别为node0和node1,ubuntu16系统,IP分别为192.168.56.200和192.168.56.201。
安装libvirt
参考Ubuntu16.04安装QEMU与libvirt,安装QEMU和libvirt。
1、切换到root用户sudo -i
2、查看主机是否支持硬件虚拟化egrep -c '(vmx|svm)' /proc/cpuinfo
因为我们的实验本身是在虚拟机中进行的,所以输出0,表示不支持硬件虚拟化。
3、安装QEMU和libvirtapt install -y qemu libvirt-bin bridge-utils virt-manager virt-viewer
如果是支持硬件虚拟化,那么执行安装:apt install -y kvm qemu-kvm libvirt-bin bridge-utils virt-manager virt-viewer
bridge-utils是网桥管理工具。virt-manager是一个通用的桌面管理工具。virt-viewer是一个用于显示虚拟机的图形控制台的最小工具。
4、检查安装
1 | virsh --version |
5、查看网络
1 | ip a |
安装完成以后,默认是启用了桥接网络virbr0,IP为192.168.122.1/24。如果没有启用,那么参考ubuntu16.04环境安装KVM进行启用。
6、安装vncserverapt-get install vnc4server
qemu创建虚拟机
参考嵌套虚拟化—VMware+QEMU/KVM、ubuntu下使用qemu安装虚拟机并配置桥接网络和使用qemu安装虚拟机,进行虚拟机的创建。
1、创建磁盘
1 | mkdir /opt/qemu |
qcow2是qemu最常使用的格式,该格式下可以采用来写时复制技术来优化性能;cirros0.img是磁盘名称;5g是指磁盘文件大小。
2、下载cirros系统
1 | wget http://download.cirros-cloud.net/0.4.0/cirros-0.4.0-x86_64-disk.img |
3、安装cirros到磁盘
1 | qemu-system-x86_64 -hda cirros0.img -boot d -cdrom ./cirros-0.4.0-x86_64-disk.img -m 512 -vnc :1 |
如果是支持硬件虚拟化,那么执行安装:
1 | qemu-system-x86_64 -enable-kvm -hda cirros0.img -boot d -cdrom ./cirros-0.4.0-x86_64-disk.img -m 512 -vnc :1 |
enable-kvm
使用KVM进行加速;hda
指定要使用的虚拟磁盘;boot d
指定启动位置,d表示从光盘启动;cdrom
指定镜像文件;m
指定虚拟机内存大小,默认单位是MB;vnc:1
通过vnc创建虚拟桌面。
出现警告:warning: TCG doesn’t support requested feature: CPUID.01H:ECX.vmx [bit 5]
没啥影响,不去管它。但是另外一个问题来了?怎么进行交互安装?
4、本地打开vncviewer client,输入ip:5901进行连接,即可看到安装过程。
卡在了安装界面:
1 | Boot failed: could not read the boot disk |
参考Play with Libvirt/KVM发现,cirros-0.4.0-x86_64-disk.img本身就是一个磁盘,尴尬。。。
5、启动实例
1 | qemu-system-x86_64 -m 512 -smp 4 \ |
本地打开vncviewer client,输入ip:5901进行连接,即可看到启动过程。因为没有enable-kvm
,所以启动很慢,请耐心等待。
6、查看实例IP
登录cirros,然后查看IP、内存和硬盘
1 | ip add |
IP默认为10.0.2.15;内存512M,是指定的;硬盘默认256M。
当ctrl+c结束qemu-system-x86_64
命令后,实例就被关闭了。再次使用qemu-system-x86_64
命令启动实例,登录实例后使用history
命令,发现之前的命令记录都还在,说明两次使用的都是同一块磁盘,也就是cirros-0.4.0-x86_64-disk.img。
7、设置IPsudo vi /etc/network/interfaces
,eth0的配置修改为:
1 | auto eth0 |
然后重启网卡,sudo ifdown eth0
,sudo ifup eth0
。但是,无法ping通192.168.122.1,说明实例的网卡并没有和virbr0进行连接。
创建网络
实例有了,但是还不能连接外部网络。参考访问qemu虚拟机的五种姿势,创建网络,重新启动实例。
1、创建网桥
1 | brctl add virbr0 |
网桥已经存在,所以这一步不需要了。
2、创建tap接口,并添加到网桥
1 | apt install uml-utilities |
3、让实例使用tap0作为网络设备启动
1 | qemu-system-x86_64 -m 512 -smp 4 \ |
4、测试网络
登录实例,ping 192.168.122.1
,此时网络已经通了。
libvirt创建虚拟机
以上创建虚拟机的过程,其实并没有用到libvirt。下面参考Play with Libvirt/KVM,使用libvirt进行虚拟机的创建。
1、创建虚拟机
1 | virt-install --connect=qemu:///system --name=cirros --ram=512 --vcpus=1 --disk path=cirros-0.4.0-x86_64-disk.img,format=qcow2 --import --network network:default --vnc |
无法使用vncviwer进行连接,然后卡在上图的界面,最后ctrl+c强制结束。配置文件位于/etc/libvirt/qemu/cirros.xml,如果要编辑它,使用virsh edit cirros
命令。
2、显示vnc portvirsh vncdisplay cirros
3、显示实例列表virsh list
4、查看实例详情virsh dominfo cirros
问题来了,怎么访问这个实例呢?最简单的方法是使用virsh console cirros
命令打开控制台,使用ctrl+]
关闭控制台,另外就是通过ssh或者vnc。
5、查看实例网络
参考Find the IP address of a virtual machine,使用arp -an
命令查看实例IP。
然后,挨个ping一下192.168.122.0网段的IP,即可找到实例的IP,本次找到的IP为192.168.122.49。
6、访问实例ssh cirros@192.168.122.49
输入默认密码gocubsgo,即可登录实例。
7、测试网络ping 8.8.8.8 -c3
至此,大功告成,创建实例成功。
8、销毁实例(可选)
1 | virsh destroy cirros |
libvirt配置网络
以上我们知道,可以使用arp -an
命令查看实例IP,如果查看到的IP都不能访问呢?这时就需要我们来手动配置,参考给libvirt创建的虚拟机指定固定IP。
1、查看libvirt网络virsh net-list --all
2、查看实例的网络virsh domiflist cirros
查看到mac地址为52:54:00:7f:0e:77
。
3、修改libvirt网络配置virsh net-edit default
,如下修改:
1 | <network> |
以上,给cirros实例配置了静态IP为192.168.122.100。
4、重启网络
1 | virsh net-destroy default |
5、重启实例
1 | virsh shutdown cirros |
libvirt配置VNC
某些情况下,无法通过IP访问实例,这时就需要配置vnc,参考kvm虚拟机VNC的配置。
1、配置vncvirsh edit cirros
,找到
1 | <graphics type='vnc' port='-1' autoport='yes'/> |
修改为:
1 | <graphics type='vnc' port='5901' autoport='no' listen='0.0.0.0'> |
2、重启实例
1 | virsh shutdown cirros |
3、vnc访问
本地打开vncviewer client,输入ip:5901进行连接。登录实例后,也可以设置静态IP,这样就不用通过virsh net-edit default
修改了。
后记
其实,虚拟机中安装的虚拟机,也可以支持KVM了,参考KVM嵌套虚拟化 – 在虚拟机中创建虚拟机和Nested KVM,开启嵌套虚拟化即可。
1、查看宿主机是否开启嵌套虚拟化cat /sys/module/kvm_intel/parameters/nested
N代表没有开启。
2、开启嵌套虚拟化echo 'options kvm_intel nested=1' >> /etc/modprobe.d/qemu-system-x86.conf
然后重启系统。