-
进程使用的内存分为
RSS
常驻内存集,page cache
以及anon page
; -
对于
TLB
来说是用来加速MMU
进行内存单元查找的过程的; -
CPU
通过可编程中断控制器向IO
设备提供终端控制向量; -
虚拟化技术
-
虚拟化是用来虚拟物理硬件的技术,可以讲物理硬件虚拟成为多种不同的
OS
;,虚拟化技术面临的; -
CPU
的虚拟化是通过进行时间片划分,而进行虚拟化的,并且还需要虚拟出一些特权指令使得虚拟机认为自己是运行在ring 0
上面的;通常来说CPU
执行的指令可以分为三种,普通指令,特权指令,以及可能引起特权指令执行的敏感指令,对于X86
平台的的物理机有些敏感指令无法完成虚拟化,虚拟机的内核在尝试运行某些特权指令的时候,物理机内核必须能够捕获到这些指令; -
面临的挑战:
- 1.一般来说操作系统内核运行在
Ring 0
级别,执行特权指令,用户空间的程序运行在ring 3
级别,执行非特权指令; - 2.特权级别压缩:通常来说,物理机运行在
Ring 0
级别,虚拟机运行在Ring 3
级别,物理机通过分页或者限制的方式保护物理内存的访问,但是在64 bit
下限制不起作用,而且分页机制不区分Ring 0 1 2 3
,所以虚拟机只能够运行在Ring 3
,并且物理机需要监控虚拟机对于敏感寄存器的访问,为了防止虚拟机运行在Ring 0
级别的指令,同时又需要保护降级后的虚拟机不应该被物理机进程影响; - 3.地址空间压缩:通常来说物理机使用的内核的地址空间是从
0
开始的,虚拟机使用的地址空间也应该是从0
地址段开始的,这通常需要在物理机和虚拟机之间建立映射关系; - 4.中断虚拟化:来自物理机的硬件中断,都应该交给物理机物理机处理,并且虚拟机对于物理硬件的访问,会频繁导致物理机内核陷入中断;
- 1.一般来说操作系统内核运行在
-
memory
的虚拟化需要通过空间上面的划分,通过将已经离散的地址空间按照一定类似于MMU
的机制映射成为一块整体的地址空间;这里面出现的问题就是在进行地址转换的时候,虚拟机本身的操作系统需完成一次内存地址映射的过程,之后物理机还需要完成一次内存地址映射的过程,这样导致性能低下;所以实现了MMU
的虚拟化,虚拟机的MMU
实现了从Virtual address --> Guest Physical address
的转换,物理机的MMU
实现了从Guest Physical Address ---> Host Physical Address
的转换.MMU
的虚拟化一步实现从Virtual Address --> Host Virtual Address
;- 这种技术的实现
Intel
是通过Extend Page Tables
,AMD
是通过Nested Page Tables
,并且通过了标记TLB
来避免虚拟机频繁切换时,频繁刷写TLB
用来提高TLB
缓存的命中率;
- 这种技术的实现
-
网卡的虚拟化:最简单的方式是进行模拟,虚拟主机之间的网络通信可以通过进程间通信的机制来实现,如果需要和外部的主机通信,通常有这样几种机制
SNAT 桥接 host only
;- 通常来说这些虚拟主机都是在一个被物理主机虚拟出来的一个交换机的网络
vmnet
这个网络内部进行通信的,IP
地址为仅主机模式时,也是可以实现和物理主机通信的; - 虚拟通道表示的是二层网络上面的专属网络,这个无法和物理主机进行通信,也无法和外部主机进行通信;
SNAT
:表示的含义是通过源地址转换的机制,来实现和外部主机的通信;这是在三层进行转换的;Bridge
:表示的含义是物理机网卡工作在混杂模式,接收任何MAC
地址的网络软件包,通过MAC
地址的转换是在二层完成的,网桥本质上模拟的就是交换机;这种方式不会自动提供DHCP
服务器;- 为了提高虚拟机网卡的性能,可以通过将这些设备的驱动做成系统调用,直接交给
Virtual
进行来调用系统调用;这种技术就是半虚拟化技术,虚拟机是明白自己处于虚拟化环境中;
- 通常来说这些虚拟主机都是在一个被物理主机虚拟出来的一个交换机的网络
-
IO
设备的虚拟化,通常也是通过模拟的方式来实现的,然后再物理机硬盘上面创建本地回环文件,将这个文件模拟为虚拟机的磁盘使用;这样性能是比较低下的,可以通过提供形象存储设备,来实现数据的存储,可以提高虚拟机的性能;- 1.硬件设备的模拟:
- 2.虚拟化技术:通过系统调用直接交给物理硬件设备;
- 3.
IO
透传:表示每一个虚拟机直接使用物理硬件设备,Host OS
提供对于硬件的简单管理功能;
-
CPU
硬件不支持的虚拟化技术成为模拟; -
CPU
硬件是支持的虚拟化技术成为HVM
,硬件辅助的虚拟化技术; -
虚拟机了解自己是运行在虚拟化环境中的,称为
PV
; -
通过类似于半虚拟化技术,将
CPU
的特权指令集合,网卡等硬件设备做成系统调用的方式提供给虚拟机使用,这种机制成为hypervisor Call
;半虚拟化技术,需要修改虚拟机的内核,来执行这些; -
虚拟化技术之一:
PV ON HVM
; -
虚拟化软件的三个标准
-
1.等价执行:除了资源上面的可用以及时间上面的不同之处,程序在虚拟化环境中以及真实环境中的执行是完全相同的;
-
2.性能:指令集中的大部分指令是可以直接运行在
CPU
上面的; -
3.安全:物理机需要能够完全控制系统资源;
-
硬件虚拟化技术:
Intel
:通过VT-X
,通过提供Ring -1
级别来提供虚拟化技术;AMD
:AMD-V
:也是通过类似的技术来实现的;
-
虚拟化技术模型
-
Host OS
:借助于Host
主机的VMM
技术,可以提供对于虚拟主机的管理功能; -
Hypervisor OS
:通过将VMM
直接安装在物理硬件上面,用来提供对于虚拟主机的管理功能,而不是借助于OS
,但是VMM
必须提供对于CPU memory IO
以及中断的管理;
-
Zen
:本身仅仅提供CPU memory
以及对于中断的管理,本身不提供对于额外的硬件的管理,在新建立成功之后,需要立即创建虚拟机Linux
,用来提供额外的硬件的驱动,并且提供对于虚拟机的管理;第一个创建的主机成为domain 0
,这是一个特权主机,主要提供驱动程序,以及对其他主机的管理,对硬件的直接管理,需要借助于Xen
;Domain U
对于CPU memory Interput
的访问是可以直接通过Xen
来进行的,对于其他硬件的管理,首先联系Domain 0
通过Xen
再联系Domain 0
的驱动程序,最后交给硬件完成执行; -
全虚拟化技术的优势是操作系统内核不用提供特殊的对于
Hyper Call
的调用机制; -
Qemu
:法国人开发的,并且可以提供跨平台的硬件支持,可以用于创建虚拟软件的设备,Xen
提供了专门的管理虚拟机的软件Xend
;基于xend
的图形化管理工具Openstack
;Redhat
提供的管理工具是Virsh
; -
管理软件的框架图
-
虚拟化技术之
KVM
-
表示的含义是
Kernel-based Virtual Machine
,也就是基于内核的虚拟机,KVM
是Linux
内核的一个模块,当装载了KVM
这个模块之后,就会变成Hypervisor
,KVM
同样需要利用Linux
提供的内核驱动,并且需要结合与其他的管理工具,对于创建硬件的管理需要借助于qemu
,KVM
对于CPU
的管理比Qemu
模拟出来的更加高效,可以更好的使用硬件的性能;KVM + Qemu
; -
KVM
必须能够泡在64 bits
的平台上面,并且要求硬件支持虚拟化; -
KVM Xen
在内核2.6.3
以后都被整合进入了内核;Redhat
收购了KVM
;使用的完全虚拟化技术,通过使用Virtio
就支持半虚拟化技术;并且支持透传技术; -
Xen[剑桥开发]
被Citrix
收购,仅次于Vmware
的第二大虚拟化解决方案; -
Hyper-V
:是Windows
; -
虚拟化技术的分类
-
完全虚拟化技术
-
通过
VMM
监控虚拟机的的kernel
运行的指令,并且需要通过Binary Translate
来翻译某些特权指令,并且将可能危及其他虚拟机的特权指令翻译为仅仅对当前主机生效的二进制指令,引入硬件辅助虚拟化技术之后,Binary Translate
可以通过硬件来实现; -
通过完全虚拟化实现的技术可以弥补底层硬件的差异,方便在不同的硬件设备上面迁移;
-
半虚拟化技术
-
Guest OS
的内核是需要清楚地知道自己是运行在虚拟化环境中,并且是运行在VMM
之上的,不在直接和硬件交互,VMM
通过将某些模块做成Hypervisor Call
来提供给Guest OS
;
-
Container
:表示容器,通过提供用户空间的容器来使用同一个内核,直接完成对于硬件的;OpenVZ
;
-
Library virtualizaion
Wine
:可以支持大多数Windows
应用程序;Windows
可以使用cywin
用来支持Linux
应用;Intel
通过三种技术VT-X EPT
以及IOMMU
来支持虚拟化技术;
-
安装
Xen
的两种方式:- 通过官方提供的
Xcp
,本身是一个Xen + Linux发行版本
安装之后就是一个Domain 0
的界面; - 或者首先安装一个
Linux
发行版本,然后安装OS
,配置/etc/grub.conf
使用Xen
作为内核引导进行启动,将Linux
的内核文件作为新系统模块来使用;
- 通过官方提供的
-
Xen
的两种虚拟化解决方案 -
半虚拟化解决
-
全虚拟化解决
-
KVM虚拟化
-
KVM
必须是64 Bits
的虚拟化,并且需要支持硬件虚拟化
-
需要装载两个模块,根据
CPU
的类型进行装载
-
安装
KVM
需要四个软件包组Vritualzation, Virtualzation Client,Virtualization Plaform,Virtualization Tools
;
-
KVM
的内核架构
-
将每一个虚拟机作为一个
Linux
进程进行管理,虚拟机的CPU
相当于Linux
内核空间中的一个个线程,提供的内核接口是
-
通常来说
virsh
以及qemu
都是和这个设备文件打交道的; -
KVM
的管理工具
-
首先需要安装下面的组
[root@server24 ~]# yum group install "Virtualization" "Virtualization Client" " Virtualization Platform" " Virtualization Tools" -y //我这里一共安装了171个软件包;
- 安装
KVM
成功之后,需要执行
[root@my Desktop]# service libvirtd start
Starting libvirtd daemon: [ OK ]
[root@server24 ~]# chkconfig --add libvirtd
[root@server24 ~]# chkconfig libvirtd on
- 会自动创建一个文件,这个文件表示的含义是一个
NAT
模型的网桥设备;
- 创建一个物理桥
[root@server24 ~]# virsh iface-bridge eth0 br0
- 获取当前主机的连接接口
[root@server24 ~]# virsh uri
qemu:///system
- 创建一个虚拟机,
[root@my Desktop]# virt-install --connect qemu:///system --virt-type qemu --name rhel5 --ram 512 --disk path=/var/lib/libvirt/images/rhel5.8.img,size=10 --network --cdrom /iso/rhel-server-5.8-x86_64-dvd.iso
-
virsh
:uri
:用于查看当前主机的hypervisor
的路径;connect
:用于连接某个虚拟主机;define
:用于根据xml
配置文件;
-
创建一个虚拟主机
mkdir /kvm/vml -pv
qemu-img create -f raw /kvm/vml/rhel6.img 8G
losetup -f
losetup /dev/loop4 /kvm/vml/rhel6.img
kpartx -av /dev/loop4
- 进行格式化
[root@my Desktop]# mkfs.ext4 /dev/mapper/loop4p1
[root@my Desktop]# mkfs.ext4 /dev/mapper/loop4p2
- 创建两个目录
[root@my Desktop]# mkdir /mnt/{boot,sysroot}
[root@my Desktop]# mount /dev/mapper/loop4p2 /mnt/sysroot/