注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

itoedr的it学苑

记录从IT文盲学到专家的历程

 
 
 

日志

 
 

几种流行虚拟机技术比较(采集)  

2014-03-28 14:14:28|  分类: linux虚拟技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
    xen/kvm/OpenVZ/lxc
       ubuntu1604正式发布,最新的虚拟机机制容器技术lxd也发布2.0版本了.
      
XENpv是半虚拟化,hvm是全虚拟化,pv只能用于linux内核的系统,效率更高,hvm可以虚拟所有常见操作系统(可以使用 windows),理论效率比pv略低,另外,hvm需要cpu虚拟化指令支持,pv无此要求。KVM是新兴的虚拟化项目,出售KVMVPS商家不多(专门整合了KVM的smartos的表现会带kvm的应用前景是肯定的),linux选择KVM虚拟技术进入核心,足见其强悍之处。而OpenVZ是一个类似于Linux-VServer的操作系级全虚拟化解决方案(官方称仅省失性能2%),目前基于XenOpenVZVPS服务商比较多。更加近一些的时间下,lxc也始展现其性能上的优势。
几种流行虚拟机技术比较(采集) - itoedr - itoedr的it学苑
几种流行虚拟机技术比较(采集) - itoedr - itoedr的it学苑
 
 


OpenVZ

           
OpenVZ
是操作系统级别的虚拟化技术,是底层操作系统上的一层应用,这意味着易于理解和低权重开销,一般来说也意味着更优的性能。但是OpenVZ配置起来比较灵活。
    
优势:现在外面卖的这种类型,许可的内存都超大,CPU也强劲,而且卖家很多,可比性也很强。
     
基本上OpenVZ技术没有独占内存,都是共享,别人多了你就少了,而且这种技术最大的劣势就是内存下来后直接就是当机。 因为这个特点,OpenVZ用于建立私有云是个好选择。


Xen
      Xen
是半虚拟化技术,它并不是一个真正的虚拟机,而是相当于自己运行了一个内核的实例,可以自由的加载内核模块,虚拟的内存和IO,稳定而且可预测。分Xen+pv+Xen+hvm,区别就是pv只支持linux,而hvm支持win系统。

优势:内存独占,虽然小但是保证分配的到。部分虚拟技术决定了就算是超卖也不会超太离谱。很少导致石头盘。另外就是即使内存再低也不会当掉,只是会无响应一段时间。
劣势:内存小,硬盘小,带宽小(以上3点均和同价位的openvz对比)。值得注意的是,大部分在说xen的时候都木有明说是pv还是hvm,其实pv的性能是优于hvm的。

KVM

优势:和xen类似,比xen更好的一点是,kvm是完全虚拟的,所以不分pvhvm的区别,所有的kvm型的虚拟技术都可以装各种linux的发行 版和各种win的发行版,不管供应商在主页有没有写明是否支持win,只要你配置够win运行,那就肯定可以装上去,只是方法的问题而已。
劣势:恰恰因为kvm可以装任意类型的操作系统,导致了折腾帝甚至在128m的机器上装了win2003(上去后直接所有的cpu和内存都用于硬盘IO 了)。 在公有云端的用户要是不太讲究,同机下的邻居就可比较麻烦。

 lxc(
几乎没有性能外销)

         Docker 是一个开源的应用容器引擎(基于lxc),让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app,这个东西很多朋友接触过,对lxc的理解也就理实际了)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架或包装系统。
       笔者认为这是未来的方向(相当于OpenVZ的升级版本)。

******************************
LXC的实现
******************************
::虚拟化方案中,笔者看中的lxc方案::

            LXC项目本身只是一个为用户提供一个用户空间的工具集,用来使用和管理LXC容器。LXC真正的实现则是靠Linux内核的相关特性,LXC项目只是对此做了整合。基于容器的虚拟化技术起源于所谓的资源容器和安全容器。
            LXC在资源管理方面依赖于Linux内核的cgroups子系统,cgroups子系统是Linux内核提供的一 个基于进程组的资源管理的框架,可以为特定的进程组限定可以使用的资源。
            LXC在隔离控制方面依赖于Linux内核的namespace特性,具体而言就 是在clone时加入相应的flag(NEWNS NEWPID等等),这对于使用c语言的程序员特别明白其意义了。
           
lxc常见命令使用(也就是一组bash级的api了):

lxc-version 用于显示系统LXC的版本号(可以通过此命令判断系统是否安装了lxc)
用法:lxc-version
例如:lxc-version
lxc-checkconfig 用于判断linux内核是否支持LXC
用法:lxc-checkconfig
例如:lxc-checkconfig
lxc-create用于创建一个容器
用法:lxc-create -n name [-f config_file]
-n 后面跟要创建的容器名字 例如:-n foo
-f 后面跟容器配置文件的路径
注:1.采用lxc-create创建的容器,在停止运行后,不会被销毁,要采用lxc-destroy命令才能销毁
2.容器命令空间是全局的,系统中不允许存在重名的容器,如果-n 后面跟一个已经存在的容器名,创建会失败
例如:lxc-create --n foo --f foo.conf
lxc-execute 用于在一个容器执行应用程序
用法: lxc-execute -n name [-f config_file] [ -s KEY=VAL ]command
-n 后面跟容器名字(容器名字用于管理容器)例如:-n foo
-f 后面跟容器配置文件的路径(如果没有配置文件,可以直接用-s指定配置选项,如果什么都没有,系统采用默认策略)例如:-f foo.conf
-s 后面跟配置键值对 例如:lxc.cgroup.cpu.shares=512
command 为要执行的命令 例如:/bin/bash
这个命令会mount /proc 并且会自动创建/销毁容器。
注:1.如果容器还不存在,lxc-execute会自动创建一个,容器停止运行后会被自动销毁
2.用lxc-execute启动应用程序,配置优先级如下:
如果指定-f选项,那么之前创建容器(如果容器是已存在的)的配置文件不会被使用
如果指定-s选项,则在命令行中的配置键值对会覆盖配置文件(无论之前的还是-f指定的)相同配置
例如:lxc-execute --n foo --s lxc.cgroup.cpu.shares=512 /bin/bash
使用实际例子:
lxc-execute -n test /bin/bash
这个会启动一个lxc并给出类似的一个cmd窗口,网络是与操作系统共用的,这里好像仅仅是创建了一个命名空间
如果没有指定-f,默认的隔离将被使用,这个命令当你需要一个快速在一个隔离的环境中运行程序。在物理机上和 container中都会运行lxc-init,在宿主机上面,这个程序用于转发lxc-kill 信号到已经启动的程序中 ,在container中,这个程序的pid为1,它会fork出要执行的命令(pid为2)并执行。
lxc-start 用于在容器中执行给定命令
用法:lxc-start -n name [-f config_file] [-c console_file] [-d] [-s KEY=VAL]
[command]
-d 将容器当做守护进程执行
-f 后面跟配置文件
-c 指定一个文件作为容器console的输出,如果不指定,将输出到终端
-s 指定配置
如果没有指定命令,lxc-start 将要运行 /sbin/init
例如:lxc-start -n foo -f foo.conf -d /bin/bash
注:1.如果容器还不存在,lxc-start会自动创建一个,容器停止运行后会被自动销毁
2.lxc-start配置优先级与lxc-execute相同
3.lxc-start 与lxc.execute的异同:
lxc-start 和 lxc-execute都可以在容器中启动进程,区别在于lxc-start直接创建进程,lxc-execute先创建lxc-init进程,然后在 lxc-init中fork一个进程来执行。(关于第4点,lxc-init所占的是一个什么样的地位?)
The orphan process group and daemon are not supported by this command,
use the lxc-execute command instead
If no command is specified, lxc-start will use the default "/sbin/init"
command to run a system container.
4.lxc-start用于在容器启动system,lxc-execute用于在容器执行应用程序
lxc-kill 发送信号给容器中的第一个用户进程(容器内部进程号为2的进程)
用法:lxc-kil -n name SIGNUM
-n 后面跟容器名
SIGNUM 信号 (此参数可选,默认SIGKILL)
例如:lxc-kill -n foo
lxc-stop 用于停止容器中所有的进程
用法:lxc-stop -n name
-n后面跟要停止的容器名
例如:lxc-stop --n foo
lxc-destroy 用于销毁容器
用法:lxc-destroy -n name
-n后面跟要停止的容器名
例如: lxc-destroy --n foo
lxc-cgroup 用于获取或调整与cgroup相关的参数
用法:lxc-cgroup -n name subsystem value
-n 后面跟要调整的容器名
例如: lxc-cgroup -n foo devices.list
lxc-cgroup -n foo cpuset.cpus "0,3"
lxc-info 用户获取一个容器的状态
用法:lxc-info -n name
-n后面跟操作的容器名
例如: lxc-info --n foo
注:容器的状态有:STARTING RUNNING STOPPING STOPPED ABORTING
lxc-monitor 监控一个容器状态的变换,当一个容器的状态变化时,此命令会在屏幕上打印出容器的状态
用法:lxc-monitor -n name
例如:lxc-monitor -n foo
lxc-ls 列出当前系统所有的容器
用法:lxc-ls
例如:lxc-ls
lxc-ps 列出特定容器中运行的进程
用法:lxc-ps
例如:lxc-ps -n foo

几种流行虚拟机技术比较(采集) - itoedr - itoedr的it学苑
docker云容器的结构参考

       现在基于lxc的两大应用lxd(来源于ubuntu)以及docker(来源于docker公司)的应用越来越多了。因为它们快而少消耗损系统资源。
  评论这张
 
阅读(723)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017