KVM概述
• 以色列qumranet公司研发,后被RedHad公司收购
(1)kvm只支持x86平台
(2)依赖于 HVM,inter VT AMD-v
• KVM是(Kernel-based Virtual Machine)的简称,是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中。它使用Linux自身的调度器进行管理,所以相对于Xen,其核心源码很少。
• KVM的虚拟化需要硬件支持(如Intel VT技术或者AMD V技术)。是基于硬件的完全虚拟化。而Xen早期则是基于软件模拟的Para-Virtualization,新版本则是基于硬件支持的完全虚拟化。但Xen本身有自己的进程调度器,存储管理模块等,所以代码较为庞大。广为流传的商业系统虚拟化软件VMware ESX系列是基于软件模拟的Full-Virtualization。
KVM工作原理
KVM 是基于虚拟化扩展(Intel VT 或者 AMD-V)的 X86 硬件的开源的 Linux 原生的全虚拟化解决方案。KVM 中,虚拟机被实现为常规的 Linux 进程,由标准 Linux 调度程序进行调度;虚机的每个虚拟 CPU 被实现为一个常规的 Linux 进程。这使得 KMV 能够使用 Linux 内核的已有功能。
但是,KVM 本身不执行任何硬件模拟,需要客户空间程序通过 /dev/kvm 接口设置一个客户机虚拟服务器的地址空间,向它提供模拟的 I/O,并将它的视频显示映射回宿主的显示屏。目前这个应用程序是 QEMU。
KVM整体结构
从GUI到Linux内核,包括以下五个组件:
1、virt-manager: 一个用来管理VM的GUI/CUI用户接口,它使用libvirt api 调用VM的各种功能。
2、libvirt:API库,作为较通用的服务器虚拟化软件,它支持Xen,VMware ESXi/GSX,当然,还有QEMU/KVM。
3、QEMU:一个和KVM内核模块交互的模拟器,处理多种客户机系统请求如I/O,一个QEMU进程对应一个客户机系统。
4、KVM内核模块: 从狭义上来说,KVM是一个Linux内核模块,主要负责vCPU的创建,虚拟内存的分配,vCPU寄存器的读写以及vCPU的运行。
5、Bridge-utils - Bridge-utils是一个Linux桥接工具集合,用于创建和配置网络桥接设备。在KVM中使用网络桥接可以实现更高效的网络通信。
KVM部署
镜像下载地址: Download
#设置主机名
[root@localhost yum.repos.d]# hostnamectl set-hostname kvmhost
#查看所有的包组包括隐藏的
[root@kvmhost yum.repos.d]# yum grouplist hidden
Loaded plugins: fastestmirror
There is no installed groups file.
Maybe run: yum groups mark convert (see man yum)
Loading mirror speeds from cached hostfile
Available Environment Groups:
Minimal Install
Compute Node
Infrastructure Server
File and Print Server
Basic Web Server
Virtualization Host
Server with GUI
GNOME Desktop
KDE Plasma Workspaces
Development and Creative Workstation
Available Groups:
Additional Development
Anaconda Tools
Backup Client
Backup Server
Base
CentOS Linux Client product core
CentOS Linux ComputeNode product core
CentOS Linux Server product core
CentOS Linux Workstation product core
Common NetworkManager submodules
Compatibility Libraries
Conflicts (Client)
Conflicts (ComputeNode)
Conflicts (Server)
Conflicts (Workstation)
Console Internet Tools
Core
DNS Name Server
Debugging Tools
Desktop Debugging and Performance Tools
Development Tools
Dial-up Networking Support
Directory Client
Directory Server
E-mail Server
Emacs
FTP Server
File and Storage Server
Fonts
GNOME
GNOME Applications
Graphical Administration Tools
Graphics Creation Tools
Guest Agents
Guest Desktop Agents
Hardware Monitoring Utilities
High Availability
Hyper-v platform specific packages
Identity Management Server
Infiniband Support
Input Methods
Internet Applications
Internet Browser
Java Platform
KDE
KDE Applications
KDE Multimedia Support
KVM platform specific packages
Large Systems Performance
Legacy UNIX Compatibility
Legacy X Window System Compatibility
Load Balancer
Mainframe Access
MariaDB Database Client
MariaDB Database Server
Multimedia
Network File System Client
Network Infrastructure Server
Networking Tools
Office Suite and Productivity
PHP Support
Performance Tools
Perl Support
Perl for Web
Platform Development
PostgreSQL Database Client
PostgreSQL Database Server
Print Server
Printing Client
Python
Remote Desktop Clients
Remote Management for Linux
Resilient Storage
Ruby Support
Scientific Support
Security Tools
Smart Card Support
System Administration Tools
System Management
Technical Writing
VMware platform specific packages
Virtualization Client
Virtualization Hypervisor
Virtualization Platform
Virtualization Tools
Web Server
Web Servlet Engine
X Window System
Done
[root@kvmhost yum.repos.d]#
#安装kvm包组
[root@kvmhost ~]# yum groupinstall Virtualization*
#启动libvirtd服务
[root@kvmhost ~]# systemctl start libvirtd.service
#会自动创建一个nat网络模式 虚拟网卡virbr0
[root@kvmhost ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.164.88 netmask 255.255.255.0 broadcast 192.168.164.255
inet6 fe80::d3bf:bc91:e8af:f72 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:6d:ca:0e txqueuelen 1000 (Ethernet)
RX packets 7812 bytes 535792 (523.2 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 10865 bytes 7534518 (7.1 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 432 bytes 34156 (33.3 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 432 bytes 34156 (33.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 kvm nat网络模式
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:48:2a:8b 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@kvmhost ~]#
KVM创建仅主机网络模式
# kvm管理器
[root@kvmhost ~]# virt-manager
#多一个虚拟网卡 仅主机模式
[root@kvmhost ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.164.88 netmask 255.255.255.0 broadcast 192.168.164.255
inet6 fe80::d3bf:bc91:e8af:f72 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:6d:ca:0e txqueuelen 1000 (Ethernet)
RX packets 3668044 bytes 4966430408 (4.6 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 671088 bytes 1247012644 (1.1 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 97135 bytes 700480172 (668.0 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 97135 bytes 700480172 (668.0 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:48:2a:8b 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
virbr1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 仅主机网络
inet 192.168.100.1 netmask 255.255.255.0 broadcast 192.168.100.255
ether 52:54:00:99:61:35 txqueuelen 1000 (Ethernet)
RX packets 79 bytes 6122 (5.9 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 73 bytes 6566 (6.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
vnet0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::fc54:ff:fe60:7689 prefixlen 64 scopeid 0x20<link>
ether fe:54:00:60:76:89 txqueuelen 1000 (Ethernet)
RX packets 79 bytes 7228 (7.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 245 bytes 15750 (15.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@kvmhost ~]#
KVM虚拟机创建(仅主机网络模式)
KVM创建桥接网络模式
#关闭NetworkManager
[root@kvmhost ~]# systemctl stop NetworkManager
[root@kvmhost ~]# systemctl disable NetworkManager
#配置桥接网卡
[root@kvmhost ~]# cd /etc/sysconfig/network-scripts/
[root@kvmhost network-scripts]# cp -a ifcfg-ens33 ifcfg-br0
[root@kvmhost network-scripts]# vim ifcfg-br0
TYPE=Bridge
BOOTPROTO=none
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.164.88
NETMASK=255.255.255.0
GATEWAY=192.168.164.2
DNS1=8.8.8.8
DNS2=114.114.114.114
DELAY=0
[root@kvmhost network-scripts]# vim ifcfg-ens33
TYPE=Ethernet
#BOOTPROTO=none
NAME=ens33
DEVICE=ens33
ONBOOT=yes
BRIDGE=br0
[root@kvmhost network-scripts]# systemctl restart network
[root@kvmhost network-scripts]# ifconfig
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 #桥接网卡
inet 192.168.164.88 netmask 255.255.255.0 broadcast 192.168.164.255
inet6 fe80::20c:29ff:fe6d:ca0e prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:6d:ca:0e txqueuelen 1000 (Ethernet)
RX packets 15 bytes 900 (900.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 22 bytes 1688 (1.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::20c:29ff:fe6d:ca0e prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:6d:ca:0e txqueuelen 1000 (Ethernet)
RX packets 1472 bytes 113322 (110.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 889 bytes 124813 (121.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
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
virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:48:2a:8b 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
virbr1: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.100.1 netmask 255.255.255.0 broadcast 192.168.100.255
ether 52:54:00:99:61:35 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
KVM虚拟机创建(桥接网络模式)
创建虚拟机步骤和上面类似
网络模式选择桥接模式
IP地址自动获取 跟宿主机的IP在同一个网段
#查看虚拟机配置
[root@kvmhost ~]# cd /etc/libvirt/qemu/
[root@kvmhost qemu]# ls
networks vm1.xml vm2.xml
[root@kvmhost qemu]# cat vm2.xml
<!--
WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
virsh edit vm2
or other application using the libvirt API.
-->
<domain type='kvm'>
<name>vm2</name>
<uuid>8d3dcb45-fa50-4bc5-9429-7d72f8eb9022</uuid>
<memory unit='KiB'>1048576</memory>
<currentMemory unit='KiB'>1048576</currentMemory>
<vcpu placement='static'>1</vcpu>
<os>
<type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
<boot dev='hd'/>
</os>
<features>
<acpi/>
<apic/>
</features>
<cpu mode='custom' match='exact' check='partial'>
<model fallback='allow'>Broadwell-noTSX-IBRS</model>
<feature policy='require' name='md-clear'/>
<feature policy='require' name='spec-ctrl'/>
<feature policy='require' name='ssbd'/>
</cpu>
<clock offset='utc'>
<timer name='rtc' tickpolicy='catchup'/>
<timer name='pit' tickpolicy='delay'/>
<timer name='hpet' present='no'/>
</clock>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<pm>
<suspend-to-mem enabled='no'/>
<suspend-to-disk enabled='no'/>
</pm>
<devices>
<emulator>/usr/libexec/qemu-kvm</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/var/lib/libvirt/images/vm2.qcow2'/>
<target dev='hda' bus='ide'/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
<disk type='file' device='cdrom'>
<driver name='qemu' type='raw'/>
<target dev='hdb' bus='ide'/>
<readonly/>
<address type='drive' controller='0' bus='0' target='0' unit='1'/>
</disk>
<controller type='usb' index='0' model='ich9-ehci1'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x7'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci1'>
<master startport='0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0' multifunction='on'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci2'>
<master startport='2'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x1'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci3'>
<master startport='4'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x2'/>
</controller>
<controller type='pci' index='0' model='pci-root'/>
<controller type='ide' index='0'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
</controller>
<controller type='virtio-serial' index='0'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
</controller>
<interface type='bridge'>
<mac address='52:54:00:07:76:f1'/>
<source bridge='br0'/>
<model type='rtl8139'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
<serial type='pty'>
<target type='isa-serial' port='0'>
<model name='isa-serial'/>
</target>
</serial>
<console type='pty'>
<target type='serial' port='0'/>
</console>
<channel type='spicevmc'>
<target type='virtio' name='com.redhat.spice.0'/>
<address type='virtio-serial' controller='0' bus='0' port='1'/>
</channel>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
<graphics type='spice' autoport='yes'>
<listen type='address'/>
<image compression='off'/>
</graphics>
<sound model='ich6'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</sound>
<video>
<model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='1' primary='yes'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</video>
<redirdev bus='usb' type='spicevmc'>
<address type='usb' bus='0' port='1'/>
</redirdev>
<redirdev bus='usb' type='spicevmc'>
<address type='usb' bus='0' port='2'/>
</redirdev>
<memballoon model='virtio'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
</memballoon>
</devices>
</domain>
[root@kvmhost qemu]#
KVM命令行安装虚拟机
命令行手动安装虚拟机
#virt-install安装虚拟机
virt-install --name vm3 \
--memory 1024 \
--vcpus=2 \
--location=/iso/CentOS-7-x86_64-DVD-2207-02.iso \
--disk path=/var/lib/libvirt/images/vm3.qcow2,size=10,format=qcow2 \
--network bridge=br0
命令行自动配置安装虚拟机
#安装配置工具
[root@kvmhost ~]# yum list all | grep kickstart
pykickstart.noarch 1.99.66.22-1.el7 base
system-config-kickstart.noarch 2.9.7-1.el7 base
[root@kvmhost ~]# yum -y install system-config-kickstart
#查看安装包清单中的bin命令
[root@kvmhost ~]# rpm -ql system-config-kickstart | grep bin
/usr/bin/system-config-kickstart
[root@kvmhost ~]#
#生成ks自动配置文件
[root@kvmhost ~]# system-config-kickstart
[root@kvmhost ~]# cd /iso/
[root@kvmhost iso]# ls
CentOS-7-x86_64-DVD-2207-02.iso ks.cfg
#自动配置文件安装
virt-install --name vm4 \
--memory 1024 \
--vcpus=2 \
--location=/iso/CentOS-7-x86_64-DVD-2207-02.iso \
--disk path=/var/lib/libvirt/images/vm4.qcow2,size=10,format=qcow2 \
--network bridge=br0 \
-x ks=/iso/ks.cfg