1、虛擬化技術(shù):
虛擬化技術(shù)類型:
主機(jī)虛擬化:xen, kvm, virtualbox, ...
容器(用戶空間隔離): lxc(LinuX Container), openvz, ...
系統(tǒng)庫(kù)虛擬化:wine, ...
應(yīng)用程序級(jí)虛擬化:jvm, pvm,...
主機(jī)虛擬化:
CPU:
模擬:emulation, 虛擬機(jī)的arch與物理平臺(tái)的arch可以不相同;qemu;
虛擬:virtualization
完全虛擬化(full-virt)
BT: 二進(jìn)制轉(zhuǎn)換 (軟件)
HVM:硬件輔助的虛擬化(硬件)
半(準(zhǔn))虛擬化 (para-virt)
GuestOS得明確知道自己運(yùn)行于虛擬化技術(shù)
內(nèi)存:
MMU virtualization:
Intel: EPT, Extended Page Table
AMD: NPT, Nested Page Table
TLB virtualization:
tagged TLB
IO:
Emulation
Para-virtualization
IO-through:IO透?jìng)?
主機(jī)虛擬化的類型:
TYPE-I:
于硬件級(jí)別直接運(yùn)行hypervisor;
xen, vmware ESX/ESXI
TYPE-II:
于硬件級(jí)別運(yùn)行一個(gè)OS(Host OS),而此OS上運(yùn)行一個(gè)VMM;
vmware workstation, virtualbox, kvm
Linux目前流行的開(kāi)源虛擬化技術(shù)解決方案:
主機(jī)虛擬化:xen, kvm, virtualbox
容器級(jí):lxc, libcontainer, runC, openvz
模擬器:qemu
2、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.
C/S:
Client:
libvirt-client
virt-manager
Daemon:
libvirt-daemon
3、快速使用kvm技術(shù):
安裝使用KVM:
判斷CPU是否支持硬件虛擬化:
# grep -i -E '(vmx|svm|lm)' /proc/cpuinfo
vmx:Intel VT-x
svm:AMD AMD-v
# yum install libvirt-daemon-kvm qemu-kvm virt-manager
# modprobe kvm
# systemctl start libvirtd.service
# virsh iface-bridge INTERFACE BRIDGE_NAME
# virt-manager
4、kvm: Kernel-based Virtual Machine
Qumranet公司 --> RedHat
(1) X86_64
(2) HVM:
Intel VT
AMD AMD-v
5、KVM的組件:
兩類組件:
(kvm.ko)/dev/kvm:工作為hypervisor,在用戶空間可通過(guò)系統(tǒng)調(diào)用ioctl()與內(nèi)核中的kvm模塊交互,從而完成虛擬機(jī)的創(chuàng)建、啟動(dòng)、停止、刪除等各種管理功能;
qemu-kvm進(jìn)程:工作于用戶空間,用于實(shí)現(xiàn)IO設(shè)備模擬;用于實(shí)現(xiàn)一個(gè)虛擬機(jī)實(shí)例;
KVM模塊load進(jìn)內(nèi)存之后,系統(tǒng)的運(yùn)行模式:
內(nèi)核模式:GuestOS執(zhí)行IO類的操作時(shí),或其它的特殊指令操作時(shí)的模式;它也被稱為“Guest-Kernel”模式;
用戶模式:Host OS的用戶空間,用于代為GuestOS發(fā)出IO請(qǐng)求;
來(lái)賓模式:GuestOS的用戶模式;所有的非IO類請(qǐng)求;
安裝使用KVM:
判斷CPU是否支持硬件虛擬化:
grep -i -E '(vmx|svm|lm)' /proc/cpuinfo
vmx:Intel VT-x
svm:AMD AMD-v
運(yùn)行中的一個(gè)kvm虛擬機(jī)就是一個(gè)qemu-kvm進(jìn)程,運(yùn)行qemu-kvm程序并傳遞給它合適的選項(xiàng)及參數(shù)即能完成虛擬機(jī)啟動(dòng),終止此進(jìn)程即能關(guān)閉虛擬機(jī);
kvm工具棧:
qemu:
qemu-kvm
qemu-img
libvirt:
GUI:virt-manager, virt-viewer
CLI: virsh, virt-install
C/S:
libvirtd
安裝:
(1) 裝載內(nèi)核模塊
kvm:核心模塊
kvm-intel|kvm-amd
使用virt-manager管理KVM
# yum install qemu-kvm libvirt-daemon-kvm virt-manager
# modprobe kvm
# systemctl start libvirtd.service
# virt-manager &
6、網(wǎng)絡(luò)虛擬化:
二層的虛擬網(wǎng)絡(luò)設(shè)備:
kernel net bridge/brctl
openvswitch
CentOS 7創(chuàng)建物理橋,使用內(nèi)核自帶的橋接模塊實(shí)現(xiàn):
橋接口配置文件保留地址信息;
TYPE=Bridge
Device=BRIDGE_NAME
物理網(wǎng)卡配置文件:
刪除地址、掩碼和網(wǎng)關(guān)等相關(guān)的配置,添加
BRIDGE=BRIDGE_NAME
重啟網(wǎng)絡(luò)服務(wù)即可:
7、kvm的管理工具棧:
qemu:
qemu-kvm
qemu-img
libvirt:
GUI:virt-manager
CLI:virsh, virt-install
使用qemu-kvm管理vms:
Qemu:
處理器模擬器
仿真各種IO設(shè)備
將仿真設(shè)備連接至主機(jī)的物理設(shè)備
提供用戶接口
qemu-kvm命令語(yǔ)法:
qemu-kvm [options] [disk_image]
選項(xiàng)有很多類別:
標(biāo)準(zhǔn)選項(xiàng)、塊設(shè)備相關(guān)選項(xiàng)、顯示選項(xiàng)、網(wǎng)絡(luò)選項(xiàng)、...
標(biāo)準(zhǔn)選項(xiàng):
-machine [type=]name:-machine help來(lái)獲取列表,用于指定模擬的主機(jī)類型;
-cpu cpu:-cpu help來(lái)獲取列表;用于指定要模擬的CPU型號(hào);
-smp n[,maxcpus=cpus][,cores=cores][,threads=threads][,sockets=sockets]:指明虛擬機(jī)上vcpu的數(shù)量及拓?fù)洌? -boot [order=drives][,once=drives][,menu=on|off] [,splash=sp_name][,splash-time=sp_time][,reboot-timeout=rb_time][,strict=on|off]
order:各設(shè)備的引導(dǎo)次序:c表示第一塊硬盤,d表示第一個(gè)光驅(qū)設(shè)備;-boot order=dc,once=d
-m megs:虛擬機(jī)的內(nèi)存大小;
-name NAME:當(dāng)前虛擬機(jī)的名稱,要惟一;
塊設(shè)備相關(guān)的選項(xiàng):
-hda/-hdb file:指明IDE總線類型的磁盤映射文件路徑;第0和第1個(gè);
-hdc/-hdd file:第2和第3個(gè);
-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:塊設(shè)備總線類型,ide, scsi, sd, floppy, virtio,...
media=TYPE:介質(zhì)類型,cdrom和disk;
index=i:設(shè)定同一類型設(shè)備多個(gè)設(shè)備的編號(hào);
cache=writethrough|writeback|none|directsync|unsafe:緩存方式;
format=f:磁盤映像文件的格式;
CentOS磁盤鏡像文件下載:
https://cloud.centos.org/centos/7/images/
顯示選項(xiàng):
-display type:顯示的類型,sdl, curses, none和vnc;
-nographic:不使用圖形接口;
-vga [std|cirrus|vmware|qxl|xenfb|none]:模擬出的顯卡的型號(hào);
-vnc display[,option[,option[,...]]]]:?jiǎn)?dòng)一個(gè)vnc server來(lái)顯示虛擬機(jī)接口; 讓qemu進(jìn)程監(jiān)聽(tīng)一個(gè)vnc接口;
display:
(1) HOST:N
在HOST主機(jī)的第N個(gè)桌面號(hào)輸出vnc;
5900+N
(2) unix:/PATH/TO/SOCK_FILE
(3) none
options:
password:連接此服務(wù)所需要的密碼;
-monitor stdio:在標(biāo)準(zhǔn)輸出上顯示monitor界面;
Ctrl-a, c:在console和monitor之間切換;
Ctrl-a, h
網(wǎng)絡(luò)選項(xiàng):
-net nic[,vlan=n][,macaddr=mac][,model=type][,name=str][,addr=str][,vectors=v]
為虛擬機(jī)創(chuàng)建一個(gè)網(wǎng)絡(luò)接口,并將其添加至指定的VLAN;
model=type:指明模擬出的網(wǎng)卡的型號(hào),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]:
通過(guò)物理的TAP網(wǎng)絡(luò)接口連接至vlan n;
script=file:?jiǎn)?dòng)虛擬機(jī)時(shí)要執(zhí)行的腳本,默認(rèn)為/etc/qemu-ifup
downscript=dfile:關(guān)閉虛擬機(jī)時(shí)要執(zhí)行的腳本,/etc/qemu-ifdown
ifname=NAME:自定義接口名稱;
/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 2
fi
其它選項(xiàng):
-daemonize:以守護(hù)進(jìn)程運(yùn)行;
示例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
示例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
半虛擬化:virtio
建議:Network IO, Disk IO使用virtio,性能會(huì)有顯著提升;
dnsmasq:
listen-address=192.168.1.132,127.0.0.1
dhcp-range=192.168.1.50,192.168.1.150,48h
dhcp-option=3,192.168.0.1
8、virsh命令:
虛擬機(jī)的生成需要依賴于預(yù)定義的xml格式的配置文件;其生成工具有兩個(gè):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')
創(chuàng)建虛擬機(jī):
create:從xml格式的配置文件創(chuàng)建并啟動(dòng)虛擬機(jī);
define:從xml格式的配置文件創(chuàng)建虛擬機(jī);
停止:
destroy:強(qiáng)行關(guān)機(jī);
shutdown:關(guān)機(jī);
啟動(dòng):
start:?jiǎn)?dòng)
reboot:重啟;
undefine:刪除虛擬機(jī);
suspend/resume:暫停于內(nèi)存中,或繼續(xù)運(yùn)行暫停狀態(tài)的虛擬機(jī);
真正實(shí)現(xiàn)的效果:pause/unpause
save/restore:保存虛擬機(jī)的當(dāng)前狀態(tài)至文件中,或從指定文件恢復(fù)虛擬機(jī);
console:連接至指定domain的控制臺(tái);
域的設(shè)備資源管理:
cpu-stats
vcpuinfo
vcpucount
setvcpus
vcpupin
setmaxmem
setmem
attach-disk/detach-disk/domblklist:磁盤設(shè)備的熱插拔;
attach-interface/detach-interface/domiflist:網(wǎng)絡(luò)接口設(shè)備的熱插拔;
type:bridge
source:BRIDGE_NAME
注意 :無(wú)須事先創(chuàng)建網(wǎng)絡(luò)接口設(shè)備;
Domain Monitoring (help keyword 'monitor')
domiflist
domblklist
...
9、圖形管理工具:
kimchi:基于H5研發(fā)web GUI; virt-king;
OpenStack: IaaS
oVirt:
proxmox:
管理工具棧:https://www.linux-kvm.org/page/Management_Tools