在嵌入式系统部署虚拟化的八大理由

在服务器和桌面上部署虚拟化已经越来越流行。但是大多数一定没有想过在嵌入式环境下部署虚拟化。

Hypervisor(又被称之为虚拟机管理程序virtual machine monitor)如今已经在这颗星球上所有的数据中心遍地开花。因为它给数据中心带来了节省硬件,节省能源的费用,还降低了管理的成本。事实上,从兆兆级的路由器到富媒体的机顶盒,再到手机等等嵌入式系统,它们同样能从虚拟化中受益。 zausiu’s blog http://ykyi.net

因为嵌入式系统的资源非常有限。它们还通常是定制的系统,软硬件紧密结合在一起。初看来,在嵌入式设备中部署虚拟化显得过于隆重。但下文告诉你在嵌入式设备中部署虚拟化的八大理由。

1. 更坚固

定制的硬件是非常昂贵的,如果把多种物理设备集成到一起就能降低成本。集成在一起当然比分布式的环境要简单得多。如果所有的虚拟机运行在相同的服务机上,划分网络的风险就不存在了,硬件故障也有了‘原子性’(hardware failures are atomic),而且在虚拟化环境下已经有非常成熟的解决方案处理硬件故障,这样的故障通常会让没有部署虚拟化的系统崩溃。

2. 更安全

试想,如果一个部署了java虚拟机的手机系统把java stack和通讯栈运行在两个虚拟机上。那么即使应用程序管理部分被攻破了,也不会危险到通迅栈。对于恶意代码,虚拟机环境是一个大沙箱。

3. 更可靠

通过虚拟化可以把特权代码和一般代码分开,能够阻止和减少整个设备的故障率。

4. 易于管理和开发

即使是运行实行操作系统,你不要因为那些非常有限的管理功能就心满意足了。一个运行windows的负责管理功能的虚拟机能够运行图形介面的程序,方便了用户也方便了开发者。

5. 硬件虚拟化

VMM相当适合硬件虚拟化。它连同虚拟控制器一起动态的切分或者合并物理资源。对于大型的,分布式的嵌入式设备如路由器则可以在部署了虚拟化的情况下自由的切分或合并。Zausiu’s blog http://ykyi.net

6. 效率

单核世界已经快速离我们远去,即将消失在历史长河中。而大多数嵌入式软件没有充分利用多核或多处理机的优势。那么,虚拟化帮助系统充分利用嵌入式系统的性能。

7. 新特性

一些振奋人心的超酷特性,如:快照,实时迁移(live migration),External Hibernation能够加强嵌入式设备的可用性,且方便可级。

8. 法律问题

从商用专有代码连接GPL代码会被迫遵守GPL协议。而把GPL代码运行在虚拟机上就可以规僻GPL协议的约束了。

这篇文章译自: http://www.linuxplanet.com/linuxplanet/reports/6490/1 这八大理由中的很多条目我觉得没有说服力!

 

Linux的虚拟化技术 KVM 和 QEMU

Linux 2.6.20发布以后。一个称之为KVM的非常优秀的虚拟化框架加入了linux代码主干。KVM是Kernel-based Virtual Machine的首字母简写。这篇文章将在理论层面和实践层面都会简单介绍KVM是如何工作的。http://ykyi.net

简单的理论背景:
目前有几种虚拟化的方式。
其中一种称之为准虚拟化(para-virtulization)。使用准虚拟化的时候,为了达到虚拟化的目的,客户机系统必须被修改。修改后的客户机知道它运行在虚拟的环境中,与虚拟机管理程序(Supervisor)协同工作。这样的好处理较之全虚拟化,性能上有一定的优势。
另一种称之为全虚拟化(full virtualization)。使用这种技术则不需要修改操作系统。但相对于准虚拟化技术,全虚拟代技术牺牲了一些性能。因为没有客户机OS的参于,是非常困难得到很高的虚拟化效率的。但自从CPU产商在硬件层面推出虚拟化支持的时候,情况就不一样了。如Intel的VT,AMD的AMD-V虚拟化技术。KVM就是利用了CPU的虚拟化支持技术实现了。并且KVM作为linux内核的一个模块加载,天然继承了linux内核的诸多优势。基于KVM的虚拟机,被当成一个标准的Linux进程被Linux内核调度。这个KVM虚拟机看到的都是虚拟的硬件。对于一个标准的Linux进程,有两种运行模式:内核态和用户态。KVM给虚拟机进程加入了第三个模式:客户模式(guest mode)。而客户模式又有它自己的内核态和用户态。

KVM包括两部分组件:
1. 一个设备驱动程序用来管理虚拟化硬件。这个驱动是一个字符驱动,用来管理虚拟化硬件(for managing the virtualization hardware)。
2. 一个用户空间运行的模拟器。通常选择QEMU稍作修改。QEMU是由一个叫Fabrice Bellard的法国黑客写的。

KVM与QEMU实战,在linux下安装windows xp:

前期准备,需要安装KVM和QEMU.另外还有保证你已经编译了内核。
真正的安装超级简单。
第一步:# qemu-img create hda.img -f qcow 6G
第二步: # kvm -no-acpi -m 256 -cdrom winxpsp2.iso -hda hda.img -boot d

下面简单的解释下。
第一步创建了一个虚拟磁盘(实际上就是文件系统上一个文件而已,不过话又说回来,unix的哲学就是所有的东东都是文件。)这条命令选择了QEMU的写时复制策略。这使得这个文件会按需增长。所以一开始这个文件不会太大,以后随着你的虚拟xp占用的空间增大而增大。不过这条命令把大小限制到第大6G.
第二步:指定了win xp的镜像文件就开始安装啦!喔,这条命令使用了 -no-acpi 开关。据说acpi在QEMU中支持的不够好。不过我觉得问题应该得到解决了吧,所以也可以不用 -no-acpi。ykyi.net

于是就装好啦!真的非常简单啊~~
于是你就可以用这个虚拟的xp做一些你不愿意在真实OS上作的测试啦!或者使用只有在win下的软件。

转贴请注明出处 http://ykyi.net/2012/06/linux%E7%9A%84%E8%99%9A%E6%8B%9F%E5%8C%96%E6%8A%80%E6%9C%AF-kvm-%E5%92%8C-qemu/

Linux用两种信号量 Linux has two kinds of semaphore

面试中经常会考什么是信号量,对于linux,实际上有两种semaphore.

第一种是指一种IPC(Inter-process communication进程通讯)的方法。这种IPC是从Unix SYstem V时代开始的,System V发布时加入了三种IPC,它们是semaphore信号量,message queues消息队列,shared memory共享内存。

Linux中另一种Semaphore是内核用来同步的机制。在kernel中,semaphore通常当成一个二值信号量使用。获得信号量时有可能会睡眠,这样进程就会被调度开,放弃处理机;如果某段内核代码得到了一个信号量,这段代码还可以睡眠。这点不像spinlock,尝试得到spinlock会不停地忙等,得到spinlock后不充许睡眠。当然这个“不充许”不是语法层面的,而是应该被程序员遵守。否则整个系统的的性能就会被这代不遵守约定的代码毁掉了。

copyright ykyi.net

 

内核线程是什么东东 What is Kernel threads

有一些Unix内核,比如Solaris和SVR4.2/MP,被组织成一些内核线程。一个内核线程是一个执行上下文且可以被调度;这样的内核线程可能与一个用户程序相关联,也有可以只执行一些内核函数。上下文切换的时候,切换内核线程上下文的开销远比切换用户进程上下文的开销要小。因为内核线程通常共用一个地址空间。而Linux的内核线程则有不同。Linux的内核线程仅仅周期性的执行一个内核函数。而且,Linux内核进线程并不表示一个基本的可执行上下文。 zausiu's blog. http://ykyi.net

Some Unix Kernels, such as Solaris and SVR4.2/MP, are organized as a set of kernel threads. A kernel thread is an execution context that can be independently scheduled; it may be aasociated with a user program, or it may run only some kernel functions. Context switches between kernel threads are usually much less expensive than context switches between ordinary processes, because the former usually operate on a common address space. Linux uses kernel threads in a very limited way to execute a few kernel functions periodically; however, they do not represent the basic execution context abstractions.