KVM虚拟化技术(一)
===============================================================================
概述:
===============================================================================
虚拟化技术基础
1.介绍
★cpu虚拟化:
☉模拟:emulation
☉虚拟:virtulization
完全虚拟化(full-virtulization)
BT: 二进制翻译 (软件)
HVM:硬件辅助的虚拟化 (硬件)
半虚拟化(para-virtulization)
★Memory虚拟化
★I/O虚拟化
2.实现方式
★两种实现方式
☉Type-I:
hypervisor --> vm
xen, vmware ESX/ESXi
xen:hypervisor, Dom0(实现I/O操作)
☉Type-II:
host(宿主机) --> vmm(虚拟机监控器) --> vm
kvm, vmware workstation, virtualbox
3.Inter硬件辅助的虚拟化
QEMU,virtio
1.虚拟化技术的分类
★模拟
著名的模拟器,PearPC, Bochs, QEMU
★完全虚拟化:也称为native virtulization
两种加速方式:
BT
HVM
应用的技术:
VMware Workstation, VMware Server, Parallels Desktop, KVM, Xen(HVM)
★半虚拟化:para-virtualization
解决方案:xen, uml(user-mode linux)
★OS级别的虚拟化:
将用户空间分隔为多个,彼此间互相隔离;
容器级虚拟化
OpenVZ, lxc
Solaris Containers
FreeBSD jails
★库虚拟化:
wine
★应用程序虚拟化:
jvm
2.虚拟化网络
★虚拟化网络:
nat mode:NAT模型
bridge mode:桥接模型
routed mode:路由模型
isolation mode:隔离模型
★TUN与TAP
在计算机网络中,TUN与TAP是操作系统内核中的虚拟网络设备。不同于普通靠硬件网路板卡实现的设备,这些虚拟的网络设备全部用软件实现,并向运行于操作系统上的软件提供与硬件的网络设备完全相同的功能。
TAP等同于一个以太网设备,它操作第二层数据包如以太网数据帧。TUN模拟了网络层设备,操作第三层数据包比如IP数据封包。
操作系统通过TUN/TAP设备向绑定该设备的用户空间的程序发送数据,反之,用户空间的程序也可以像操作硬件网络设备那样,通过TUN/TAP设备发送数据。在后种情况下,TUN/TAP设备向操作系统的网络栈投递(或“注入”)数据包,从而模拟从外部接受数据的过程。
KVM
1.介绍
★KVM: Kernel-based Virtual Machine, Qumranet公司
☉依赖于HVM(要求cpu必须支持硬件虚拟化)
Intel:VT-x(表现为vmx)
ADM: ADM-V (表现为svm)
☉内核模块(整体表现为一个内核模块):
kvm:核心模块
kvm-intel(专用于intel的模块);kvm-amd(专用于amd的模块)
★KVM模块载入后的系统的运行模式:
内核模式:GuestOS(虚拟机操作系统)执行I/O类操作,或其它的特殊指令的操作;称作“来宾-内核”模式;
用户模式:代表GuestOS请求I/O类操作;
来宾模式:GuestOS的非I/O类操作;事实上,它被称作“来宾-用户”模式;
kvm hypervisor:host上的内核
2.kvm组件
★两类组件
☉/dev/kvm:
工作于hypervisor,在用户空间可通过ioctl()系统调用来完成VM创建、启动等管理功能;它是一个字符设备
功能:创建VM、为VM分配内存、读写VCPU的寄存器、向VCPU注入中断、运行VCPU等等;
☉qemu进程:
工作于用户空间,主要用于实现模拟PC机的IO设备;
3.kvm特性
★特性
☉内存管理:
将分配给VM的内存交换至SWAP;
支持使用Huge Page(大内存页);
支持使用Intel EPT或AMD RVI技术完成内存地址映射;(GVA-->GPA-->HPA 过渡到 GVA->HPA)
支持KSM (Kernel Same-page Merging) 内核相同页面合并技术
☉硬件支持:
取决于Linux内核;
☉存储:
本地存储
网络附加存储:
存储区域网络:
分布式存储:例如GlustFS
☉实时迁移:
☉支持的GuestOS(x86系统的服务器):
Linux, Windows, OpenBSD, FreeBSD, OpenSolaris;
☉设备驱动:
IO设备的完全虚拟化:模拟硬件
IO设备的半虚拟化:在GuestOS中安装驱动;virtio
virtio-blk, virtio-net, virtio-pci, virtio-console, virtio-ballon
4.kvm局限性
★一般局限性
CPU overcommit
时间记录难以精确,依赖于时间同步机制
★MAC地址:
VM量特别大时,存在冲突的可能性;
实时迁移:
性能局限性:
5.kvm工具栈
★qemu:
qemu-kvm:主要作用是实现进程管理
qemu-img:用来管理磁盘映像文件
★libvirt(cs架构)
☉kvm hypervisor:
运行libvirtd守护进程
☉客户端工具管理接口
GUI:virt-manager, virt-viewer
CLI:virt-install, virsh
★QEMU主要提供了以下几个部分:
处理器模拟器
仿真IO设备
关联模拟的设备至真实设备;
调试器
与模拟器交互的用户接口
KVM安装及使用
1.安装前提
(1)确保CPU支持HVM
# grep -E --color=auto "(vmx|svm)" /proc/cpuinfo
(2)查看内核编译是否提供了kvm模块
# modinfo kvm
(3)装载模块
# modprobe kvm
# modprobe kvm-intel
(4)验正:
/dev/kvm 或者 lsmod |grep kvm
演示:
[root@centos7 ~]# grep -E --color=auto "(vmx|svm)" /proc/cpuinfo flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer xsave avx hypervisor lahf_lm arat epb pln pts dtherm tpr_shadow vnmi ept vpid tsc_adjust flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer xsave avx hypervisor lahf_lm arat epb pln pts dtherm tpr_shadow vnmi ept vpid tsc_adjust flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer xsave avx hypervisor lahf_lm arat epb pln pts dtherm tpr_shadow vnmi ept vpid tsc_adjust [root@centos7 ~]# modinfo kvm filename: /lib/modules/3.18.41-1.0-Taolinux/kernel/arch/x86/kvm/kvm.ko license: GPL author: Qumranet srcversion: 2C2D9EC3889CB033C504EAE depends: intree: Y vermagic: 3.18.41-1.0-Taolinux SMP mod_unload modversions signer: Magrathea: Glacier signing key sig_key: 13:F4:F1:CE:0F:1F:64:52:F0:D6:39:73:5A:ED:94:84:A4:DB:4B:20 sig_hashalgo: sha256 parm: ignore_msrs:bool parm: min_timer_period_us:uint parm: tsc_tolerance_ppm:uint [root@centos7 ~]# [root@centos7 ~]# modprobe kvm [root@centos7 ~]# lsmod |grep kvm kvm_intel 148404 0 kvm 466442 1 kvm_intel [root@centos7 ~]# ll /dev |grep kvm crw------- 1 root root 10, 232 Mar 21 21:53 kvm
2.为KVM虚拟机配置桥接网络
★方法一:
直接在/etc/sysconfig/network-scripts 目录中创建桥接接口 ifcfg-br0
★方法二:
通过 virsh iface-bridge 命令创建桥接接口
virsh:
注意:
创建物理桥需要关闭NetworkManager服务,使用network服务来管理网络;
systemctl stop NatworkManager
systemctl disable NatworkManager
演示一:
1.编辑/etc/sysconfig/network-scripts 创建ifcfg-br0,然后修改相关配置如下:
[root@centos7 network-scripts]# cp ifcfg-eno16777736 ifcfg-br0 #修改原来的网卡 eno16777736 作为交换机使用 # Generated by parse-kickstart IPV6INIT=yes IPV6_AUTOCONF=yes BOOTPROTO=none DEVICE=eno16777736 ONBOOT=yes UUID=71d191d3-7396-4336-879d-a5c3deab705f TYPE=Ethernet DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no NAME="System eno16777736" IPV6_PEERDNS=yes IPV6_PEERROUTES=yes BRIDGE=br0 # 添加项 # 修改ifcfg-br0作为网卡使用 # Generated by parse-kickstart IPV6INIT=yes IPV6_AUTOCONF=yes BOOTPROTO=none DEVICE=br0 # 设备为br0 ONBOOT=yes TYPE=Bridge # 网卡类型为 Bridge DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no DNS1=192.168.1.1 DNS2=114.114.114.114 IPADDR=192.168.1.112 PREFIX=24 GATEWAY=192.168.1.1 IPV6_PEERDNS=yes IPV6_PEERROUTES=yes
2.重启网络,ifconfig查看如下
[root@centos7 ~]# ifconfig br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.1.112 netmask 255.255.255.0 broadcast 192.168.1.255 inet6 fe80::20c:29ff:fe21:c943 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:21:c9:43 txqueuelen 0 (Ethernet) RX packets 31 bytes 3591 (3.5 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 39 bytes 6221 (6.0 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 ether 00:0c:29:21:c9:43 txqueuelen 1000 (Ethernet) RX packets 1816 bytes 143756 (140.3 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 799 bytes 109966 (107.3 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
演示2:使用virsh 配置网络
[root@centos7 network-scripts]# virsh iface-list # 查看当前网卡 Name State MAC Address --------------------------------------------------- eno16777736 active 00:0c:29:21:c9:43 lo active 00:00:00:00:00:00 [root@centos7 network-scripts]# virsh iface-bridge eno16777736 br0 #创建物理桥eno16777736为br0 Created bridge br0 with attached device eno16777736 [root@centos7 ~]# ifconfig br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.1.112 netmask 255.255.255.0 broadcast 192.168.1.255 inet6 fe80::20c:29ff:fe21:c943 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:21:c9:43 txqueuelen 0 (Ethernet) RX packets 66 bytes 7319 (7.1 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 66 bytes 11370 (11.1 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet6 fe80::20c:29ff:fe21:c943 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:21:c9:43 txqueuelen 1000 (Ethernet) RX packets 3954 bytes 335609 (327.7 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 2648 bytes 417462 (407.6 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@centos7 ~]# virsh iface-list Name State MAC Address --------------------------------------------------- br0 active 00:0c:29:21:c9:43 lo active 00:00:00:00:00:00
3.管理工具栈
# yum grouplist | grep -i "virtualization"
Virtualization:
qemu-kvm
Virtualization Client:
python-virtinst, virt-manager, virt-viewer
Virtualization Platform:
libvirt, libvirt-client
Virtualization Tools
libguestfs
libvirt工具栈
★libvirt
支持的虚拟化技术:KVM, XEN, VMWARE, Qemu,LXC, OpenVZ;
★libvirt中的术语:
node: 指物理节点
hypervisor:支持虚拟机的运行环境
domain: 虚拟机
dom0:特权域
domU:非特权域
如下图:
★安装并启动 libvirtd.service
# yum install libvirt libvirt-client python-virtinst virt-manager
centos 7: # yum install libvirt libvirt-client virt-install virt-manager virt-viewer
启动守护进程:
~]# systemctl start libvirtd.service
★libvirt和libvirtd的配置文件:
libvirt配置文件:/etc/libvirt/libvirt.conf
守护进程配置文件:/etc/libvirt/libvirtd.conf
★Hypervisor的访问路径:
☉本地URL:
driver[+transport]:///[path][?extral-param]
driver: 驱动名称,例如 qemu, xen, lxc
transport:传输方式
kvm使用qemu驱动,使用格式qemu:///system, 例如qemu:///system
☉远程URL:
driver[+transport]://[user@][host][:port]/[path][?extral-param]
例如:
qemu://172.16.100.6/system
qemu+ssh://root@172.16.100.6/system
qemu+tcp://172.16.100.6/system
演示:virt-manager创建虚拟机
1.安装及启动守护进程 libvirtd.service
#安装 [root@centos7 ~]# yum install libvirt libvirt-client virt-install virt-manager virt-viewer #启动守护进程libvirtd.service [root@centos7 ~]# systemctl start libvirtd.service
2.执行 virt-manager启动图形化管理界面,此操作可以通过vnc或者xhell的xmanager实现,如下:
安装qemu-kvm(yum install qemu-kvm -y)并重启libvirtd.service(systemctl restart libvirtd.service)服务,再次执行virt-manager可以看到如下界面:
3.这里选择使用本地镜像安装
4.设置虚拟机的内存和cpu的核心数,这里要注意内存要大于等于1024M,如果小于的话在安装的时候会提示错误。
5.设定磁盘大小
6.选择安装前自定义,并且选择物理桥br0
7.确认是否链接到本地镜像
选择Display 为VNC ,否则的话进入安装界面鼠标和键盘都不能用(这里针对xshell跳转的xmanager说明),如果是使用的vnc远程桌面,可以不设置
选择我 Device model 为virtio
选择引导分区为CDROM
8.点击 Begin Installation开始安装,如下:
如上,就是通过virt-manager图形化工具安装KVM虚拟机的整个过程!