
Linux container
文章平均质量分 74
tycoon1988
这个作者很懒,什么都没留下…
展开
-
lxc简单介绍
基本安装安装lxc包。注意修改/bin/sh,链接到/bin/bash。lxc在某些版本上有一个bug,声明为/bin/sh却使用bash语法,导致不如此链接会出现错误。lxc on debian wiki镜像和设定使用lxc-create -n name -t template生成镜像。在/usr/share/lxc/templates可以看到可用的模板。在/va原创 2014-09-05 10:28:39 · 1063 阅读 · 0 评论 -
kvm 中断以及io虚拟化 cpu_enter_guest->inject_pending_event
vcpu_enter_guest->inject_pending_event->中检查是否有中断到来(其检测的为vcpu->arch.interrupt.pending)这里有个问题,设置相应的中断是在apic_set_vector(vector, apic->regs + APIC_TMR)设置,这里设置完了后在哪里被解析出来,这里和上面检测的不一样,这个函数代表的是写相应的寄存器kvm原创 2015-04-18 10:16:52 · 1247 阅读 · 0 评论 -
Io与中断
I/O客户机退出后回调用vmx_handle_exit() 这里应该是处理的IO请求或者其他 基本的函数调用过程:kvm_vcpu_ioctl->kvm_arch_vcpu_ioctl_run(vcpu, vcpu->runkvm_arch_vcpu_ioctl_run(vcpu, vcpu->run)->__vcpu_run(vcpu)->vcpu_enter_guest(原创 2015-04-18 10:19:33 · 2289 阅读 · 0 评论 -
OpenStack QEMU
我们在OpenStack中使用的就是QEMU的虚拟化功能。 QEMU进程直接使用了KVM的接口/dev/kvm,向KVM发送创建虚拟机和运行虚拟机的命令。框架代码如下:open("/dev/kvm")ioctl(KVM_CREATE_VM)ioctl(KVM_CREATE_VCPU)for (;;) {ioctl(KVM_RUN)switch (exit_rea原创 2015-04-18 10:41:14 · 847 阅读 · 0 评论 -
struct file_operations kvm_vm_fops
KVM在和用户态程序进行交互的过程中,主要通过/dev/kvm设备文件进行通信。从后文的KVM的初始化过程中可以得知,/dev/kvm是一个字符型设备,通过符合Linux标准的一系列结构体进行支撑,主要是kvm_chardev_ops、kvm_vm_fops、kvm_vcpu_fops,分别对应字符型设备、VM文件描述符和VCPU文件描述符的三种操作。kvm_chardev_ops的定义在vi原创 2015-04-18 19:54:35 · 555 阅读 · 0 评论 -
Guest OS, Qemu, KVM工作流程 kvm_vmx_exit_handlers kvm_vcpu_ioctl kvm_x86_ops->handle_exit
这里主要介绍基于x86平台的Guest Os, Qemu, Kvm工作流程,如图,通过KVM APIs可以将qemu的command传递到kvm: 1.创建VM system_fd = open("/dev/kvm", xxx); vm_fd = ioctl(system_fd, KVM_CREATE_VM, xxx); 2.创建VCPU vcpu_fd = kvm_vm_io原创 2015-04-18 09:58:30 · 2001 阅读 · 0 评论 -
kvm 中的kvm_run 是如何与qemu中的kvm_run联系到一起
kvm 中的kvm_run 是如何与qemu中的kvm_run联系到一起的在qemu下面的函数中,完成了 env->kvm_run的映射.int kvm_init_vcpu(CPUArchState *env)env->kvm_run = mmap(NULL, mmap_size, PROT_READ | PROT_WRITE, MAP_SHARED,238原创 2015-04-18 10:24:43 · 1397 阅读 · 0 评论 -
Qemu mmap
KVM的抽象对象 KVM同应用程序(Qemu)的交互接口为/dev/kvm,通过open以及ioctl系统调用可以获取并操作KVM抽象出来的三个对象,Guest的虚拟处理器(fd_vcpu[N]), Guest的地址空间(fd_vm), KVM本身(fd_kvm)。其中每一个Guest可以含有多个vcpu,每一个vcpu对应着Host系统上的一个线程。 Qemu启动Guest系统时,通过/原创 2015-04-18 10:33:29 · 963 阅读 · 0 评论 -
QEMU中的IOCTL
5. QEMU中的IOCTL在QEMU-KVM中,用户空间的QEMU是通过IOCTL与内核空间的KVM模块进行通讯的。1. 创建KVM在/vl.c中通过kvm_init()将会创建各种KVM的结构体变量,并且通过IOCTL与已经初始化好的KVM模块进行通讯,创建虚拟机。然后创建VCPU,等等。2. KVM_RUN这个IOCTL是使用最频繁的,整个KVM运行就不停在执行这个IOC原创 2015-04-17 22:41:41 · 1251 阅读 · 0 评论 -
qemu-kvm 线程事件模型 【QEMU-KVM代码分析之三】
qemu-kvm 线程事件模型1.主(父)线程。主线程执行循环,主要做三件事情1).执行select操作,查询文件描述符有无读写操作2).执行定时器回调函数3).执行下半部(BH)回调函数。为什么要采用BH,资料说主要避免可重入性和调用栈溢出。2.执行客户机代码的线程只讨论kvm执行客户机代码情况(不考虑TCG,TCG采用动态翻译技术),如果有多个vcpu,就意味着原创 2015-04-17 23:07:24 · 3078 阅读 · 0 评论 -
load_file(vm_mem + 0x100000, av[2]); virDomainCreateXM
清单 1. 测试 KVM 系统管理程序的应用程序片断int main(){ void *vm_mem; kvm = kvm_init(&test_callbacks, 0); if (!kvm) { fprintf(stderr, "kvm_init failed\n"); return 1; } if (kvm_create(kvm, 128 * 102原创 2015-04-17 23:16:12 · 797 阅读 · 0 评论 -
操作系统虚拟化原理总结篇——VMCS详解
1.VMCS的组成有三部分:偏移0处是版本标识,偏移4处是中止指示,偏移8处是VMCS的数据域,其中第三部分才是我们要考虑的重点。它是被保存在内存中的。2,为什么要引入VMCS这完全是由于Intel VT_x来引起的,它主要被CPU进行操作,然后保存着VCPU的相关寄存器的信息和内容。可以这么理解,一个物理CPU通过VMCS能够获得每个虚拟CPU的各种信息。另外VT_x也提供了原创 2015-04-17 22:44:52 · 2170 阅读 · 0 评论 -
KVM中Guest OS的调度执行
2.1 KVM中Guest OS的调度执行VMM调度Guest OS执行时,Qemu通过ioctl系统调用进入内核模式,在KVM Driver中通过get_cpu获得当前物理CPU的引用。之后将Guest状态从VMCS中读出。并装入物理CPU中。执行VMLAUCH指令使得物理处理器进入非根操作环境,运行客户代码。当Guest OS执行一些特权指令或者外部事件时,比如I/O访问,对控原创 2015-04-17 22:54:51 · 2017 阅读 · 0 评论 -
qemu-kvm 设备虚拟化----I/O 端口和 I/O 内存
操作设备存在两种接口:I/O 端口和 I/O 内存,下面分析虚拟机如何截获和模拟这两种情况的。1.用户空间访问内核数据结构信息内存映射可被实现来提供用户程序对设备内存的直接存取,KVM 内核代表每个 VCPU 的 struct kvm_run 数据结构被 mmap用户空间,从而用户空间可以读取 struct kvm_run 中的信息,对于mmio读写操作来说,可以知道其地址和大小。原创 2015-04-17 23:28:05 · 1770 阅读 · 0 评论 -
中断注入
中断注入中断注入实际是向客户机CPU注入一个事件,这个事件包括异常和外部中断和NMI。异常我们一般看作为同步,中断被认为异步。硬件具体实现就中断注入实际就是设置VMCS中字段VM-Entry interruption-infomation字段。中断注入实际在VM运行前完成的,具体代码如下:static int vcpu_enter_guest(struct kvm_vcpu *vcpu原创 2015-04-17 23:34:36 · 1845 阅读 · 0 评论 -
kvm虚拟化
http://blog.chinaunix.net/uid-26000137-id-3761116.html从软件架构上来说,kvm提供了两个内核模块,使用kvm的io_ctl接口可以管理vcpu和内存,为vcpu注入中断和提供时钟信号,而kvm本身没有提供设备的模拟。设备模拟需要应用层软件Qemu来实现。这种架构保证了kvm避免了繁琐的设备模拟和设备驱动部分(内核中80%以上的代原创 2015-04-17 22:31:42 · 1490 阅读 · 0 评论 -
VMCS研究总结
再来看kvm分配与初始化vmcs的代码路径。我发现有两个路径都是要分配vmcs的:第一是kvm内核模块加载时,在hardware_setup中调用alloc_kvm_area,进而对每一个cpu调用alloc_vmcs_cpu。这里的每一个cpu应该是物理cpu了,为什么要对每个物理cpu都分配一个页的vmcs空间觉得有点奇怪,还没想明白。另外,setup_vmcs_config很重要,是原创 2015-05-03 11:01:08 · 969 阅读 · 0 评论 -
KVM+QEMU世界中的pci总线与virtio总线 module_call_init pc_machine_init
在qemu中增加pci设备并用linux驱动验证这篇文章的背景是通过9p文件系统在host os与guest os间共享一个目录,或许更专业点的叫法是File system Passthru. 因此需要配置guest os中Linux内核,使之支持下面的选项(.config):CONFIG_NET_9P=yCONFIG_NET_9P_VIRTIO=mCONFIG原创 2015-04-18 20:16:01 · 1549 阅读 · 0 评论 -
看操作系统虚拟化原理总结篇——VMCS详解
1.VMCS的组成有三部分:偏移0处是版本标识,偏移4处是中止指示,偏移8处是VMCS的数据域,其中第三部分才是我们要考虑的重点。它是被保存在内存中的。2,为什么要引入VMCS这完全是由于Intel VT_x来引起的,它主要被CPU进行操作,然后保存着VCPU的相关寄存器的信息和内容。可以这么理解,一个物理CPU通过VMCS能够获得每个虚拟CPU的各种信息。另外VT_x也提供了原创 2015-04-17 22:47:02 · 3594 阅读 · 0 评论 -
RH442 - 通过cgroup来限制kvm虚拟机只使用host的某个cpu和内存大小
测试使用的系统版本[root@desktop2 ~]# cat /proc/version Linux version 2.6.32-220.el6.x86_64 (mockbuild@x86-004.build.bos.redhat.com) (gcc version 4.4.5 20110214 (Red Hat 4.4.5-6) (GCC) ) #1 SMP Wed Nov 9 08原创 2014-09-05 10:44:26 · 1294 阅读 · 0 评论 -
Linux Switching – Interconnecting Namespaces 母机桥技术
Switching in software on Linux is one of the important parts when using virtualization technologies like KVM or LXC. Typical hosts do not provide one or more physical adapters for each NIC of a virtua原创 2014-09-05 11:45:45 · 738 阅读 · 0 评论 -
Multiple Private Networks with Open vSwitch GRE Tunnels and Libvirt
http://trickycloud.wordpress.com/2014/05/02/multiple-private-networks-with-open-vswitch-gre-tunnels-and-libvirt/原创 2014-09-05 12:04:13 · 1056 阅读 · 0 评论 -
linux组调度浅析 cgroupd 多个进程组 多个cgroup
Linux cgroups是一种进程资源隔离的技术,namespace是进程的网络资源隔离的技术,它们合在一块也就有了lxc项目,所以从理论上讲,lxc会比kvm性能高得多。因为lxc的每个虚机就是host操作系统的每一个隔离后的进程,并且这些进程是由host操作系统调度的,性能和host操作系统相差不会太多。唯一的缺点是lxc的隔离性不会很好,例如host机器用什么操作系统,lxc也是什么操作系原创 2014-09-05 10:57:28 · 3213 阅读 · 1 评论 -
子系统 Cgroups
freezer子系统用于挂起和恢复cgroup中的进程。freezer有一个控制文件:freezer.state,将FROZEN写入该文件,可以将cgroup中的进程挂起,将THAWED写入该文件,可以将已挂起的进程恢复。通过遍历cgroup中的进程,对其freeze或者wake_up。freeze操作通过freeze框架实现,设置进程的TIF_SIGPENDING函数(伪信号),唤醒进程原创 2014-09-05 11:15:36 · 671 阅读 · 0 评论 -
Linux PID namespace cgroup namespace container
使用Namespace(命名空间),可以让每个进程组具有独立的PID、IPC和网络空间。可以向clone系统调用的第3个参数flags设置划分命名空间的标志,通过执行clone系统调用可以划分命名空间。例如,划分PID命名空间后,在新生成的PID命名空间内进程的PID是从1开始的。从新PID为1的进程fork()分叉得到的进程,被封闭到这个新的PID命名空间,与其他PID命名空间分隔开。在原创 2014-09-05 11:24:58 · 890 阅读 · 0 评论 -
Linux Network Namespace
Linux Network NamespacesLinux kernel在2.6.29中加入了namespaces,用于支持网络的隔离,我们看一下namespace是如何使用的创建与配置创建一个名为blue的namespaceip netns add blue 列出所有的namespaceip netns list 分配网络接口到namespace上我们可以将一对v原创 2014-09-05 11:38:34 · 1652 阅读 · 0 评论 -
Using GRE Tunnels with Open vSwitch
http://blog.scottlowe.org/2013/05/07/using-gre-tunnels-with-open-vswitch/ I’m back with another “how to” article on Open vSwitch (OVS), this time taking a look at using GRE (Generic Routing Enca原创 2014-09-05 11:53:30 · 685 阅读 · 0 评论 -
qemu network backend的初始化
Network优化:1、virtio-net:基于virtio框架的虚拟以太网设备vhost_net优化:内核进程vhost_XXXX其他优化选项:数据发送的完整流程在上面过程中可以看到vhost最核心处就在于将Guest中的virtio用于传输层的vring队列空间通过mapping方式与Host Kernel进行了共享,这样数据就原创 2015-02-08 14:34:40 · 2041 阅读 · 0 评论 -
kvm 存储栈分析
1. kvm与qemu的关系 发现好多同学还是不太了解kvm与qemu的关系,首先做个简单的介绍:qemu:it is a emulator, 用来仿真cpu,设备,总线等设备kvm: it's a kenerl module, 用来处理qemu向内核发起的请求总结一下: qemu是kvm的客户端展现,kvm是内核为qemu提供的服务代理,用来处理qemu的请求。原创 2015-02-08 19:15:55 · 647 阅读 · 0 评论 -
openstack网络模式
openstack neutron中定义了四种网络模式:# tenant_network_type = local# tenant_network_type = vlan # Example: tenant_network_type = gre# Example: tenant_network_type = vxlan 本文主要以vlan为例,并原创 2015-02-08 19:41:00 · 771 阅读 · 0 评论 -
mesos学习之cgroup
最近在啃mesos源码,mesos用cgroup做资源隔离,由于之前没有接触linux container,所以写了一些小代码做了一些小试验来学习一下cgroup。/proc/mounts文件是以/etc/mtab文件的格式给出当前系统所挂载的文件系统信息,这个文件也能反映出任何手工安装从而在/etc/mtab文件中没有包含的文件系统。当挂载cgroups后,cgroups的挂载点的信息也原创 2015-01-20 12:07:31 · 796 阅读 · 0 评论 -
使用netns虚拟网络进行网络测试 *********************
网络虚拟化技术(一): Linux网络虚拟化http://ju.outofmemory.cn/entry/73667netns是在linux中提供网络虚拟化的一个项目,使用netns网络空间虚拟化可以在本地虚拟化出多个网络环境,目前netns在lxc容器中被用来为容器提供网络。使用netns创建的网络空间独立于当前系统的网络空间,其中的网络设备以及iptables规则等都是原创 2015-01-01 14:41:04 · 2643 阅读 · 0 评论 -
Virtio-blk浅析
Virtio-blk浅析和virtio-network一样,virtio-blk驱动使用Virtio机制为Guest提供了一个高性能的块设备I/O的方法。我们这里看下virtio-blk的实现。Linux中的块设备在介绍virtio-blk之前,先科普下Linux内核中的块设备整体架构。基本概念Linux操作系统有三类主要的设备文件:字符原创 2015-01-25 12:44:54 · 6952 阅读 · 0 评论 -
KVM,QEMU核心分析
http://blog.youkuaiyun.com/hsly_support/article/details/37875753 目前正在学习虚拟化软件KVM相关运行原理、过程,对源码的分析进行了总结,只是为了学习交流使用,若有不正确的地方,希望大家提出。由于有一些代码结构图或者是架构图上传比较麻烦,所以博文都放在了自己的个人博客上,麻烦大家移步查看:总入口:我的个人blog:原创 2015-01-25 12:42:31 · 793 阅读 · 0 评论 -
virtio的io路径 vhost的io路径 和vhost-user vhost-user *********网络设备
随着qemu2.1的发布,可以看到,qemu支持了vhost-user。从介绍可以看出,这是把原来vhost-backend从kernel移到了userspace,这和原来virtio架构有什么区别呢?并且这个特性带来了怎样的改进?virtio在虚拟机中,可以通过qemu模拟e1000网卡,这样的经典网卡一般各种客户操作系统都会提供inbox驱动,所以从兼容性上来看,使用类似e10原创 2015-04-28 20:09:22 · 6102 阅读 · 0 评论