新闻资讯

域名诊断不同情况的解决教程

花生壳 | 2018-10-15

kvm实现主要基于Intel-V或者AMD-V提供的虚拟化平台,利用普通的Linux进程运行于虚拟态的指令集,模拟虚拟机监视器和CPU。kvm不提供硬件虚拟化操作,其IO操作等都借助QEMU来完成。关于kvm虚拟化的概念和kvm虚拟化克隆原理是什么很多人都不了解,本文介绍kvm虚拟化和kvm虚拟化克隆原理。

kvm虚拟化原理探究

kvm 全称 kernel-based virtual machine,由Qumranet公司发起,2008年被RedHat收购。

kvm有如下特点:
guest作为一个普通进程运行于宿主机
guest的CPU(vCPU)作为进程的线程存在,并受到宿主机内核的调度
guest继承了宿主机内核的一些属性,比如huge pages(大页表)
guest的磁盘IO和网络IO会受到宿主机的设置的影响
guest通过宿主机上的虚拟网桥与外部相连。

虚拟CPU

guest的所有用户级别(user)的指令集,都会直接由宿主机线程执行,此线程会调用kvm的ioctl方式提供的接口加载guest的指令并在特殊的CPU模式下运行,不需要经过CPU指令集的软件模拟转换,大大的减少了虚拟化成本,这也是kvm优于其他虚拟化方式的点之一。
kvm向外提供了一个虚拟设备/dev/kvm,通过ioctl(IO设备带外管理接口)来对kvm进行操作,包括虚拟机的初始化,分配内存,指令加载等等。

虚拟IO设备

guest作为一个进程存在,当然他的内核的所有驱动等都存在,只是硬件被QEMU所模拟(后面介绍virtio的时候特殊)。guest的所有硬件操作都会有QEMU来接管,QEMU负责与真实的宿主机硬件打交道。

虚拟内存

guest的内存在host上由emulator提供,对emulator来说,guest访问的内存就是他的虚拟地址空间,guest上需要经过一次虚拟地址到物理地址的转换,转换到guest的物理地址其实也就是emulator的虚拟地址,emulator再次经过一次转换,转换为host的物理地址。后面会有介绍各种虚拟化的优化手段,这里只是做一个overview。

虚拟机启动过程

第一步,获取到kvm句柄

kvmfd = open("/dev/kvm", O_RDWR);

第二步,创建虚拟机,获取到虚拟机句柄。

vmfd = ioctl(kvmfd, kvm_CREATE_VM, 0);

第三步,为虚拟机映射内存,还有其他的PCI,信号处理的初始化。

ioctl(kvmfd, kvm_SET_USER_MEMORY_REGION, &mem);

第四步,将虚拟机镜像映射到内存,相当于物理机的boot过程,把镜像映射到内存。

第五步,创建vCPU,并为vCPU分配内存空间。

ioctl(kvmfd, kvm_CREATE_VCPU, vcpuid);

vcpu->kvm_run_mmap_size = ioctl(kvm->dev_fd, kvm_GET_VCPU_MMAP_SIZE, 0);

第五步,创建vCPU个数的线程并运行虚拟机。

ioctl(kvm->vcpus->vcpu_fd, kvm_RUN, 0);

第六步,线程进入循环,并捕获虚拟机退出原因,做相应的处理。

这里的退出并不一定是虚拟机关机,虚拟机如果遇到IO操作,访问硬件设备,缺页中断等都会退出执行,退出执行可以理解为将CPU执行上下文返回到QEMU。

open("/dev/kvm")

ioctl(kvm_CREATE_VM)

ioctl(kvm_CREATE_VCPU)

for (;;) {

 ioctl(kvm_RUN)

 switch (exit_reason) {

 case kvm_EXIT_IO:  /* ... */

 case kvm_EXIT_HLT: /* ... */

 }

}
关于kvm_CREATE_VM参数的描述,创建的VM是没有cpu和内存的,需要QEMU进程利用mmap系统调用映射一块内存给VM的描述符,其实也就是给VM创建内存的过程。

kvm虚拟化克隆原理

一、安装图形界面

yum grouplist
yum groupinstall "GNOME 桌面" -y
输入init 5 后:initial setup of centos linux 7 界面依次输入:
1-2-q-yes-登录-设置

二、配置kvm虚拟化

1.安装插件及工具
yum install -y qemu-kvm.x86_64 qemu-kvm-tools.x86_64 python-virtinst.noarch qemu-img.x86_64 bridge-utils.x86_64 libvirt virt-manager openssh-askpass

2.验证当前主机是否满足kvm的运行条件
在VMware中开机前要对CPU的虚拟化功能进行开启(关机状态才可以)

intel CPU过滤vmx AMD CPU过滤smv
cat /proc/cpuinfo | egrep -o "vmx|smv"

modprobe kvm //加载kvm模块
lsmod | grep kvm

三、创建桥接网卡

vi /etc/sysconfig/network-scripts/ifcfg-ens33 //在末尾新增一行,同时要把网卡的IP相关参数去掉
BRIDGE="br0"

vi /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=br0
BOOTPROTO=static

NM_CONTROLLED=no

ONBOOT=yes
TYPE=Bridge
IPADDR=192.168.80.100
NETMASK=255.255.255.0
service network restart
ifconfig

四、kvm环境中安装系统

注意:硬盘中要留两个目录给数据存储池与镜像存储池,大小自己设置!
数据存储池用来存放安装的系统;
镜像存储池用来存放iso镜像。
内存要大一点,由图可知,只有一个opt内存还挺大,所以再添加一块硬盘

加块20G硬盘
fdisk -l //检测并确认新硬盘
fdisk /dev/sdb //规划硬盘中的分区
输入“n”,回车; --新建--
输入“p”,回车; --primary partition(1-4),主分区--
其他默认
p 查看
w 保存退出

mkfs.xfs /dev/sdb1 //格式化为xfs格式
mount /dev/sdb1/ /tmp/ //将sdb1挂载到tmp
vi /etc/fstab //自动挂载
/dev/sdb1/ /tmp/ xfs defaults 0 0

安装管理工具virt-manager
yum install –y virt-manager //安装virt-manager管理工具
virt-manager //启动virt-manager管理工具(要在控制台操作)

2.创建存储池,然后创建存储卷
双击QUMU/kvm-存储-左下角+号-名称
点击卷+号-名称-空间

3.添加镜像存储池和存储卷
使用同样的方法创建镜像存储池,然后把需要用到的所有镜像文件上传到存储目录中,刷新镜像就可以使用了

将上传的镜像拉到镜像存储池里

cp CentOS-7-x86_64-DVD-1708.iso /opt/images/iso //复制到虚拟池
刷新一下管理器

4.新建虚拟机
右击QUMU/kvm-新建-本地安装介质-选择镜像-……

进入安装界面,开始安装系统:大家都会,所以步骤省略
配置虚拟机kvm11:
vi /etc/sysconfig/network-scripts/ifcfg-eth0

ping 192.168.80. 100 //查看能否与真机通信

通信正常,看下ip地址

五、克隆

回到virt-managert管理器,选中虚拟机,右击—克隆
//注意:当centos7.0正在运行的时候不能克隆,必须系统关闭的时候才能克隆,如图所示:

init 0 //关机

克隆完成
修改克隆系统的配置
右击—运行,开启centos7.0-clone系统,上面打开界面

由于该系统是克隆另一个系统,所有的信息都是一样的,需修改以下配置:
主机名、IP地址、UUID删除掉
vi /etc/hostname //永久更改主机名,重启后生效
保存退出
ip a //查看网络信息

vi /etc/sysconfig/network-scripts/ifcfg-eth0
将UUID删除,IP地址

保存退出
service network restart //重启网络服务
ip a //查看ip 地址

ping 192.168.80.88 //查看通信情况

通信成功
init 6 //重启,看下主机名是否生效

网络的出现,给人们的生活带来了精彩,让人们在任何地方都能实现远程办公、远程管理、远程监控等。值得一提的是花生壳端口映射软件,其应用优势众多,能满足广大用户的网络操作,并保证操作安全。花生壳远程控制软件是针对远程主机管理服务,你可以随时随地通过浏览器或主控端程序访问或控制自己的服务器或PC。

向日葵控控A2是由Oray自主研发的一款远程控制硬件第二代新产品,它拥有小巧体型,在画面传输质量也有了大幅提升,支持HDMI高清输入/输出接口,基于向日葵远程控制软件提供多个远程服务,例如:远程桌面、远程SSH等,搭配KVM切换器,即可实现多台服务器同时进行远程维护。