一、KVM虚拟化介绍
1、虚拟化
指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互相不影响,从而显著提高计算机的工作效率。
2、kvm
KVM(Kernel-based Virtual Machine)基于内核的虚拟机
虚拟化使用软件的方法重新定义划分 IT 资源,可以实现 IT 资源的动态分配、灵活调度、跨域共享,提高 IT 资源利用率,使 IT 资源能够真正成为社会基础设施,服务于各行各业中灵活多变的应用需求。
KVM 是基于虚拟化扩展(Intel VT 或者 AMD-V)的 X86 硬件的开源的 Linux 原生的全虚拟化解决方案,KVM 中,虚拟机被实现为常规的 Linux 进程,由标准 Linux 调度程序进行调度;虚机的每个虚拟 CPU 被实现为一个常规的 Linux 线程。这使得 KMV 能够使用 Linux 内核的已有功能。
KVM使用QEMU进行硬件的模拟,使用libvirt作为管理接口
二、KVM安装虚拟机
1、软件及服务
virt-install 安装虚拟机软件
virt-manager 图形化界面管理
libvirt* 为虚拟化做统一接口
2、安装过程
实验环境
server 192.168.200.12
[root@server ~]# egrep "svm|vmx" /proc/cpuinfo
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch ssbd ibrs ibpb stibp tpr_shadow vnmi ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid mpx rdseed adx smap clflushopt xsaveopt xsavec arat spec_ctrl intel_stibp flush_l1d arch_capabilities
[root@server ~]# lsmod | grep kvm
kvm_intel 183621 0
kvm 586948 1 kvm_intel
irqbypass 13503 1 kvm
检查cpu对虚拟化的是否支持,内核是否加载虚拟化模块
如果没有,在虚拟机设置处理器中打开虚拟化引擎image.png
[root@server ~]# yum -y install virt-install virt-manager libvirt*
[root@server ~]# systemctl start libvirtd
[root@server ~]# systemctl enable libvirtd
[root@server ~]# systemctl status libvirtd
● libvirtd.service - Virtualization daemon
Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2020-02-07 17:28:24 CST; 10min ago
Docs: man:libvirtd(8)
https://libvirt.org
Main PID: 23156 (libvirtd)
CGroup: /system.slice/libvirtd.service
├─10291 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/...
├─10292 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/...
└─23156 /usr/sbin/libvirtd
Feb 07 17:28:24 server systemd[1]: Starting Virtualization daemon...
Feb 07 17:28:24 server systemd[1]: Started Virtualization daemon.
Feb 07 17:28:25 server dnsmasq[10291]: read /etc/hosts - 2 addresses
Feb 07 17:28:25 server dnsmasq[10291]: read /var/lib/libvirt/dnsmasq/defa...s
Feb 07 17:28:25 server dnsmasq-dhcp[10291]: read /var/lib/libvirt/dnsmasq...e
Hint: Some lines were ellipsized, use -l to show in full.
安装软件,打开服务
[root@server ~]# qemu-img create -f qcow2 /var/lib/libvirt/images/test1.qcow2 5G
Formatting '/var/lib/libvirt/images/test1.qcow2', fmt=qcow2 size=5368709120 encryption=off cluster_size=65536 lazy_refcounts=off
[root@server images]# rz
rz waiting to receive.
zmodem trl+C ȡ
100% 940032 KB 23500 KB/s 00:00:40 0 Errors-1810.iso...
[root@server images]# ls
CentOS-7-x86_64-Minimal-1810.iso test1.qcow2
[root@server images]# virt-install \
> --virt-type kvm \
> --name test1 \
> --vcpus=1 \
> --ram 1024 \
> --cdrom=/var/lib/libvirt/images/CentOS-7-x86_64-Minimal-1810.iso \
> --disk path=/var/lib/libvirt/images/test1.qcow2 \
> --network network=default \
> --graphics vnc,listen=0.0.0.0,port=5901
创建磁盘,上传镜像,创建虚拟机
virt-install
--virt-type kvm 虚拟化类型kvm
--name test1 虚拟机名字
--vcpus=1 虚拟机cpu
--ram 1024 虚拟机内存
--cdrom=/var/lib/libvirt/images/CentOS-7-x86_64-Minimal-1810.iso 虚拟机镜像路径
--disk path=/var/lib/libvirt/images/test1.qcow2 虚拟机磁盘路径
--network network=default 虚拟机网络,默认为NAT
--graphics vnc,listen=0.0.0.0,port=5901 vnc管理监听地址与端口
三、KVM管理虚拟机
1、libvirtd
Libvirtd是目前使用最广泛的对kvm虚拟机进行管理的工具和api。Libvirtd是一个Domain进程可以被本地virsh调用,也可以被远端的virsh调用,libvirtd调用kvm-qemu控制虚拟机。
libvirtd由几个不同的部分组成,其中包括应用程序编程接口(API)库,一个守护进程(libvirtd)和一个默认的命令行工具(virsh),libvirtd守护进程负责对虚拟机的管理,因此要确保这个进程的运行。
2、virt-manager管理
virt-manager是一套强大的虚拟机桌面管理工具,提供了对虚拟机的开机,挂起,重启,网络,内存,CPU,磁盘,迁移等
[root@server images]# virt-manager
image.png
3、virsh管理
virsh是由libvirt提供的管理工具,配合虚拟机xml文件基本可以完成对虚拟机的所有操作
利用virsh实现跨主机管理
实验环境 192.168.200.13
[root@localhost ~]# vi /etc/libvirt/libvirt.conf
uri_aliases = [
"kvm=qemu+ssh://192.168.200.12/system",
]
[root@localhost ~]# ssh-keygen
[root@localhost ~]# ssh-copy-id root@192.168.200.12
[root@localhost ~]# virsh -c kvm
Welcome to virsh, the virtualization interactive terminal.
Type: 'help' for help with commands
'quit' to quit
virsh #
4、vnc管理
VNC (Virtual Network Console)是虚拟网络控制台的缩写。它是一款优秀的远程控制工具软件,由著名的 AT&T的欧洲研究实验室开发的。VNC 是在基于UNIX和Linux操作系统的免费的开源软件,远程控制能力强大,高效实用,其性能可以和Windows和MAC中的任何远程控制软件媲美。
[root@server images]# vncviewer :5901
5、console管理
通过console口在宿主机直接接管虚拟机
[root@server ~]# vi /etc/default/grub
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb q
uiet console=ttyS0"
[root@server ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
[root@server ~]# reboot
[root@server ~]# virsh start test1
[root@server ~]# virsh console test1
6、xml文件
每一个虚拟机都有一个以.xml结尾定义文件,其中定义了所有虚拟机的虚拟化配置,默认路径为/etc/libvirt/qemu/xxx.xml
四、KVM CPU
1、基本概念
- 对于虚拟化而言,一个vm在宿主机上就是一个进程
- 而虚拟机的cpu就是这个进程下的一个线程
2、定义CPU
<vcpu placement='static'>1</vcpu> 最大cpu为1,当前cpu为1
<vcpu placement='static' current='1'>3</vcpu> 最大cpu为3,当前cpu为1
3、CPU增加
将虚拟机一个cpu增加至三个
[root@server ~]# vim /etc/libvirt/qemu/test1.xml
<vcpu placement='static' current='3'>4</vcpu>
[root@server ~]# virsh destroy test1
Domain test1 destroyed
[root@server ~]# systemctl restart libvirtd
[root@server ~]# virsh start test1
Domain test1 started
验证
[root@server ~]# ssh root@192.168.122.131 "cat /proc/cpuinfo | grep processor"
root@192.168.122.131's password:
processor : 0
processor : 1
processor : 2
4、CPU模式
- 默认 默认为在虚拟机性能最好的cpu
- host-passthrougt 具有和宿主机相同的cpu,为了实现虚拟化嵌套
- host-model 和宿主机最接近的cpu
五、KVM MEM
1、基础概念
host physical memory 是服务器的cpu,最真实的cpu
guest physical memory 是宿主机的cpu
guest virtual memory 是虚拟机的cpu
2、定义MEN
<memory unit='KiB'>4194304</memory> 最大cpu为4G
<currentMemory unit='KiB'>1048576</currentMemory> 当前cpu为1G
3、balloon
KVM的内存气球技术使得可以在虚拟机中按照需要调整的内存大小,提升内存的利用率。使用的时候,默认情况是需要安装virt balloon的驱动,内核开启CONFIG_VIRTIO_BALLOON。CentOS7默认已经开启了此选项,并且也安装了virtballoon驱动。
查看当前气球大小
[root@server ~]# virsh qemu-monitor-command test1 --hmp --cmd info balloon
balloon: actual=1024
增加气球容量
virsh qemu-monitor-command test1 --hmp --cmd balloon 2048
验证
[root@server ~]# ssh root@192.168.122.131 "free -m"
root@192.168.122.131's password:
total used free shared buff/cache available
Mem: 1741 122 1424 8 194 1385
Swap: 511 0 511
4、内存增加
将1G内存增加至3G
[root@server ~]# vim /etc/libvirt/qemu/test1.xml
<memory unit='KiB'>4194304</memory>
<currentMemory unit='KiB'>3145728</currentMemory>
[root@server ~]# virsh destroy test1
Domain test1 destroyed
[root@server ~]# systemctl restart libvirtd
[root@server ~]# virsh start test1
Domain test1 started
验证
[root@server ~]# ssh root@192.168.122.131 "free -m"
root@192.168.122.131's password:
total used free shared buff/cache available
Mem: 2765 115 2456 8 192 2417
Swap: 511 0 511
5、内存超分配
- 内存置换
- 内存共享
- 内存气泡
六、KVM 存储
1、概念
- 存储池:为vm提供磁盘的存储空间
- 存储卷:虚拟机磁盘
2、类型
- 文件系统
-
块设备
image.png
3、创建池(文件系统)
根据模板文件修改池定义文件,创建池
[root@server ~]# virsh pool-list
Name State Autostart
-------------------------------------------11
images active yes
[root@server ~]# virsh pool-dumpxml images > /root/pool_xml
[root@server ~]# vim pool_xml
<pool type='dir'>
<name>pool</name>
<target>
<path>/pool/</path>
<permissions>
<mode>0711</mode>
<owner>0</owner>
<group>0</group>
<label>system_u:object_r:virt_image_t:s0</label>
</permissions>
</target>
</pool>
[root@server ~]# mkdir /pool/
[root@server ~]# virsh pool-define /root/pool_xml
Pool pool defined from /root/pool_xml
[root@server ~]# virsh pool-list --all
Name State Autostart
-------------------------------------------
images active yes
pool inactive no
[root@server ~]# virsh pool-start pool
Pool pool started
[root@server ~]# virsh pool-autostart pool
Pool pool marked as autostarted
[root@server ~]# virsh pool-list
Name State Autostart
-------------------------------------------
images active yes
pool active yes
验证
[root@server pool]# qemu-img create -f qcow2 local.qcow2 2G
Formatting 'local.qcow2', fmt=qcow2 size=2147483648 encryption=off cluster_size=65536 lazy_refcounts=off
[root@server pool]# virsh attach-disk test1 /pool/local.qcow2 vdb --subdriver=qcow2
Disk attached successfully
[root@server ~]# virsh domblklist test1
Target Source
------------------------------------------------
vda /var/lib/libvirt/images/test1.qcow2
vdb /pool/local.qcow2
virsh detach-disk test1 vdc 移除磁盘
virsh detach-disk test1 vdc --config 移除磁盘配置文件
4、后端存储和前端存储
这里的后端存储并不是块设备或者文件系统提供虚拟机持续化的存储。而是依靠装有系统的磁盘来创建虚拟机。这个虚拟机的磁盘文件被称为前端存储,装有系统的磁盘被称为后端存储。前端存储依靠后端存储,相当于创建了一个快照软链接,在创建虚拟机的时候使用后端存储做只读文件。运用这种方式可以很快的创建虚拟机。
[root@server images]# qemu-img create -f qcow2 -b test1.qcow2 vm1.qcow2
Formatting 'vm1.qcow2', fmt=qcow2 size=5368709120 backing_file='test1.qcow2' encryption=off cluster_size=65536 lazy_refcounts=off
使用vm1.qcow2创建虚拟机相当于链接快照,完全依赖于test1.qcow2这个装有系统的磁盘
5,磁盘格式转换
将qcow2的格式转发为vmdk
[root@server images]# qemu-img create -f qcow2 test.qcow2 1G
Formatting 'test.qcow2', fmt=qcow2 size=1073741824 encryption=off cluster_size=65536 lazy_refcounts=off
[root@server images]# qemu-img convert -O vmdk -f qcow2 test.qcow2 test.vmdk
检查
[root@server images]# qemu-img info test.vmdk
image: test.vmdk
file format: vmdk
virtual size: 1.0G (1073741824 bytes)
disk size: 12K
cluster_size: 65536
Format specific information:
cid: 1293804866
parent cid: 4294967295
create type: monolithicSparse
extents:
[0]:
virtual size: 1073741824
filename: test.vmdk
cluster size: 65536
format:
[root@server images]# qemu-img check test.vmdk
No errors were found on the image.
七、kvm网络
1、bridge
linux bridge
创建linuxbridge br0
[root@server ~]# cd /etc/sysconfig/network-scripts/
[root@server network-scripts]# cp ifcfg-ens33 ifcfg-br0
[root@server network-scripts]# vim ifcfg-br0
TYPE=Bridge
BOOTPROTO=none
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.200.12
NETMASK=255.255.255.0
GATEWAY=192.168.200.1
DNS1=114.114.114.114
[root@server network-scripts]# vim ifcfg-ens33
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
NAME=ens33
BRIDGE=br0
[root@server ~]# systemctl restart network
[root@server ~]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000c29c90241 no ens33
virbr0 8000.525400ba4019 yes virbr0-nic
vnet0
验证
[root@server images]# vim boot
virt-install --virt-type kvm --name test2 --vcpus=1 --ram 1024 --cdrom=/var/lib/libvirt
/images/CentOS-7-x86_64-Minimal-1810.iso --disk path=/var/lib/libvirt/images/test2.qcow
2 --network bridge=br0 --graphics vnc,listen=0.0.0.0,port=5902
[root@server images]# qemu-img create -f qcow2 test2.qcow2 5G
Formatting 'test2.qcow2', fmt=qcow2 size=5368709120 encryption=off cluster_size=65536 lazy_refcounts=off
[root@server images]# source boot
[root@server images]# virsh domiflist test2
Interface Type Source Model MAC
-------------------------------------------------------
vnet1 bridge br0 virtio 52:54:00:34:5d:62
[root@server images]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000c29c90241 no ens33
vnet1
virbr0 8000.525400ba4019 yes virbr0-nic
vnet0
openvswitch
创建openvswitch br1
[root@server ~]# yum -y install *openvswitch*
[root@server ~]# systemctl start openvswitch && systemctl enable openvswitch
Created symlink from /etc/systemd/system/multi-user.target.wants/openvswitch.service to /usr/lib/systemd/system/openvswitch.service.
[root@server ~]# cd /etc/sysconfig/network-scripts/
[root@server network-scripts]# cp ifcfg-ens33 ifcfg-br1
[root@server network-scripts]# vim ifcfg-br1
TYPE=OVSBridge
BOOTPROTO=none
NAME=br1
DEVICE=br1
ONBOOT=yes
DEVICETYPE=ovs
IPADDR=192.168.200.12
NETMASK=255.255.255.0
GATEWAY=192.168.200.1
DNS1=114.114.114.114
[root@server network-scripts]# vim ifcfg-ens33
TYPE=OVSPort
ONBOOT=yes
NAME=ens33
DEVICE=ens33
DEVICETYPE=ovs
OVS_BRIDGE=br1
[root@server ~]# systemctl restart network
[root@server ~]# ovs-vsctl show
0e9dac98-09c6-411c-b621-5e160e515b16
Bridge "br1"
Port "ens33"
Interface "ens33"
Port "br1"
Interface "br1"
type: internal
ovs_version: "2.5.0"
验证
[root@server ~]# vim /etc/libvirt/qemu/test2.xml
<interface type='bridge'>
<mac address='52:54:00:34:5d:62'/>
<source bridge='br1'/>
<virtualport type='openvswitch' />
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
[root@server ~]# virsh domiflist test2
Interface Type Source Model MAC
-------------------------------------------------------
vnet0 bridge br1 virtio 52:54:00:34:5d:62
[root@server ~]# ovs-vsctl show
0e9dac98-09c6-411c-b621-5e160e515b16
Bridge "br1"
Port "vnet0"
Interface "vnet0"
Port "ens33"
Interface "ens33"
Port "br1"
Interface "br1"
type: internal
ovs_version: "2.5.0"
2、NAT
在kvm中已经默认存在nat网络
[root@server ~]# virsh net-list
Name State Autostart Persistent
----------------------------------------------------------
default active yes yes
[root@server ~]# brctl show
bridge name bridge id STP enabled interfaces
virbr0 8000.525400ba4019 yes virbr0-nic
自定义nat网络 virbr1
[root@server ~]# virsh net-dumpxml default > /root/nat
[root@server ~]# vim nat
<network>
<name>nat</name>
<uuid>bc1b000b-7db8-4def-b272-5100bc5bfc88</uuid>
<forward mode='nat'>
<nat>
<port start='1024' end='65535'/>
</nat>
</forward>
<bridge name='virbr1' stp='on' delay='0'/>
<mac address='52:54:00:ba:40:19'/>
<ip address='192.168.188.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.188.2' end='192.168.188.254'/>
</dhcp>
</ip>
</network>
[root@server ~]# virsh net-define /root/nat
Network nat defined from /root/nat
[root@server ~]# virsh net-list --all
Name State Autostart Persistent
----------------------------------------------------------
default active yes yes
nat inactive no yes
[root@server ~]# virsh net-start nat
Network nat started
[root@server ~]# virsh net-autostart nat
Network nat marked as autostarted
[root@server ~]# brctl show
bridge name bridge id STP enabled interfaces
virbr0 8000.525400ba4019 yes virbr0-nic
virbr1 8000.525400ba4019 yes virbr1-nic
[root@server ~]# ifconfig virbr1
virbr1: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.188.1 netmask 255.255.255.0 broadcast 192.168.188.255
ether 52:54:00:ba:40:19 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
验证
[root@server images]# vim boot
virt-install --virt-type kvm --name test3 --vcpus=1 --ram 1024 --cdrom=/var/lib/libvi
rt/images/CentOS-7-x86_64-Minimal-1810.iso --disk path=/var/lib/libvirt/images/test3.
qcow2 --network network=nat --graphics vnc,listen=0.0.0.0,port=5903
[root@server images]# qemu-img create -f qcow2 test3.qcow2 5G
Formatting 'test3.qcow2', fmt=qcow2 size=5368709120 encryption=off cluster_size=65536 lazy_refcounts=off
[root@server images]# source boot
[root@server ~]# virsh domiflist test2
Interface Type Source Model MAC
-------------------------------------------------------
vnet0 bridge br1 virtio 52:54:00:34:5d:62
[root@server ~]# brctl show
bridge name bridge id STP enabled interfaces
virbr0 8000.525400ba4019 yes virbr0-nic
virbr1 8000.525400ba4019 yes virbr1-nic
vnet1