文章标题

来源:互联网 发布:磁金融 知乎 编辑:程序博客网 时间:2024/06/08 01:06

什么是虚拟化?
Virtualization
通过虚拟化技术,将单独的计算机逻辑上模拟成多台逻辑计算机;->虚拟化过程
虚拟化:使用软件的方法重新定义划分IT资源[如:SDN(Software Define Network)]
虚拟化的优缺点:
优点:
1、节省物理资源[每台逻辑计算机资源互补影响,支持动态分配、灵活调度可作为独立的一个体]
2、虚拟化可以构建一个整体的系统平台,方便管理和维护
3、适用性强;

缺点:
1、物理设备出现损坏会导致,虚拟化系统重组;
2、故障率提升;
计算机的五大组件:
处理器、I/O设备、存储器、控制器
可以做虚拟化的组件有:
存储虚拟化、CPU虚拟化、I/O虚拟化
实现虚拟化:
在操作系统和底层硬件之间,添加了一种运行在基础物理服务器和操作系统之间的中间软件层
[Hypervisor];有可以叫做VMMVirtual machine monitor
作用:允许多个操作系统和应用共享硬件,同时可以在虚拟出来的各个虚拟机之间施加防护;
分配资源、和硬件设备;

虚拟化的分类:
一、完全虚拟化[主流]
通过Hypervisor捕捉CPU指令,为指令访问硬件控制器和外设充当中介,
能够让任何操作系统工作在虚拟服务器上,而它们并不知道自己运行在虚拟化环境中;
缺点:性能不如直接调用物理设备机器。【因为Hypervisor需要占用一些资源,用于处理资源调控】
二、准虚拟化
完全虚拟化是处理器密集型技术,因为它要求Hypervisor管理各个虚拟服务器,并让它们彼此独立
。减轻这种负担的一种方法就是,改动客户操作系统,让它以为自己运行在虚拟环境下,能够与Hypervisor协同工作,这种方法就叫准虚拟化。
优点:性能高,可以通过准虚拟化处理的服务器和Hypervisor协调工作;相应能力几乎不亚于未经过虚拟化处理的服务器。它的客户操作系统(Guest OS)集成了虚拟化方面的代码。该方法无需重新编译或引起陷阱,因为操作系统自身能够与虚拟进程进行很好的协作。
如:XEN
三、系统虚拟化:
实现虚拟化还有一个方法,那就是在操作系统层面增添虚拟服务器功能。如:Solaris Container;
就操作系统层的虚拟化而言,没有独立的hypervisor层。相反,主机操作系统本身就负责在多个虚拟服务器之间分配硬件资源,并且让这些服务器彼此独立。一个明显的区别是,如果使用操作系统层虚拟化,
所有虚拟服务器必须运行同一操作系统(不过每个实例有各自的应用程序和用户账户)。
操作系统层虚拟化的灵活性比较差,但本机速度性能比较高。此外,由于架构在所有虚拟服务器上使用单一、标准的操作系统,管理起来比异构环境要容易。
四、桌面虚拟:
桌面虚拟化主要功能是将分散的桌面环境集中保存并管理起来,包括桌面环境的集中下发,集中更新,集中管理。
硬件虚拟化支持功能让hypervisor从极其繁重的管理事务中脱离出来。这除了提高性能外,还有操作系统不用改动就能在准虚拟化环境下运行,包括Windows环境。

五、硬件虚拟化
Intel虚拟化技术[IVT:Intel Virtualization Technology)],通过虚拟机查看器(VMM,Virtual Machine Monitor)来虚拟一套硬件设备,以供客操作系统使用。这些技术以往在VMware与Virtual PC上都通过软件实现,而通过IVT的硬件支持可以加速此类软件的进行。

AMD、Intel
AMD[AMD-V]、Interl[IVT]

虚拟化技术:[实现工具]
通过软件层面实现虚拟化,开源和商业虚拟化
典型:Xen、KVM、Vmware、Docker、Hyper-V

开源:Xen和KVM
商业化:Hyper-V[Microsoft]
Docker是一种容器技术,属于一种轻量级虚拟化技术

CPU虚拟化:按时间切割
模拟:[emulation]软件方式实现,上层架构和底层可以不一样;需要模拟环0,1,2,3
虚拟:[virtulization]上层架构和底层要保持一致
完全虚拟化[full-virtulization]:
宿主机完全虚拟出一个完整的平台,guest不清楚自己运行在虚拟环境中;只需要模拟环0,
假设各guest的内核运行在环1(实际上不可能运行在环1,因为环1没有特权指令)。
BT:二进制翻译(软件)
HVM:硬件辅助的虚拟化(硬件),模拟出环-1,host的内核运行在环-1,guest内核运行在环0上,
此时环0上没有特权指令,guest运行特权时指令cpu会被触发,这个过程不需要hyper进行监控,提高性能。
半虚拟化[para-virtulization]:
各host知道自己运行在虚拟化环境中,当需要运行特权指令时,直接请求宿主机的内核
vm monitor=hypervisor 虚拟化监视器相当于内核;
hypervisor运行在硬件平台上,对底层硬件(cpu和内存不包括io)使用分配过程虚拟成hyper call(hyper 调用),
虚拟机的内核运行特权指令时,调用hyper call;
求宿主机的内核
vm monitor=hypervisor 虚拟化监视器相当于内核
hypervisor运行在硬件平台上,对底层硬件(cpu和内存不包括io)使用分配过程虚拟成hyper call(hyper 调用),虚拟机的内核运行特权指令时,调用hyper call

内存虚拟化:按空间切割
进程视角看内存:线性地址空间 虚拟地址
内核视角看内存:物理地址空间
MMU将线性地址转化为物理地址
1、MMU:memory management unit,称为内存管理单元,或者是存储器管理单元,
MMU是硬件设备,它被保存在主存(main memory)的两级也表控制,并且是由协处理器CP15的寄存器1的M位来决定是enabled还是disabled。MMU的主要作用是负责从CPU内核发出的虚拟地址到物理地址的映射,并提供硬件机制的内存访问权限检查。MMU使得每个用户进程拥有自己的地址空间(对于WINCE5.0,每个进程是32MB;而对于WINCE6.0,每个进程的独占的虚拟空间是2GB),
并通过内存访问权限的检查保护每个进程所用的内存不被其他进程破坏。
Intel:EPT[Extended Page Table]
AMD:NTP[Nested Page Table]
VA:virtual address 称为虚拟地址
PA:physical address称为物理地址
CPU通过地址来访问内存中的单元,如果CPU没有MMU,或者有MMU但没有启动,那么CPU内核在取指令或者访问内存时发出的地址(此时必须是物理地址,假如是虚拟地址,那么当前的动作无效)将直接传到CPU芯片的外部地址引脚上,直接被内存芯片(物理内存)接收,这时候的地址就是物理地址。如果CPU启用了MMU(一般是在bootloader中的eboot阶段的进入main()函数的时候启用),
CPU内核发出的地址将被MMU截获,这时候从CPU到MMU的地址称为虚拟地址,而MMU将这个VA翻译成为PA发到CPU芯片的外部地址引脚上,也就是将VA映射到PA中。MMU将VA映射到PA是以页(page)为单位的,对于32位的CPU,通常一页为4k,物理内存中的一个物理页面称页为一个页框(page frame)。
虚拟地址空间划分成称为页(page)的单位,而相应的物理地址空间也被进行划分,单位是页框(frame).页和页框的大小必须相同。
2、CPU访问内存时的硬件操作顺序
1)CPU内核发出VA请求读数据,TLB(translation lookaside buffer)接收到该地址,那为什么是TLB先接收到该地址呢?
因为TLB是MMU中的一块高速缓存(也是一种cache,是CPU内核和物理内存之间的cache),它缓存最近查找过的VA对应的页表项,如果TLB里缓存了当前VA的页表项就不必做translation table walk了,否则就去物理内存中读出页表项保存在TLB中,TLB缓存可以减少访问物理内存的次数。
2)页表项中不仅保存着物理页面的基地址,还保存着权限和是否允许cache的标志。MMU首先检查权限位,如果没有访问权限,就引发一个异常给CPU内核。然后检查是否允许cache,如果允许cache就启动cache和CPU内核互操作。
3)如果不允许cache,那直接发出PA从物理内存中读取数据到CPU内核。
4)如果允许cache,则以VA为索引到cache中查找是否缓存了要读取的数据,如果cache中已经缓存了该数据(称为cache hit)则直接返回给CPU内核,如果cache中没有缓存该数据(称为cache miss),则发出PA从物理内存中读取数据并缓存到cache中,同时返回给CPU内核。
但是cache并不是只去CPU内核所需要的数据,而是把相邻的数据都去上来缓存,这称为一个cache line。ARM920T的cache line是32个字节,例如CPU内核要读取地址0x30000134~0x3000137的4个字节数据,cache会把地址0x30000120~0x3000137(对齐到32字节地址边界)的32字节都取上来缓存。
3、TLB:Translation Lookaside Buffer.
根据功能可以译为快表,直译可以翻译为旁路转换缓冲,也可以把它理解成页表缓冲。里面存放的是一些页表文件(虚拟地址到物理地址的转换表)。当处理器要在主内存寻址时,不是直接在内存的物理地址里查找的,而是通过一组虚拟地址转换到主内存的物理地址,TLB就是负责将虚拟内存地址翻译成实际的物理内 存地址,而CPU寻址时会优先在TLB中进行寻址。处理器的性能就和寻址的命中率有很大的关系。
由于CPU首先接到的是由程序传来的ee虚拟内存地址,所以CPU必须先到物理内存中取页表,然后对应程序传来的虚拟页面号,在表里找到对应的物理页面 号,最后才能访问实际的物理内存地址,也就是说整个过程中CPU必须访问两次物理内存(实际上访问的次数更多)。因此,为了减少CPU访问物理内存的次 数,引入TLB。

MMU的虚拟化:
INTEL:EPT,Extended Page Table
AMD:NTP,Nested Page Table

TLB的虚拟化:
tagged TLB
I/O虚拟化:
I/0:
外存、硬盘、光盘、u盘
网络设备:
网卡
显示设备:
VGA:frame buffer机制;
键盘鼠标:
ps/2,usb:完全模拟实现,当前焦点捕获,将虚拟设备和物理设备建立关联关。
I/O虚拟化的方式:
模拟:完全使用软件来模拟真实硬件
半虚拟化:内核明确知道虚拟化模块中
IO-through:IO透传,让虚拟机直接使用物理设备,几乎接近于硬件性能,硬件必须要支持透传技术;
Intel:VT-d 基于北桥的硬件辅助的虚拟化技术;提升I/O的可靠、灵活性性能
VMM两种虚拟化的实现方式:
主机虚拟化技术的两种类型:
Type-I(能等同于半虚拟化吗?):xen,vmware ESX/ESXi
虚拟机在系统上创建之后,首先运行监控程序;[没运行任何内核]
Type-II(能等同于完全虚拟化吗?):kvm,vmware workstation,virtualbox
在系统上创建后,直接启动是一个操作系统;在操作系统上安装一个软件[虚拟机管理器]

Intel硬件辅助的虚拟化:
CPU:vt-x,EPT,tagged-TLB
IO/CPU:vt-d,vt-x,IOV,VMDq
第一类:跟处理器相关:vt-x
第二类:跟芯片相关:vt-d
第三类:跟IO相关:VMDq和SR-IOV
注意:在实现硬件模拟方面,在linux上使用最多的为:QEMU[可以跨平台管理]、virtio

虚拟化技术的分类:
模拟:Emulation
上层的虚拟机架构和底层可以不一样,性能比较差
著名的模拟器 PearPC,Bochs,QEMU
完全虚拟化:Full Vitualization 也称为native virtulization
类似于模拟但不完全等同于模拟(模型相同)
cpu和内存不做模拟,只作管理,i/o需要模拟。
两种加速方式:BT,HVM
著名软件实现:VMware Workstation,VMware Server,VirtuaBox,Parallels,Desktop(实现虚拟化的方式灵活,轻量),KVM,Xen(HVM)
半虚拟化:para-virtualization [guest的OS内核需要知道运行在虚拟化环境中,虚拟机的架构和底层架构完全一样]
hyper将底层物理硬件平台略加修改后输出为虚拟机环境,虚拟机的架构和底层架构完全一样
虚拟机上的操作系统内核需要做修改,让其明确知道自己运行在虚拟化环境中,其内核不能直接发起系统调用、而是发起hypercall来实现
Xen,UML(user-mode linux) ->用户模式linux
OS虚拟化:
本身没有hyper,直接运行于物理硬件上,
将操作系统的用户空间切割成多份,每份各自独立,互相隔离,每个用户空间当成一个虚拟机来用
性能好,但隔离性,稳定性不好
更多地被称为容器级虚拟化,OpenVZ[可提供vps],LXC(linux container),libcontainer, Solaris Containers,FreeBSD jails
库虚拟化:
虚拟化一个程序的运行环境
wine,
应用程序虚拟化:
jvm
虚拟化网络的认识和配置[SDN]、KVM的配置

虚拟化网络:
网络虚拟化模型:bridge 桥接、Host-Only 仅主机、route 路由、NAT、isolation 隔离

Bridge桥接[把物理机上的网卡当作虚拟设备的网卡]
在桥接方式下,模拟一个虚拟的网卡给虚拟系统,宿主系统对于虚拟系统来说相当于是一个桥接
器虚拟系统好像是有自己的网卡一样,自己直接连上网络,也就是说虚拟系统对于外部是直接可见。
注意:Bridge模式可以直接通过本地物理网卡,上Internet;

Host-Only仅主机[]
默认情况下,虚拟机只能到主机访问虚拟机之间也能互相通信而不能访问Internet。
[无法使得虚拟机访问外网]

route 路由
仅主机模式只要物理机打开网卡间转发功能就成了route模式

NAT
仅主机模式模型一样[可以通过NAT技术,实现外网的访问]

isolation 隔离
各虚拟机虚拟网卡连在虚拟交换机上,虚拟机之间能互相通信,但虚拟机与主机和internet不能
通信。


检查CPU是否支持虚拟化技术
egrep ‘vmx|svm’ /proc/cpuinfo #有输出则可以使用
关闭selinux状态关闭防火墙
安装KVM需要的组件包;
yum install -y kvm python-virtinst libvirt bridge-utils virt-manager qemu-kvm-tools virt-viewer
yum groupinstall “Desktop” 安装桌面环境
yum groupinstall “Chinese Support” 安装中文包

libvirt 虚拟机管理工具
virt-manager 图形化界面管理虚拟机
bridge-utils 网络桥接工具
python-virtinst python组件,记录创建VM时的xml值
qemu-kvm-tools kvm调试工具
virt-viewer 图像化界面

lsmod |grep kvm #检查KVM模块是否安装

设置桥接网络,首先关闭网络
service network stop
vim /etc/sysconfig/network-script/ifcfg-br0 #配置如下
DEVICE=”br0”
TYPE=”Bridge”
ONBOOT=”yes”
BOOTPROTO=”static”
IPADDR=10.1.23.91
PREFIX=24
GATEWAY=10.1.23.254
DELAY=0

vim /etc/sysconfig/network-script/ifcfg-em2 #配置如下
DEVICE=”em2”
BOOTPROTO=”static”
HWADDR=”D4:AE:52:C8:44:70”
NM_CONTROLLED=”no”
ONBOOT=”yes”
TYPE=”Ethernet”
BTIDGE=”br0”
UUID=”df80185e-a55f-4874-b9f5-475bf57d64c9”
IPADDR=”10.1.23.4”
NETMASK=”255.255.255.0”
GATEWAY=”10.1.23.254”

service network start 启动服务
ifconfig 检查网络信息
brctl show

> bridge name   bridge id           STP enabled interfaces> br0           8000.d4ae52c84470   no          em2> virbr0        8000.52540074b466   yes         virbr0-nic

若不是如上显示,则按如下输入命令
service network stop
brctl addif br0 em2
ifup br0
ifup em2
检查ip转发是否开启
cat /etc/sysctl.conf |grep ip_forward
net.ipv4.ip_forward = 1
如果没有开启,则
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
/sbin/sysctl -p
修改qemu.conf配置
vi /etc/libvirt/qemu.conf
vnc_listen = “0.0.0.0”修改vnc监听端口

创建空硬盘,相当于物理机的硬盘(公司常用的qcow2格式)
qemu-img create -f qcow2 /virtal/data/server.qcow2 100G
启动libvirt
/etc/init.d/libvirtd start
virt-install –virt-type kvm –name server –ram 1024 –cdrom=/virtal/CentOS-6.3-x86_64-bin-DVD1.iso \
–disk path=/virtal/data/server.qcow2,size=100 –network bridge=br0 –graphics vnc,listen=0.0.0.0,port=5904 –foce –autostart

查看虚拟机状态

virsh list –all
Id Name State
1 server running

ss -a|grep 5904
查看vnc端口是否启用
LISTEN 0 1 :5904 :*

在windos上配置vnc viewer
访问10.1.23.4:5904即可安装
若vnc配置失败,则在桌面平台的linux终端输入
virt-viewer 查看安装程度

常用virsh指令
1)virsh list 列出当前虚拟机列表,不包括未启动的
2)virsh list –all 列出所有虚拟机,包括所有已经定义的虚拟机
3)virsh destroy vm-name 关闭虚拟机
4)virsh start vm-name 启动虚拟机
5)virsh edit vm-name 编辑虚拟机xml文件
6)virsh undefine vm-name 删除虚拟机
7)virsh shutdown vm-name 停止虚拟机
8)virsh reboot vm-name 重启虚拟机
9)virsh autostart vm-name 虚拟机随宿主机启动
10)virt-clone -o test -n test01 –-file /data/test01.img
在-o后面为被克隆虚拟机名称,-n后克隆所得虚拟机名称,file为克隆所得虚拟机镜像存放地址

克隆虚拟机
virt-clone -o server -n server1 –-file /home/virtal/server1.img(server1.qcow2)
virsh edit server1
修改vnc监听端口
virsh start server1
利用vnc远程连接该虚拟机,修改ip地址与mac
vi /dev/udev/rules.d/70-presistent-net.rules
注释第一个eth0
记录mac地址
vi /etc/sysconfig/network-script/ifcfg-eth0
修改MAC地址与IP地址
reboot

原创粉丝点击