映射 | 2018-11-20
kvm实现主要基于Intel-V或者AMD-V提供的虚拟化平台,利用普通的Linux进程运行于虚拟态的指令集,模拟虚拟机监视器和CPU。kvm不提供硬件虚拟化操作,其IO操作等都借助QEMU来完成。关于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创建内存的过程。
使用步骤:
一、设备接线
①连接5V/2A电源。
②连接被控主机(VGA线需另外购买)
USB接口:连接到主机上的USB接口
VGA接口:连接到主机上的VGA接口,如主机仅有HDMI口,请使用转换器
③连接路由器/交换机
④无线网卡上网,首次使用需在有线连接的情况下(目前支持360随身WIFI 2代和小度WIFI)。
⑤VGA接口,分别连接控控与外接显示器,作用是让主机的画面图像在本地输出。(VGA线需另外购买)
确认①②③接线无误,及控控面板灯是绿灯常亮或绿灯闪烁时,就可以进行下一步的配置了。
二、手机下载向日葵APP
1.首次使用向日葵控控,需要通过手机主控端扫描并添加控控后,才可实现远控。
进入下载页面:http://d.sunlogin.com, 在页面下方找到移动版控制端,并使用手机扫描二维码下载7.2或以上版本的向日葵控制端。
2.下载安装完成后,输入向日葵的账号密码登录。
三、绑定控控设备
1.登录后,点击界面右上角“+”,选择【绑定控控】,点击【已有控控】。
2.这是控控连接主机的提示界面。确认了指示灯的状态后,点击【确认绿灯常亮或闪烁】。然后开始扫描局域网内的控控设备。
3.若控控指示灯为绿灯闪烁,扫描到控控后需要设置IP地址,让控控上网。控控支持两种方式上网,分别是DHCP和静态IP。
若控控是绿灯常亮状态,代表已连上互联网,将不会出现下图界面,直接进入设置访问密码的步骤。
4.若控控是绿灯常亮,或设置完控控的IP地址后,需要设置控控的访问密码,输入访问密码并点击确定。
绑定成功后,控控设备会出现在主机列表中。
四、实现远控
在手机端主界面上,点击控控,选择【桌面控制】,即可进行远控。
远控画面下方有三个按钮,分别是【鼠标滚轮】、【指针模式】、【键盘】、【更多功能】,此时可以随意地操作远程主机了。
五、控控的管理设置
控控的管理设置
由于控控是一个单独的硬件设备,设备的详情我们来看看具体有哪些。
1、识别码
控控同样有识别码,其他客户端或主控端可通过识别码与验证码进行外网远控连接,点击主机详情可查看到。
2、修改访问密码
在初始添加控控设备时需要设置访问密码,添加完成后同样可以修改。点击修改访问密码即可。
3、上网设置
3.1、有线上网
有线上网,包含DHCP及静态IP两种。可按需求进行设置,。
注意:设置错误会导致控控无法上网,请根据所在的网络环境设置网络参数。
DHCP:由路由器自动分配IP地址上网,无法更改。
静态IP:自定义设置IP地址。
3.2、无线上网
控控支持无线上网,在有线连接上网正常的情况下,插入无线网卡,手机主控端会有提示:
选取无线WIFI后,输入密码进行连接:
无线WIFI连接成功后,若同时连接有线与无线上网,优先使用有线上网方式。这时可拔掉网线。
向日葵推出一款全新的远程控制硬件设备——向日葵控控,通过一个VGA接口传输远程主机画面和一个USB接口仿真键盘鼠标设备,可实现远程访问和控制目标主机。此产品无需目标主机修改软件或驱动,这意味着就算在Windows的BIOS环境下,也能访问到目标主机,提供真正主板级别的访问。