2. KVM基础

kvm简绍

KVM 全称是 基于内核的虚拟机(Kernel-basedVirtual Machine),它是一个 Linux 的一个内核模块,该内核模块使得 Linux 变成了一个 Hypervisor:

  • 它由 Quramnet 开发,该公司于 2008年被 Red Hat 收购。

  • 它支持 x86 (32 and 64 位), s390, Powerpc 等 CPU。

  • 它从 Linux 2.6.20 起就作为一模块被包含在 Linux 内核中。

  • 它需要支持虚拟化扩展的 CPU。

  • 它是完全开源的。

(1)KVM特性

嵌入到Linux正式Kernel(提高兼容性),代码级资源调用(提高性能),虚拟机就是一个进程(内存易于管理)

(2)KVM虚拟化架构

1.20

(3)KVM CPU性能优化

  • 一个 KVM 虚机即一个 Linux qemu-kvm 进程,与其他Linux 进程一样被Linux 进程调度器调度。

  • KVM 虚机包括虚拟内存、虚拟CPU和虚机 I/O设备,其中,内存和 CPU 的虚拟化由 KVM 内核模块负责实现,I/O 设备的虚拟化由 QEMU 负责实现。

  • KVM户机系统的内存是 qumu-kvm 进程的地址空间的一部分。

  • KVM 虚机的 vCPU 作为 线程运行在 qemu-kvm 进程的上下文中。

    CPU虚拟化

1.21

KVM安装

检查主机是否支持虚拟化

打开您的虚拟机的虚拟化引擎

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

命令结果大于0表示cpu支持虚拟化

1.23

最好关闭防火墙和关闭selinux

systemctl stop firewalld
systemctl disable firewalld
vim /etc/selinux/config
将enforcing改为disabled

配置本地yum源

替换CentOS默认源,默认生产环境上不了外网,所以你得想办法用自己的内部Yum源,如果没有,需要搭建一个。让系统上网,然后运行下面命令:

cd /etc/yum.repos.d
rm -rf *
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

在我的实验环境中我已经搭好了本地yum源,在这里我直接使用本地yum源,下面是我的yum配置文件

1.24

安装kvm以及相应的依赖包

安装依赖包

yum -y groupinstall "Virtualization Host"
yum -y install virt-{install,viewer,manager}

相关组件介绍

【1】libvirt:操作和管理KVM虚机的虚拟化 API,使用 C 语言编写,可以由 Python,Ruby, Perl, PHP, Java 等语言调用。可以操作包括 KVM,vmware,XEN,Hyper-v, LXC 等 Hypervisor。

【2】Virsh:基于 libvirt 的 命令行工具 (CLI)

【3】Virt-Manager:基于 libvirt 的 GUI 工具

kvm内核模块

1.25

配置网卡为桥接模式

cd /etc/sysconfig/network-scripts/
cp ifcfg-eno16777736 ifcfg-br0

我的配置文件

[root@kvm network-scripts]# cat ifcfg-eno16777736
TYPE="Ethernet"
DEVICE="eno16777736"
NAME="eno16777736"
BRIDGE=br0
[root@kvm network-scripts]# cat ifcfg-br0
TYPE=Bridge
NAME=br0
DEVICE=br0
IPADDR=172.31.129.95
NETMASK=255.255.255.0
GATEWAY=172.31.129.254

创建虚拟机硬盘

qemu-img create -f qcow2 /mnt/vm-test/iso/centos-7.2.qcow2 10G
chown qemu:qemu /mnt/vm-test/iso/centos-7.2.qcow2 -R

创建虚拟机

[root@kvm iso]# virt-install --virt-type kvm --name centos-7.2 --ram 512 \ # name 是自己取得
> --vcpus 1 \ #指定cpu核数
> --cdrom=CentOS-7-x86_64-DVD-1511.iso \ #指定镜像
> --disk centos-7.2.qcow2,format=qcow2 \ #disk参数为上面创建的磁盘
> --network network=default \ #网络设置为默认网络(NAT)
> --graphics vnc,listen=0.0.0.0 --noautoconsole \ #运行所有网段远程,远程方式采用vnc
> --os-type=linux --os-variant=rhel7 #指定系统类型

桥接网卡位置

virt-install --virt-type kvm --name centos-7.2 --ram 512 --vcpus 1 --cdrom=CentOS-7-x86_64-DVD-1511.iso --disk centos7.2.qcow2,format=qcow2 --network bridge=virbr0 --vnc --vncport=5910 --vnclisten=0.0.0.0 --os-type=linux --os-variant=rhel7

远程虚拟机

查看端口:netstat –natp

1.26

在vnc输入172.31.129.95:5900即可远程虚拟机

KVM命令介绍

virsh

virsh:虚拟化交互式终端

1.27
  • virsh list # 显示本地活动虚拟机

  • virsh start kvm_name # 启动非活动虚拟机, kvm_name为你的虚拟机名字

  • virsh create kvm_name.xml # 创建虚拟机(创建后,虚拟机立即执行,成为活动主机)

  • virsh suspend kvm_name # 暂停虚拟机

  • virsh resume kvm_name # 启动暂停的虚拟机

  • virsh shutdown kvm_name # 正常关闭虚拟机

  • virsh destroy kvm_name # 强制关闭虚拟机

  • virsh dominfo kvm_name # 显示虚拟机的基本信息

  • virsh dumpxml kvm_name # 显示虚拟机的当前配置文件

  • virsh setmem kvm_name 51200 # 给不活动虚拟机设置内存大小

  • virsh setvcpus kvm_name 4 # 给不活动虚拟机设置cpu个数

  • virsh edit kvm_name # 编辑配置文件(一般用在刚定义完VM)

    虚拟机配置文件路径:/etc/libvirt/qemu

虚拟化vcpu操作

yum -y install numactl
  • nodeinfo #查看节点配置信息

  • dominfo #查看虚拟机节点配置信息

  • numactl --hardware #查看节点硬件信息

  • numastat –c qemu-kvm

  • virsh

    • vcpuinfo kvm_name #查看运行在那个逻辑cpu上

    • emulatorpin kvm_name #查看可以调度逻辑cpu

    • emulatorpin kvm_name 1-2 –live #限制可以调度逻辑cpu(重启生效)

    1.28

虚拟机cpu优化

vcpu单独强制绑定

  • vcpupin kvm_name 0 1

  • vcpupin kvm_name 1 2

  • vcpuinfo

  • dumpxml kvm_name

命令使用参考文章: CPU性能监控之二-----Numa架构下进程与CPU绑定

numa总结

安装acpid

默认情况下virsh工具不能对linux虚拟机进行关机操作,linux操作系统需要开启与启动acpid服务。在安装KVM linux虚拟机必须配置此服务。

yum install -y acpid
systemctl enable acpid

克隆虚拟机

(1)根据模板文件修改

  • 进入对应目录拷贝模板文件

cd /etc/libvirt/qemu
cp centos-7.2.xml clone-1.xml
  • 修改虚拟名称

  • 删除uuid

1.29
  • 指定disk

1.30
  • 删除mac

1.31
  • 修改vnc远程允许端口(可选)

如果您上面选择桥接模式创建虚拟机且指定了端口5910,请您把5910改为5911,这样可以避免与centos7.3的端口冲突

(2)复制qcow2文件

cp centos-7.2.qcow2 clone-1.qcow2

(3)virsh define 模板文件路径

virsh define /etc/libvirt/qemu/clone-1.xml

(4)启动虚拟机

virsh start clone-1

(5)删除克隆的虚拟机

virsh shutdown clone-1
virsh undefine clone-1
rm –rf /mnt/vm-test/clone-1.qcow2

(6)一个小坑

1.32

这一行位置在第86行,修改配置文件时一定要删除,不知道为什么,它会出现在CentOS7.2版本的系统中,而在CentOS7.3版本的系统中不会出现这一行代码!

虚拟机快照snapshot

virsh # snapshot-create-as centos-7.2 kuaizhao #创建虚拟机centos-7.2的快照,快照名字为kuaizhao
Domain snapshot kuaizhao created
virsh # snapshot-list centos-7.2 #显示虚拟机快照的名称
Name Creation Time State
------------------------------------------------------------
kuaizhao 2017-10-17 09:53:49 +0800 shutoff
virsh # snapshot-revert centos-7.2 kuaizhao #恢复快照

添加磁盘

(1)创建磁盘

qemu-img create -f qcow2 /mnt/vm-test/ios/testadd.qcow2 10G

(2)修改配置文件

virsh edit centos-7.2

添加以下内容并保存配置文件

<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/mnt/vm-test/ios/testadd.qcow2'/>
<target dev='vdb' bus='virtio'/>
</disk>
virsh create /etc/libvirt/qemu/centos-7.2.xml
virsh destroy centos-7.2
virsh start centos-7.2

重启后进入虚拟机查看

1.33

(3)直接扩展qcow2磁盘

qcow2格式的好处就是支持直接扩展,下面我们关闭虚拟机直接对磁盘进行扩容

# qemu-img resize clone-3.qcow2 +10G
1.35-1

经过前后对比,磁盘大小已由20G扩展到30G,已扩展,qcow2磁盘格式必须采用此方式进行扩展!

kvm虚拟机的网络模式

(1)nat网络模式

1.34

(2)桥接模式

1.35

(3)添加NAT网络

定义一个虚拟网络

virsh net-define /usr/share/libvirt/networks/default.xml

添加内容

<network>
<name>default</name>
<bridge name="virbr0" />
<forward/>
<ip address="192.168.122.1" netmask="255.255.255.0">
<dhcp>
<range start="192.168.122.2" end="192.168.122.254" />
</dhcp>
</ip>
</network>

设置为自动启动

virsh net-autostart default

查看网络

brctl show

修改/etc/sysctl.conf中参数,允许ip转发

net.ipv4.ip_forward=1

修改虚拟机配置文件

virsh edit centos-7.2

修改网卡链接模式

桥接模式

nat模式

修改完之后,保存退出。

virsh create /etc/libvirt/qemu/centos-7.2.xml
  1. 修改桥接后nat不能上网问题

    默认配置文件:(virsh交互界面)

1.36

将默认配置文件修改为:

vim /etc/libvirt/qemu/networks/default.xml
1.37

然后再执行如下命令

virsh # net-define /etc/libvirt/qemu/networks/default.xml
virsh # net-destroy default
virsh # net-start default