KVM虛擬化技術(一)node
===============================================================================python
概述:linux
===============================================================================shell
1.介紹
centos
★cpu虛擬化:api
☉模擬:emulationbash
☉虛擬: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硬件輔助的虛擬化
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設備向操做系統的網絡棧投遞(或「注入」)數據包,從而模擬從外部接受數據的過程。
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設備
關聯模擬的設備至真實設備;
調試器
與模擬器交互的用戶接口
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
支持的虛擬化技術: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虛擬機的整個過程!