2.2 宿主机环境准备

KVM需要宿主机CPU必须支持虚拟化功能,因此如果是在vmware workstation上使用虚拟机做宿主机,那么必须要在虚拟机配置界面的处理器选项中开启虚拟机化功能。

2.2.1 CPU开启虚拟化

2.2.2 验证开启虚拟化

grep -Em 1 "vmx|svm" /proc/cpuinfo

# Intel CPU 对应 vmx
# AMD CPU 对应 svm

验证是否开启虚拟化支持

[root@centos8 ~]# grep -Em 1 "vmx|svm" /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 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl tsc_reliable nonstop_tsc cpuid extd_apicid pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext ssbd ibpb vmmcall fsgsbase bmi1 avx2 smep bmi2 erms invpcid rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves clzero wbnoinvd arat npt svm_lock nrip_save vmcb_clean flushbyasid decodeassists umip pku ospke vaes vpclmulqdq rdpid overflow_recov succor

查看AMD主机的内核模块

[root@centos8 ~]# lscpu |grep svm
Flags:               fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl tsc_reliable nonstop_tsc cpuid extd_apicid pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext ssbd ibpb vmmcall fsgsbase bmi1 avx2 smep bmi2 erms invpcid rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves clzero wbnoinvd arat npt svm_lock nrip_save vmcb_clean flushbyasid decodeassists umip pku ospke vaes vpclmulqdq rdpid overflow_recov succor
[root@centos8 ~]# lsmod |grep kvm
kvm_amd               110592  0
ccp                    98304  1 kvm_amd
kvm                   798720  1 kvm_amd
irqbypass              16384  1 kvm
[root@centos8 ~]# ll /dev/kvm
crw-rw-rw- 1 root kvm 10, 232 Jun 28 21:59 /dev/kvm

2.3 安装KVM工具包

2.3.1 KVM相关工具包介绍

  • qemu-kvm:为kvm提供底层仿真支持
  • libvirt-daemon:libvirtd守护进程,管理虚拟机
  • libvirt-client:用户端软件,提供客户端管理命令
  • libvirt-daemon-driver-qemu:libvirtd连接qemu的驱动
  • libvirt:使用最多的KVM虚拟化管理工具和应用程序接口,即通过libvirt调用KVM创建虚拟机,libvirt是KVM通用的访问API,其不但能管理KVM,还能管理VMware、Xen、Hyper-V、virtualBox等虚拟化方案。
  • virt-manager:图形界面管理工具,其底层也是调用libvirt API来完成对虚拟机的操作,包括虚拟机的创建、删除、启动、停止以及一些简单的监控功能等。
  • virt-install:虚拟机命令行安装工具
  • virsh:命令行工具是基于libvirt API创建的命令行工具,它可以作为图形化的virt-manager应用的备选工具。virsh命令可以被用来创建虚拟化任务管理脚本,如安装、启动和停止虚拟机
  • virt-viewer:通过VNC和SPICE协议显示虚拟机器图形控制台的最小工具。该工具在其同名软件包中:virtviewer
  • cockpit:CentOS8专门提供的基于Web的虚拟机管理界面

2.3.2 libvirt包功能

2.3.2.1 libvirt介绍

官网:https://libvirt.org/

libvirt程序包是一个与虚拟机监控程序相独立的虚拟化应用程序接口,它可以与操作系统的一系列虚拟化性能进行交互

libvirt程序包提供:

  • 一个稳定的通用层来安全地管理主机上的虚拟机。
  • 一个管理本地系统和连网主机的通用接口。

在虚拟机监控程序支持的情况下,部署、创建、修改、监测、控制、迁移以及停止虚拟机操作都需要这些APl。尽管libvirt可同时访问多个主机,但API只限于单节点操作

libvirt程序包被设计为用来构建高级管理工具和应用程序,例如virt-manager与virsh命令行管理工具。libvirt主要的功能是管理单节点主机,并提供API来列举、监测和使用管理节点上的可用资源,其中包括CPU、内存、储存、网络和非一致性内存访问(NUMA)分区。管理工具可以位于独立于主机的物理机上,并通过安全协议和主机进行交流

2.3.2.2 libvirt结构图

2.3.3 安装KVM相关包

2.3.3.1 CentOS安装KVM

使用虚拟化,需要至少qemu-kvm和qemu-img(安装qemu-kvm会自动安装)软件包

建议安装:yum install qemu-kvm libvirt virt-manager virt-install

CentOS 8安装KVM相关工具

[root@centos8 ~]# dnf install qemu-kvm libvirt virt-manager virt-install virt-viewer -y
[root@centos8 ~]# systemctl enable --now libvirtd

centos8 还提供基于WEB的虚拟机管理方式

[root@centos8 ~]# dnf install cockpit cockpit-machines -y
[root@centos8 ~]# systemctl enable --now cockpit.socket
Created symlink /etc/systemd/system/sockets.target.wants/cockpit.socket → /usr/lib/systemd/system/cockpit.socket.

# 打开浏览器访问下面地址:
https://10.0.0.8:9090/

2.3.3.2 Ubuntu安装KVM

Ubuntu 2104

官方文档:https://ubuntu.com/server/docs/virtualization-libvirt

# apt install qemu-kvm virt-manager libvirt-daemon-system
# kvm-ok # 验证是否支持kvm,只有Ubuntu支持, centos不支持
INFO: /dev/kvm exists
KVM acceleration can be used

例:

[root@ubuntu2104 ~]# apt install qemu-kvm virt-manager libvirt-daemon-system -y
[root@ubuntu2104 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:67:87:fa brd ff:ff:ff:ff:ff:ff
    altname enp2s1
    altname ens33
    inet 10.0.0.9/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe67:87fa/64 scope link 
       valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    link/ether 52:54:00:c4:9b:3e brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever

# 如果没有开启CPU虚拟化功能会提示以下信息
[root@ubuntu2104 ~]# kvm-ok
INFO: Your CPU does not support KVM extensions
KVM acceleration can NOT be used

# 添加CPU的虚拟化支持再执行
[root@ubuntu2104 ~]# kvm-ok
INFO: /dev/kvm exists
KVM acceleration can be used