第一课时
[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的网卡供客户使用
第二课时
半虚拟化驱动
KVM必须要求有硬件虚拟化辅助技术(Intel VT-x,AMD-V)的hypervisor
(QEMU提供了全虚拟化环境
缺点:每次I/O操作路径较长,有较多的VMentry,VMExit,需要多次上下文切换,也需要多次数据复制,性能较差。)
半虚拟化驱动virtio:利用物理机驱动批量处理虚拟机的I/O请求,效率高。
linux中virtio驱动
内核已自带
CONFIG.*VIRTIO.*=m #内核编译配置文件与virtio有关的
编译好内核后,查看驱动
# find /lib/modules/2.6.32-279.el6.x86_64/ -name "virtio*.ko"
会显示一些virtio_net.ko virtio_pci.ko virt-ring.ko
查看已加载的
# lsmod|grep virtio
2.安装windows中的virtio驱动
# yum install virto-win
安装后可看到/usr/share/virtio-win/目录下有一个virtio-win.iso文件。
启动win7客户机,
#qemu-system-x86_64 win7.img -smp 2 -m 2048 -cdrom /usr/share/virti-win/virtio-win.iso -vnc :0 -usbdevice tablet
然后进入win7,安装驱动
安装后使用virtio驱动后重新启动
使用virtio_balloon
系统运行时改变内存大小
启动virtio_balloon
编译内核时选项 CONFIG_VIRTIO_BALLOON=m
操作步骤
1)启动客户机
# qemu-system-x86_64 rhel6u3.img -smp2 -m 2048-balloon virtio
2)在客户机中查看内存使用情况
# lspci
查看是否加载驱动
# lspci -s 00:04.0 -v|grep virtio-pci
# free -m
3)在qemu monitor 中查看和改变客户机占用的内存
(qemu) info balloon
balloon:actual=2048
(qemu) balloon 512
(qemu)info balloon
balloon: actual=512
-----
KVM动态调整内存工具:virsh setmem <domain-id or domain-name><Amount of memory in KB>
设备直接分配(VT-d)
VT-d
1)Emulated device :QEMU纯软件模拟设备
2) Virtio device :实现VIRTIO API的半虚拟化驱动的设备
3) PCI device assignment: PCI 设备直接分配
VT-D不需要与Hypervisor(KVM)参与,极大的提高IO性能。
需要硬件支持 VT-D
配置:
1)打开主板VT-D选项
2)编译配置,REDHAT6.3+默认
启动系统后
# dmesg | grep DMAR -i
# dmesg | grep IOMMU -i # 如未打开 那么在内核配置文件中CONFIG_PCI_STUB=m
3)在宿主机中隐藏设备
# modprobe pci_stub
# lsmod | grep stub
ls /sys/bus/pci/drivers/pci-stub/
都有显示回复即可
查看设备的vendorID deviceID
# lspci -Dn -s 08:00:00
-D domain,-n 用数字显示ID,-s
绑定设备到pci_stub驱动
echo -n "8086 10b9" > /sys/bus/pci/drivers/pci-stub/new_id
echo 0000:08:00.0 > /sys/bus/pci/devices/0000:08:00.0/driver/unbind
echo 0000:08:00.0 > /sys/bus/pci/drivers/pci-stub/bind
# lspci -k -s 08:00.0
设备驱动是intel的e1000e,绑定后为pci_stub
第三课时
主、从服务器系统版本:
Red Hat Enterprise Linux Server release 5.5 (Tikanga
客户端系统版本:
Red Hat Enterprise Linux AS release 4 (Nahant Update 7)
配置过程
1,配置主服务器
为便于区分主从服务器,建议修改node3,node9的主机名
将node3修改为nis,将node9 修改为slavenis
1)编辑/etc/sysconfig /network文件
HOSTNAME=nis
2)修改/etc/hosts文件
192.168.111.3nis.godson.ictnisnis
192.168.111.9 slavenis.godson.ictslavenisslavenis
重启网络:
/etc/init.d/network restart
3)修改/etc/yp.conf文件,加入一条
domain godson.ict server slavenis #指定备用服务器
4)修改/var/yp/Makefile文件
NOPUSH=false #允许主服务器向从服务器传递数据库文件
vim /var/yp/ypservices 添加从服务器主机名
slavenis.godson.ict
重启服务:
/etc/init.d/ypserv restart
/etc/init.d/ypbind restart
/etc/init.d/yppasswdd restart
/etc/init.d/ypxfrd restart
5)查看服务是否启动:
rpcinfo -p
6)将服务设置开机启动:
chkconfig --level 35 ypxfrd on
7)建立主服务器的数据库文件:
/usr/lib64/yp/ypinit -m
2,配置从服务器
1)修改/etc/sysconfig/network文件
HOSTNAME=slavenis
NISDOMAIN=godson.ict
2)修改/etc/rc.local文件
echo “/bin/nisdomainname godson.ict”>>/etc/rc.local
3)修改/etc/hosts文件
192.168.111.3nis.godson.ictnisnis
192.168.111.9 slavenis.godson.ictslavenisslavenis
重启网络:
/etc/init.d/network restart
4)安装rpm包:ypserv,ypbind,yp-tools,portmap
5)修改/etc/nsswitch.conf文件
6)修改/etc/yp.conf文件
domain godson.ict server nis
domain godson.ict server slavenis
ypserver nis
7)修改/etc/ypserv.conf文件
* : godson.ict : * : none
重启服务:
/etc/init.d/ypserv restart
/etc/init.d/ypxfrd restart
/etc/init.d/ypbind restart
/etc/init.d/portmap restart
8)将服务设置开机启动:
chkconfig --level 35 ypxfrd on
chkconfig --level 35 ypbind on
chkconfig --level 35 ypserv on
chkconfig --level 35 portmap on
9)同步主服务器的数据库文件:
/usr/lib64/yp/ypinit -s nis