随笔分类 - KVM虚拟化技术

摘要:2018-01-24 占个坑,准备下写vhost-user的东西 vhost-user是vhost-kernel又回到用户空间的实现,其基本思想和vhost-kernel很类似,不过之前在内核的部分现在有另外一个用户进程代替,可能是snapp或者dpdk等。在网上看相关资料较少,就简单介绍下。虽然和 阅读全文
posted @ 2018-02-02 14:08 jack.chen 阅读 (2164) | 评论 (8) 编辑
摘要:2018-01-18 其实在之前的文章中已经简要介绍了VHOST中通过irqfd通知guest,但是并没有对irqfd的具体工作机制做深入分析,本节简要对irqfd的工作机制分析下。这里暂且不讨论具体中断虚拟化的问题,因为那是另一个内容,这里仅仅讨论vhost如何使用中断的方式对guest进行通知, 阅读全文
posted @ 2018-01-18 14:57 jack.chen 阅读 (1115) | 评论 (0) 编辑
摘要:2017-11-15 今天闲着没有突然想了想VCPU线程调度的问题,具体描述如下: 当代表VCPU的线程获得控制权后,首先会通过KVM接口进入到内核,从内核进入到非根模式,那么此时站在全局调度器的点上,这并不算做线程的时间,这种情况下调度器还能正常调度VCPU线程吗? 通过查看intel手册,分析相 阅读全文
posted @ 2017-11-15 19:00 jack.chen 阅读 (981) | 评论 (0) 编辑
摘要:2017-08-24 今天咱们聊聊KVM中断虚拟化,虚拟机的中断源大致有两种方式,来自于用户空间qemu和来自于KVM内部。 中断虚拟化起始关键在于对中断控制器的虚拟化,中断控制器目前主要有APIC,这种架构下设备控制器通过某种触发方式通知IO APIC,IO APIC根据自身维护的重定向表pci 阅读全文
posted @ 2017-09-04 19:25 jack.chen 阅读 (1669) | 评论 (0) 编辑
摘要:2017-07-19 一、前言 之前有分析过虚拟化环境下virtIO的实现,virtIO相关于传统的虚拟IO在性能方面的确提高了不少,但是按照virtIO虚拟网卡为例,每次虚拟机接收数据包的时候,数据包从linux bridge经过tap设备发送到用户空间,这是一层数据的复制并且伴有内核到用户层的切 阅读全文
posted @ 2017-08-23 09:18 jack.chen 阅读 (5270) | 评论 (2) 编辑
摘要:2017-06-30 在KVM中基于其搞特权及,可以透明的读写客户机的内存信息,为此KVM提供了一套API,这里姑且称之为kvm_read_guest_virt*/kvm_write_guest_virt*函数,因为根据不同的场景会由不同的函数,但是基本的原理都是一样的,具体如下所示 kvm_rea 阅读全文
posted @ 2017-07-02 12:38 jack.chen 阅读 (474) | 评论 (0) 编辑
摘要:2017-05-30 前几天简要分析了linux remap机制,虽然还有些许瑕疵,但总算大致分析的比较清楚。今天分析下EPT下的逆向映射机制。EPT具体的工作流程可参考前面博文,本文对于EPT以及其工作流程不做过多介绍,重点介绍逆向映射机制。其实逆向映射机制在最主要的作用就是映射的逆向,说了等于白 阅读全文
posted @ 2017-05-30 16:52 jack.chen 阅读 (1228) | 评论 (1) 编辑
摘要:2017-04-26 KSM是内核中的一种内存共享机制,在2.6.36版本的内核中开始引入,简单来说就是其会 合并某些相同的页面以减少页面冗余。在内核中有一个KSM守护进程 ksmd,它定期扫描用户向它注册的内存区,寻找相同的页面,从而用一个添加写保护的页面来代替, 当有进程尝试写入的时候,会自动分 阅读全文
posted @ 2017-05-10 11:02 jack.chen 阅读 (3294) | 评论 (0) 编辑
摘要:2016-09-27 前篇文章通过分析源代码,大致描述了各个数据结构之间的关系是如何建立的,那么今天就从数据包的角度,分析下数据包是如何在这些数据结构中间流转的! 这部分内容需要结合前面两篇文章来看,我们还是按照从Tap设备->Hub->NIC的流程。 首先看Tap设备,在Tap.c文件中: 先看下 阅读全文
posted @ 2017-05-09 12:45 jack.chen 阅读 (885) | 评论 (0) 编辑
摘要:2017-04-20 上篇文章对qemu部分的内存虚拟化做了介绍,上篇文章对于要添加的FR,调用了 MEMORY_LISTENER_UPDATE_REGION(frnew, as, Forward, region_add) 该宏实际上是另一个宏MEMORY_LISTENER_CALL的封装,在MEM 阅读全文
posted @ 2017-04-23 20:23 jack.chen 阅读 (1231) | 评论 (0) 编辑
摘要:背景分析: 在之前分析EPT violation的时候,没有太注意qemu进程页表和EPT的关系,从虚拟机运行过程分析,虚拟机访存使用自身页表和EPT完成地址转换,没有用到qemu进程页表,所以也就想当然的认为虚拟机使用的物理页面在qemu进程的页表中没有体现。但是最近才发现,自己的想法是错误的。L 阅读全文
posted @ 2017-04-23 20:16 jack.chen 阅读 (965) | 评论 (0) 编辑
摘要:2017-04-18 记得很早之前分析过KVM内部内存虚拟化的原理,仅仅知道KVM管理一个个slot并以此为基础转换GPA到HVA,却忽略了qemu端最初内存的申请,而今有时间借助于qemu源码分析下qemu在最初是如何申请并管理虚拟机内存的,坦白讲,还真挺复杂的。 一、概述 qemu-kvm 模型 阅读全文
posted @ 2017-04-20 11:11 jack.chen 阅读 (2700) | 评论 (6) 编辑
摘要:2016-11-08 在虚拟化环境下,intel CPU在处理器级别加入了对内存虚拟化的支持。即扩展页表EPT,而AMD也有类似的成为NPT。在此之前,内存虚拟化使用的一个重要技术为影子页表。 背景: 在虚拟化环境下,虚拟机使用的是客户机虚拟地址GVA,而其本身页表机制只能把客户机的虚拟地址转换成客 阅读全文
posted @ 2016-11-16 19:55 jack.chen 阅读 (8513) | 评论 (0) 编辑
摘要:2016-11-08 前段时间大致整理了下virtIO后端驱动的工作模式以及原理,今天就从前端驱动的角度描述下目前Linux内核代码中的virtIO驱动是如何配合后端进行工作的。 注:本节代码参考Linux 内核3.11.1代码 virtIO驱动从架构上来讲可以分为两部分,一个是其作为PCI设备本身 阅读全文
posted @ 2016-11-15 15:48 jack.chen 阅读 (4466) | 评论 (1) 编辑
摘要:2016-11-15 本来这是在前端驱动后期分析的,但是这部分内容比较多,且分析了后端notify前端的机制,所以还是单独拿出一节分析比较好! 还是拿网络驱动部分做案例,网络驱动部分有两个队列,(忽略控制队列):接收队列和发送队列;每个队列都对应一个virtqueue,两个队列之间是互不影响的。 前 阅读全文
posted @ 2016-11-15 15:43 jack.chen 阅读 (5727) | 评论 (5) 编辑
摘要:2016-10-08 virtIO是一种半虚拟化驱动,广泛用于在XEN平台和KVM虚拟化平台,用于提高客户机IO的效率,事实证明,virtIO极大的提高了VM IO 效率,配备virtIO前后端驱动的情况下,客户机IO效率基本达到和宿主机一样的水平。咱们本次的分析以qemu-kvm架构的虚拟化平台为 阅读全文
posted @ 2016-11-06 16:25 jack.chen 阅读 (9107) | 评论 (5) 编辑
摘要:由于功能需要,体验了手动编译安装Libvrt,还是碰到了不少问题,这里总结如下仅限于centos7: 1、configure: error: You must install the pciaccess module to build with udev 解决方案:yum install libpc 阅读全文
posted @ 2016-11-02 19:08 jack.chen 阅读 (1763) | 评论 (0) 编辑
摘要:因为要给特殊的虚拟机关联文件指定selinux标签,而默认的Libvirt没有这个功能,所以需要修改LIbvirt源代码,重新编译安装Libvirt,而手动编译安装的LIbvirt,没有办法使用systemctl管理libvirtd服务,只能通过libvirtd -d的方式手动启动。然而,手动启动的 阅读全文
posted @ 2016-11-02 18:44 jack.chen 阅读 (2834) | 评论 (0) 编辑
摘要:sVirt概述 前面已经对seLInux的基本原理做了分析,seLinux主要就是基于主体和客体的安全上下文,进行访问决策。那么安全上下文是不是又可以理解为一个标签呢? 基于以上seLInux的特性,便可以考虑吧seLinux这种基于标签的思想应用到保障Hypervisor的安全上,这里主要是解决两 阅读全文
posted @ 2016-09-27 20:52 jack.chen 阅读 (665) | 评论 (0) 编辑
摘要:2016-09-27 上篇文章大致介绍了qemu网络虚拟化相关的数据结构,本篇就结合qemu-kvm源代码分析下各个数据结构是如何初始化以及建立联系的。 这里还是分为三个部分: 1、Tap设备区 2、Hub区 3、NIC区 1、Tap设备区 在net.c中有数组记录下net client 初始化的相 阅读全文
posted @ 2016-09-27 20:51 jack.chen 阅读 (722) | 评论 (0) 编辑
摘要:在/etc/libvirt/qemu下找到对应的xml配置文件 在<devices>标签下添加 <input type='tablet' bus='usb'/> 然后 virsh define /etc/libvirt/qemu/**.xml 即可解决 阅读全文
posted @ 2016-09-23 20:55 jack.chen 阅读 (1725) | 评论 (0) 编辑
摘要:上篇文章介绍了Linux内核桥接模式涉及到的几个结构,本节就重点放在数据包的处理上! 本节所有代码参考LInux 3.10.1内核! 前面已经提到一个数据包从网卡流到Linux内核中的L2层,最终被交付到__netif_receive_skb_core函数中,看下该函数中引用rx_hander的片段 阅读全文
posted @ 2016-09-22 16:19 jack.chen 阅读 (5360) | 评论 (0) 编辑
摘要:上篇文章导入博客园的比较早,而这篇自己在写的时候才发现内部复杂的很,以至于没能按时完成,造成两篇文章的间隔时间有点长! 话不多说,言归正传! 前面的文章介绍了桥接模式下的基础理论知识,其实本节想结合LInux源代码分析下桥接模式下的数据包的转发流程,但是看了源码才发现,这部分内容太多,非一篇文章可以 阅读全文
posted @ 2016-09-21 20:54 jack.chen 阅读 (4835) | 评论 (0) 编辑
摘要:前面一篇文章介绍了利用NFS创建虚拟机的过程,本文就介绍下如何利用NFS对虚拟机进行动态迁移。 动态迁移就是把一台虚拟机在不停止其运行的情况下迁移到另一台物理机上。这看起来似乎不太可能,不过还好kvm本身就支持者一特性,且libvirt也提供了相应的API,我们可以通过virsh命令或者virt-m 阅读全文
posted @ 2016-09-20 18:36 jack.chen 阅读 (795) | 评论 (0) 编辑
摘要:NFS作为一种网络文件系统,近些年随着云计算的发展也变得越来越受欢迎。因为云环境下会部署大量的虚拟机,而在物理机发生故障的时候,云服务商必须要保障虚拟机的安全性,即不能因为物理机的故障就停止虚拟机。这对于客户来说是零容忍的。这就要求在物理机发生问题的时候,云服务商可以在很短的时间内把虚拟机迁移到另一 阅读全文
posted @ 2016-09-20 18:28 jack.chen 阅读 (1139) | 评论 (0) 编辑
摘要:注册博客园已经好长时间,一直以来也没有在上面写过文章,都是随意的记录在了未知笔记上,今天开始本着分享和学习的精神想把之前总结的笔记逐步分享到博客园,和大家一起学习,一起进步吧! 2016-09-20 17:11:05 其实之前已经有分析过网桥的原理,但是当时对其理解还是局限于表面,对于其本身的实现原 阅读全文
posted @ 2016-09-20 17:12 jack.chen 阅读 (12052) | 评论 (2) 编辑

以马内利