使用Libvirt创建虚拟机

文章目录
  1. 1. libvirt简介
  2. 2. 实验环境
  3. 3. 安装libvirt
  4. 4. qemu创建虚拟机
  5. 5. 创建网络
  6. 6. libvirt创建虚拟机
  7. 7. libvirt配置网络
  8. 8. libvirt配置VNC
  9. 9. 后记
  10. 10. 书签

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和libvirt
apt 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
2
3
virsh --version
virt-manager --version
virt-viewer --version

5、查看网络

1
2
3
ip a
brctl show
virsh net-list

安装完成以后,默认是启用了桥接网络virbr0,IP为192.168.122.1/24。如果没有启用,那么参考ubuntu16.04环境安装KVM进行启用。

6、安装vncserver
apt-get install vnc4server

qemu创建虚拟机

参考嵌套虚拟化—VMware+QEMU/KVMubuntu下使用qemu安装虚拟机并配置桥接网络使用qemu安装虚拟机,进行虚拟机的创建。

1、创建磁盘

1
2
3
mkdir /opt/qemu
cd /opt/qemu
qemu-img create -f qcow2 cirros0.img 5g

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
2
3
Boot failed: could not read the boot disk
No more network devices
No bootable device

参考Play with Libvirt/KVM发现,cirros-0.4.0-x86_64-disk.img本身就是一个磁盘,尴尬。。。

5、启动实例

1
2
3
qemu-system-x86_64 -m 512 -smp 4 \
-drive file=cirros-0.4.0-x86_64-disk.img \
-vnc :1

本地打开vncviewer client,输入ip:5901进行连接,即可看到启动过程。因为没有enable-kvm,所以启动很慢,请耐心等待。

6、查看实例IP
登录cirros,然后查看IP、内存和硬盘

1
2
3
ip add
free -m
df -h


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、设置IP
sudo vi /etc/network/interfaces,eth0的配置修改为:

1
2
3
4
auto eth0
iface eth0 inet static
address 192.168.122.100
netmask 255.255.255.0

然后重启网卡,sudo ifdown eth0sudo ifup eth0。但是,无法ping通192.168.122.1,说明实例的网卡并没有和virbr0进行连接。

创建网络

实例有了,但是还不能连接外部网络。参考访问qemu虚拟机的五种姿势,创建网络,重新启动实例。

1、创建网桥

1
2
brctl add virbr0
ifconfig virbr0 192.168.122.1 net mask 255.255.255.0 up

网桥已经存在,所以这一步不需要了。

2、创建tap接口,并添加到网桥

1
2
3
4
apt install uml-utilities
tunctl -t tap0
ifconfig tap0 0.0.0.0 up
brctl addif virbr0 tap0

3、让实例使用tap0作为网络设备启动

1
2
3
4
5
qemu-system-x86_64 -m 512 -smp 4 \
-drive file=cirros-0.4.0-x86_64-disk.img \
-netdev tap,id=tapnet,ifname=tap0,script=no \
-device rtl8139,netdev=tapnet \
-vnc :1

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 port
virsh 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
2
3
4
5
virsh destroy cirros
rm /etc/libvirt/qemu/cirros.xml
virsh
# undefine cirros
# quit

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
2
3
4
5
6
7
8
9
10
11
12
13
14
<network>
<name>default</name>
<uuid>cc522162-7487-41dc-82ee-63df0df4003e</uuid>
<forward mode='nat'/>
<bridge name='virbr0' stp='on' delay='0'/>
<mac address='52:54:00:d6:65:fb'/>
<ip address='192.168.122.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.122.2' end='192.168.122.254'/>
<!--line 10, add-->
<host mac='52:54:00:7f:0e:77' name='cirros' ip='192.168.122.100'/>
</dhcp>
</ip>
</network>

以上,给cirros实例配置了静态IP为192.168.122.100。

4、重启网络

1
2
3
4
virsh net-destroy default
virsh net-start default
#virsh --connect qemu:///system net-destroy default
#virsh --connect qemu:///system net-start default

5、重启实例

1
2
virsh shutdown cirros
virsh start cirros

libvirt配置VNC

某些情况下,无法通过IP访问实例,这时就需要配置vnc,参考kvm虚拟机VNC的配置

1、配置vnc
virsh edit cirros,找到

1
<graphics type='vnc' port='-1' autoport='yes'/>

修改为:

1
2
3
<graphics type='vnc' port='5901' autoport='no' listen='0.0.0.0'>       
<listen type='address' address='0.0.0.0'/>
</graphics>

2、重启实例

1
2
virsh shutdown cirros
virsh start 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
然后重启系统。

书签

linux初学者-网络桥接篇

Documentation/Networking