KVM虚拟化技术 笔记
[S1 虚拟化与云计算]
通过网络获取所需服务
分为三类:
SaaS EndUsers 基础设施类
PaaS ApplicationDeveloper 平台服务
IaaS NetworkArchitects 软件服务
私有云:
1.部署在企业内部网络
2.部署在云服务商上
现大规模商用的厂家
亚马逊IaaS 全球最大的公有云服务提供商
威瑞VMware vSphere 私有云占有率最高的虚拟化解决方案
思杰Citrix Xen
RHEV
IBM蓝云
虚拟化分类:
1.软件虚拟化
2.硬件方案
或
1.准虚拟化 缺乏硬件支持情况
2.全虚拟化
KVM:Kernel Virtual Machine:内核虚拟机
优势:
1.内存管理:Kernel Same-page Merging,KSM)
2.存储
3.设备驱动程序
4.性能和可伸缩性:KVM宿主机支持4096个CPU核心,64TB内存
[S2KVM核心基础功能]
硬件平台和软件版本说明
1.硬件平台:硬件要支持辅助虚拟化(Intel VT-x)
2.KVM内核:在linux.git源码仓库中执行
# git tag
v3.4-rc6
v3.4-rc7
v3.5-rc1
...
#git checkout v3.5
在kvm.git中,没有v标签,可以
# git log
# git checkout 73bcc499
在qemu-kvm.git中,可以使用git tag
在编译qemu时,configure加上 --disable-sdl
使用qemu命令行,默认开启对KVM支持,# qemu-kvm 查看KVM默认打开,需要启动QEMU命令行上加上-enable-kvm
CPU配置
QEMU/KVM为客户机提供一套完整的硬件系统环境
客户机所拥有的CPU是vCPU
在KVM环境中,每个客户机都是一个标准的Linux进程(QEMU进程)
每一个vCPU在宿主机中是QEMU进程派生的一个普通线程
客户机的命令模拟实现:
1.用户模式
处理I/O模拟和管理,由QEMU代码实现
2.内核模式
处理需要高性能和安全相关指令。处理客户模式下I/O指令或其他特权指令引起的退出,处理影子内存管理
3.客户模式
执行Guest中的大部分指令,I/O和一些特权指令除外(引起VM-Exit,被hypervisor截获并模拟)
SMP支持
多处理,多进程
逻辑CPU个数
# cat /proc/cpuinfo | grep "pro"|wc -l
多线程支持
# cat /proc/cpuinfo | grep -qi "core id" |echo $?
实际CPU个数
# cat /proc/cpuinfo | grep "physical id" |sort | uniq | wc -l
每个物理CPU中逻辑CPU的个数
logical_cpu_per_phy_cpu=$(cat /proc/cpuinfo |grep "siblings"| sort | uniq | awk -F: '{print $2}')
echo $logical_cpu_per_phy_cpu
在qemu的命令行中,模拟客户机的SMP系统,参数
-qemu n[,maxcpus=cpus][,cores=cores][,threads=threads][,sockets=sockets]
n 逻辑cpu数量
maxcpus 最大可被使用的cpu数量
cores 每个cpu socket上的core数量
threads 每个cpu core上的线程数
sockets 客户机中看的总的cops socket数量
8个客户机logical cpu即宿主机的8个线程
logical cpu 8
physical cpu 2
core cpu 2
logical cpu 4
8个逻辑cpu
2个物理
PUC socket 每个socket有两个核,每个核有2个线程
CPU模型
查看当前qemu支持的所有CPU模型
# qemu-system-x86_64 -cpu ?
启动镜像时,可以使用上命令的结果的CPU模型启动
# qemu-system-x86_64 /root/.../...img -cpu SandyBridge
隔离其他CPU不供客户机使用
grub 文件
root=UUID.... isolcpus=2,3
查看隔离成功
# ps -eLo psr|grep 0|wc-l
然后改变0,检查各个CPU的进程数
把一个有两个的vCPU的客户机绑定到宿主机的两个CPU上
# qemu-system-x86_64 rhel6u3.img -smp 2 -m 512 -daemonize
查看代表vCPU的QEMU的线程
#ps -eLo ruser,pid,ppid,lwp,psr,args |grep qemgrep -v grep
绑定整个客户机的QEMU进程,运行在CPU2上
#taskset -p 0x4 3963
#绑定第一个cCPU线程,使其运行在cpu2上
# taskset -p 0x4 3967
第二个
#taskset -p 0x8 3968
内存配置
QEMU启动命令
-m megs 设置客户机的内存为MB大小
# free -m 查看内存
# dmesg|grep Memory
内存转换
客户机->宿主机(GVA->GPA)执行者:客户机操作系统
客户机<-宿主机(GVA<-GPA)执行者:hypervisor
在EPT加入之后,直接在硬件上支持虚拟化内存地址转换
查看支持EPT VPID
# grep ept /proc/cpuinfo
# cat /sys/module/kvm_intel/parameters/ept
# cat /sys/module/kvm_intel/parameters/vpid
加载ept vpid模块
# modprobe kvm_intel ept=0,vpid=0
# rmmod kvm_intel
# modprobe kvm_intelept=1,vpid=1
大页
x86默认提供4kb内存页面
x86_64支持2MB大小的大页
# getconf PAGESIZE
# cat /proc/meminfo
挂载大页
# mount -t hugetlbfs hugetlbfs /dev/hugepages
# sysctl vm.nr_hugepages=1024
然后让qemu启动项内存参数使用大页
-mem-path /dev/hugepages
挂载大页内存可以显著提高客户机性能,但是,不能使用swap
内存过载使用
1.内存交换(swaping)
2.气球(ballooning):通过virio_balloon驱动来实现宿主机Hyperviosr和宿主机的合作
3.页共享(page sharing):通过KSMkernel Samepage Merging合并多个客户机使用的相同内存页。
存储配置
存储配置和启动顺序
存储的基本配置选项
-hda file :将file作为客户机第一个IDE设备,序号0,客户机中表现/dev/hda或/dev/sda设备
-hdb /-hdc..
-fda file 软盘
-cdrom,cdrom作为hdc,不能共同使用
-mtdblock file 作为客户机自带的一个FLASH存储器 闪存
-sd file sd 卡
驱动器
-driver file=file 文件作为镜像文件加载到客户机的驱动器中
if=interface 指定驱动器使用的接口类型
bus=bus,unit=unit 总线编号,单元编号
index=index 索引编号
media=media 设置驱动器中没接的类型
snapshot=snapshot on/off ~~~~~
....
配置客户机启动顺序的参数
-boot order=drivers,once=drives,menu=on|off,splash=splashfile,splash-time=sp-time
ex:-boot order=dc,menu=on 按F12
存储配置示例
启动客户机命令
# qemu-system-x86_64 -m 1024 -smp 2 rhel6u3.img
# qemu-system-x86_64 -m 1024 -smp 2-hda rhel6u3.img
# qemu-system-x86_64 -m 1024 -smp 2-drive file=rhl6u3.img,if=ide,cache=writehrough
qemu命令
qemu-img:qemu磁盘管理工具
check [-f fmt] filename
fmt:qcow2 qed vdi
create [-f fmt][-o options] filename [size] 创建镜像文件
convert 镜像转换
# qemu-img convertmy-vmware.vmdk my-kvm.img #用这个转换
# qemu-img convert -O qcow2 rhel6u3.img rhel6u3-a.gcow2
info [-f fmt] filename
展示filename镜像文件信息
snapshot [-l|-a snapshot|-c snapshot|-d snapshot] filenamne
rebase
resize filename [+|-] size
QEMU支持的镜像文件格式
1.raw
2.host_device
3.qcow2
4.qcow
cow,vid.vmdk,vpc,sheepdog
客户机存储方式
1.本地
2.物理磁盘或磁盘分区
3.LVM
4.NFS
5.ISCSI
6.本地或光纤通道LUN
7.GFS2
高性能IO使用半虚拟化virtio作为磁盘驱动程序
QEMU支持的网络模式
1.基于网桥(bridge)的虚拟网卡
2.基于NAT(Network Address Translation)的虚拟网络
3.QEMU内置的用户模式网络
4.直接分配网络设备的网络(包括VT-d 和 SR-IOV)
-net nic,model=? 会列出默认虚拟网卡
-net nic,model=e1000 会模拟出一个interl e1000的网卡供客户使用