一个计算机技术爱好者与学习者

0%

使用Libvirt创建虚拟机

1. 前言

本文中,我们学习一下qemu和libvirt,分别使用它们创建一个cirros虚拟机,并配置好网络。

宿主机node0的系统为ubuntu16,IP为192.168.56.200。

2. qemu和libvirt简介

QEMU是一套由Fabrice Bellard编写的模拟处理器的自由软件,它是一个完整的可以单独运行的软件,可以独立模拟出整台计算机,包括CPU,内存,IO设备,通过一个特殊的“重编译器”对特定的处理器的二进制代码进行翻译,从而具有了跨平台的通用性。

总的来说,QEMU是一个独立的虚拟化解决方案,并不依赖KVM,它本身自己可以做CPU和内存的模拟,只不过效率较低。

KVM(Kernel-based Virtual Machine)是另一套虚拟化解决方案,实现对CPU的底层虚拟化和内存的虚拟化,使Linux内核成为虚拟化层,需要x86架构的、支持虚拟化功能的硬件支持(比如Intel VT,AMD-V),所以虚拟效率较高,是一种全虚拟化架构。

但是KVM本身不提供其他设备的虚拟化,借用了QEMU的代码进行了定制,所以KVM方案一定要依赖QEMU。

而Libvirt是用于管理虚拟化平台的开源的API,后台程序和管理工具。它可以用于管理KVM、Xen、VMware ESX、QEMU和其他虚拟化技术。

Libvirt主要由三个部分组成:API库,一个守护进程libvirtd和一个默认命令行管理工具 virsh。

参考文档:

3. 安装qemu和libvirt

参考Ubuntu16.04安装QEMU与libvirt,安装QEMU和libvirt。

1、切换到root用户

1
2
3
sudo -i
#or
sudo su

2、查看主机是否支持硬件虚拟化

1
egrep -c '(vmx|svm)' /proc/cpuinfo

因为我们的实验本身是在虚拟机中进行的,所以输出0,表示不支持硬件虚拟化。

3、安装QEMU和libvirt

1
2
3
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进行启用。

4. 安装vncserver

安装vncserver,方便远程查看虚拟机的安装过程

1
apt-get install vnc4server

5. qemu创建虚拟机

参考文档:

5.1. 下载系统镜像

下载cirros系统镜像

1
wget http://download.cirros-cloud.net/0.4.0/cirros-0.4.0-x86_64-disk.img

5.2. 创建磁盘

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

参数说明:

  • qcow2是qemu最常使用的磁盘格式,该格式下可以采用写时复制技术来优化性能
  • cirros0.img是磁盘名称
  • 5g是指磁盘文件大小

5.3. 安装系统到磁盘

1
2
3
qemu-system-x86_64 -hda cirros0.img -boot d -cdrom ./cirros-0.4.0-x86_64-disk.img -m 512 -vnc :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]
没啥影响,不去管它。

5.4. 查看安装过程

怎样查看安装过程?怎样在安装时进行配置?答:使用VNC。
本地打开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.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,所以启动很慢,请耐心等待。

5.6. IP配置

1、查看虚拟机IP
登录cirros(默认用户名cirros,密码gocubsgo),然后查看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。

2、设置IP

1
vim /etc/network/interfaces

eth0的配置修改为:

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

3、重启网卡

1
2
ifdown eth0
ifup eth0

但是,无法ping通192.168.122.1,说明虚拟机的网卡并没有和virbr0进行连接。

6. 创建网络

虚拟机有了,但是还不能连接外部网络。我们需要创建网络,重新启动虚拟机,详情参考访问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、登录虚拟机,测试网络

1
ping 192.168.122.1

此时网络已经通了。

7. libvirt创建虚拟机

以上创建虚拟机的过程,其实并没有用到libvirt,下面使用下面使用libvirt进行虚拟机的创建。
参考文档Play with Libvirt/KVM

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

1
virsh vncdisplay cirros

3、显示虚拟机列表

1
virsh list

4、查看虚拟机详情

1
2
virsh dominfo cirros
virsh domstate cirros

问题来了,怎么访问这个虚拟机呢?最简单的方法是使用virsh console cirros命令打开控制台,使用ctrl+]关闭控制台,另外就是通过ssh或者vnc。

5、查看虚拟机网络(mac地址和ip地址)

1
2
virsh dumpxml frontend1 | grep mac
arp -an


本次找到的IP为192.168.122.49

6、访问虚拟机

1
ssh cirros@192.168.122.49


输入默认密码gocubsgo,即可登录虚拟机。

7、测试网络

1
ping 8.8.8.8 -c3


至此,大功告成,创建虚拟机成功。

8. libvirt配置网络

以上我们知道,可以使用arp -an命令查看虚拟机IP,如果查看到的IP都不能访问呢?这时就需要我们来手动配置。
参考文档:

1、查看libvirt网络

1
virsh net-list --all

2、查看虚拟机的网络

1
virsh domiflist cirros

查看到mac地址为52:54:00:7f:0e:77

3、修改libvirt网络配置

1
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

9. libvirt配置VNC

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

1、配置vnc

1
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修改了。

10. 后记

其实,虚拟机中安装的虚拟机,也可以支持KVM了,开启嵌套虚拟化即可。
详情参考:

1、查看宿主机是否开启嵌套虚拟化

1
cat /sys/module/kvm_intel/parameters/nested

N代表没有开启。

2、开启嵌套虚拟化

1
echo 'options kvm_intel nested=1' >> /etc/modprobe.d/qemu-system-x86.conf

然后重启系统。

  • 本文作者: 好好学习的郝
  • 原文链接: https://www.voidking.com/dev-libvirt-create-vm/
  • 版权声明: 本文采用 BY-NC-SA 许可协议,转载请注明出处!源站会即时更新知识点并修正错误,欢迎访问~
  • 微信公众号同步更新,欢迎关注~