
1.KVM簡介
虛擬化技術類型和架構:
- 主機虛擬化:xen, kvm, virtualbox, ...
- 容器(用戶空間隔離): lxc(LinuX Container), openvz, ...
- 系統庫虛擬化:wine, ...
- 應用程序級虛擬化:jvm, pvm,...
主機虛擬化:
CPU:
- 模擬:emulation, 虛擬機的arch與物理平台的arch可以不相同;qemu;
- 虛擬:virtualizatio
內存:
MMU virtualization:
- Intel: EPT, Extended Page Table
- AMD: NPT, Nested Page Table
TLB virtualization:tagged TLB
IO:
- Emulation
- Para-virtualization
- IO-through:IO透傳
主機虛擬化的類型:
- TYPE-I:於硬件級別直接運行hypervisor;(xen, vmware ESX/ESXI)
- TYPE-II:於硬件級別運行一個OS(Host OS),而此OS上運行一個VMM;vmware workstation, virtualbox, kvm
Linux目前流行的開源虛擬化技術解決方案:
- 主機虛擬化:xen, kvm, virtualbox
- 容器級:lxc, libcontainer, runC, openvz
- 模擬器:qemu
KVM的組件:
- kvm.ko:模塊
- API
- qemu-kvm:用戶空間的工具程序;qemu-kvm is an open source virtualizer that provides hardware emulation for the KVM hypervisor.
- libvirt:Libvirt is a C toolkit to interact with the virtualization capabilities of recent versions of Linux (and other OSes). The main package includes the libvirtd server exporting the virtualization support.
快速使用kvm技術
# yum install libvirt-daemon-kvm qemu-kvm virt-manager
# modprobe kvm
# systemctl start libvirtd.service
# virsh iface-bridge INTERFACE BRIDGE_NAME
# virt-manager &
總結:
虛擬化技術的分類:
(1) 模擬:Emulation(Qemu, PearPC, Bochs, ...)
(2) 完全虛擬化:Full Virtualization,Native Virtualization
BT/hvm:VMWare Workstation, VirtualBox, VMWare Server, Parallels Desktop, KVM(hvm), XEN(hvm)
(3) 半虛擬化:Para-Virutalization,特點:GuestOS明確知道自己運行虛擬機之上;
xen, UML(user-mode linux)
(4) 容器級虛擬化:LXC, OpenVZ, libcontainer, runC, rkt, Linux V Servers, Virtuozzo, ...
(5) 庫級別虛擬化:wine
(6) 程序級虛擬化jvm, pvm, ...
KVM的組件:兩類組件:
(kvm.ko)/dev/kvm:工作為hypervisor,在用戶空間可通過系統調用ioctl()與內核中的kvm模塊交互,從而完成虛擬機的創建、啟動、停止、刪除等各種管理功能;
qemu-kvm進程:工作於用戶空間,用於實現IO設備模擬;用於實現一個虛擬機實例;
KVM模塊load進內存之后,系統的運行模式:
- 內核模式:GuestOS執行IO類的操作時,或其它的特殊指令操作時的模式;它也被稱為“Guest-Kernel”模式;
- 用戶模式:Host OS的用戶空間,用於代為GuestOS發出IO請求;
- 來賓模式:GuestOS的用戶模式;所有的非IO類請求;
安裝使用KVM:
判斷CPU是否支持硬件虛擬化:
grep -i -E '(vmx|svm|lm)' /proc/cpuinfo
- vmx:Intel VT-x
- svm:AMD AMD-v
在虛擬機中嵌套虛擬機:開機前:
運行中的一個kvm虛擬機就是一個qemu-kvm進程,運行qemu-kvm程序並傳遞給它合適的選項及參數即能完成虛擬機啟動,終止此進程即能關閉虛擬機;
kvm工具棧:
qemu:qemu-kvm 、qemu-img(CentOS內核中)
libvirt:GUI:(virt-manager, virt-viewer)、(CLI: virsh, virt-install)
安裝:
(1) 裝載內核模塊modprobe kvm
使用virt-manager管理KVM
# yum install qemu-kvm libvirt-daemon-kvm virt-manager
# modprobe kvm
# systemctl start libvirtd.service
# virt-manager &
網絡虛擬化:
二層的虛擬網絡設備:kernel net bridge/brctl、openvswitch
CentOS 7創建物理橋,使用內核自帶的橋接模塊實現:
橋接口配置文件保留地址信息;
- TYPE=Bridge
- Device=BRIDGE_NAME
物理網卡配置文件:刪除地址、掩碼和網關等相關的配置,添加BRIDGE=BRIDGE_NAME
重啟網絡服務
2.KVM實戰應用
Qemu:
- 處理器模擬器
- 仿真各種IO設備
- 將仿真設備連接至主機的物理設備
- 提供用戶接口
qemu-kvm命令語法:qemu-kvm [options] [disk_image]
選項有很多類別:標准選項、塊設備相關選項、顯示選項、網絡選項、...
標准選項:
- -machine [type=]name:-machine help來獲取列表,用於指定模擬的主機類型;
- -cpu cpu:-cpu help來獲取列表;用於指定要模擬的CPU型號;
- -smp n[,maxcpus=cpus][,cores=cores][,threads=threads][,sockets=sockets]:指明虛擬機上vcpu的數量及拓撲;
- -boot [order=drives][,once=drives][,menu=on|off] [,splash=sp_name][,splash-time=sp_time][,reboot-timeout=rb_time][,strict=on|off]
- order:各設備的引導次序:c表示第一塊硬盤,d表示第一個光驅設備;-boot order=dc,once=d
- -m megs:虛擬機的內存大小;
- -name NAME:當前虛擬機的名稱,要惟一;
塊設備相關的選項:
- -hda/-hdb file:指明IDE總線類型的磁盤映射文件路徑;第0和第1個;
- -hdc/-hdd file:第2和第3個;
- -cdrom file:指定要使用光盤映像文件;
- -drive [file=file][,if=type][,media=d][,index=i] [,cache=writethrough|writeback|none|directsync|unsafe][,format=f]:
file=/PATH/TO/SOME_IMAGE_FILE:映像文件路徑; if=TYPE:塊設備總線類型,ide, scsi, sd, floppy, virtio,... media=TYPE:介質類型,cdrom和disk; index=i:設定同一類型設備多個設備的編號; cache=writethrough|writeback|none|directsync|unsafe:緩存方式; format=f:磁盤映像文件的格式;
顯示選項:
- -display type:顯示的類型,sdl, curses, none和vnc;
- -nographic:不使用圖形接口;
- -vga [std|cirrus|vmware|qxl|xenfb|none]:模擬出的顯卡的型號;
- -vnc display[,option[,option[,...]]]]:啟動一個vnc server來顯示虛擬機接口; 讓qemu進程監聽一個vnc接口;
- -monitor stdio:在標准輸出上顯示monitor界面;
options:password:連接此服務所需要的密碼;
Ctrl-a, c:在console和monitor之間切換;
Ctrl-a, h
網絡選項:
-net nic[,vlan=n][,macaddr=mac][,model=type][,name=str][,addr=str][,vectors=v]

為虛擬機創建一個網絡接口,並將其添加至指定的VLAN; model=type:指明模擬出的網卡的型號,ne2k_pci,i82551,i82557b,i82559er,rtl8139,e1000,pcnet,virtio; -net nic,model=? macaddr=mac:指明mac地址;52:54:00:
-net tap[,vlan=n][,name=str][,fd=h][,fds=x:y:...:z][,ifname=name][,script=file][,downscript=dfile]:

通過物理的TAP網絡接口連接至vlan n; script=file:啟動虛擬機時要執行的腳本,默認為/etc/qemu-ifup downscript=dfile:關閉虛擬機時要執行的腳本,/etc/qemu-ifdown ifname=NAME:自定義接口名稱;
-daemonize:以守護進程運行;
/etc/qemu-ifup
#!/bin/bash
#
bridge=br0
if [ -n "$1" ];then
ip link set $1 up
sleep 1
brctl addif $bridge $1
[ $? -eq 0 ] && exit 0 || exit 1
else
echo "Error: no interface specified."
exit 1
fi
示例1:
qemu-kvm -name c2 -smp 2,maxcpus=4,sockets=2,cores=2 -m 128 -drive file=/images/kvm/cos-i386.qcow2,if=virtio -vnc :1 -daemonize -net nic,model=e1000,macaddr=52:54:00:00:00:11 -net tap,script=/etc/qemu-ifup (注意:最好用if=virtio 半虛擬化,性能比全虛擬化高;if后不能有空格!)
示例2:
qemu-kvm -name winxp -smp 1,maxcpus=2,sockets=1,cores=2 -m 1024 -drive file=/data/vms/winxp.qcow2,media=disk,cache=writeback,format=qcow2 file=/tmp/winxp.iso,media=cdrom -boot order=dc,once=d -vnc :1 -net nic,model=rtl8139,macaddr=52:54:00:00:aa:11 -net tap,ifname=tap1,script=/etc/qemu-ifup -daemonize
dnsmasq:(DNS轉發器和DHCP服務器)
--listen-address=192.168.64.2,127.0.0.1
--dhcp-range=192.168.64.10,192.168.64.254,48h
--dhcp-option=3,192.168.0.1
但通常用虛擬機時不會用繁瑣且易出錯的命令行形式一個個生成,而是virsh,默認生成模版文件在/etc/libvirt/qemu/目錄下
virsh命令:虛擬機的生成需要依賴於預定義的xml格式的配置文件;其生成工具有兩個:virt-manager, virt-install;
virsh [OPTION]... COMMAND [ARG]..
子命令的分類:
- Domain Management (help keyword 'domain')
- Domain Monitoring (help keyword 'monitor')
- Host and Hypervisor (help keyword 'host')
- Interface (help keyword 'interface')
- Networking (help keyword 'network')
- Network Filter (help keyword 'filter')
- Snapshot (help keyword 'snapshot')
- Storage Pool (help keyword 'pool')
- Storage Volume (help keyword 'volume')
Domain Management (help keyword 'domain')
- create:從xml格式的配置文件創建並啟動虛擬機;
- define:從xml格式的配置文件創建虛擬機;
- destroy:強行關機;
- shutdown:關機;
- reboot:重啟;
- undefine:刪除虛擬機;
- suspend/resume:暫停於內存中,或繼續運行暫停狀態的虛擬機;
- save/restore:保存虛擬機的當前狀態至文件中,或從指定文件恢復虛擬機;
- console:連接至指定domain的控制台;
- attach-disk/detach-disk:磁盤設備的熱插拔;
- attach-interface/detach-interface:網絡接口設備的熱插拔;
type:bridge
source:BRIDGE_NAME
注意 :無須事先創建網絡接口設備;
Domain Monitoring (help keyword 'monitor')
- domiflist
- domblklist
- ...
圖形管理工具:
- kimchi:基於H5研發web GUI; virt-king;
- OpenStack: IaaS
- oVirt: