第一课时

[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请求,效率高。

  1. 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