什麼是敏感指令

1974年,Popek和Goldberg在美國电脑協會的通訊期刊上發表了一篇論文"虛擬化第三代架構的一般性要求"(Formal Requirements for Virtualizable Third Generation Architectures)。在這篇文章中,提出了敏感指令的概念。 敏感指令(Sensitive Instructions)的定義: 敏感指令是這樣一組指令,這些指令的行為取決於指令執行時處理器的工作模式,以及指令在記憶體中的位置。 ——- 對敏感指令的處理是虛擬化技術的一個關鍵點。在用戶態執行的敏感指令如果總會造成陷入(always generates a trap),這樣的敏感指令也屬於特權 指令。在不使用Wmware提出的動態二進制翻譯機制的情況下,除非所有的敏感指令都是特權指令,虛擬機管理程式才能保證正確運行。換言之,如果某種處理器架構的所有的敏感指令都是特權指令的一個子集,我們就可以說這種處理器架構是可虛擬化的。在這種情況下,我們就可以肜經典的“陷入後模擬“(trap-and-emulate)的方法實現虛擬化。按照這個定義,在嵌入式工業中最常見的ARM架構則不是可虛擬化的,因為ARM的敏感指令有些是特權指令,有些則不是。 原文 from the paper “KVM for ARM” by Christoffer Dall and Jason Nieh, Columbia University:Popek and Goldberg define sensitive instructions as the group of instructions where the effect of their execution depends on the mode of the processor or the location of the instruction in physical memory. A sensitive instruction is also privileged if it always generates a trap, when executed in user mode. The VMM can only guarantee correct execution without the use of dynamic translation if all sensitive instructions are also privileged. In other words, an architecture is virtualizable if and only if the set of sensitive instrucctions is a subset of the seet of privileged instructions. If that is the case, the VMM can be implemented using a classic trap-and-emulate solution. Unfortunately, ARM is not virtualizable as the architecture defines both sensitive privileged instructions and sensitive non-privileged instructions. ...

June 21, 2012 · 1 min · kamus

为什么要虚拟化

如今,虚拟化是炙手可热的一个高频词。一些质疑虚拟化的人经常会问:我们为什么要搞虚拟化呢,计算机硬件变得越来越便宜了啊!另一方面,一些痴迷虚拟化技术的狂人们在他们的桌式机上用虚拟机运行着四五个操作系统。他们或许也有同样的疑问。仅管他们看着虚拟机里旧式操作系统,模拟出的旧式硬件,觉得非常爽非常有成就感。但是他们却不太解释得清楚究竟为什么需要虚拟化技术。那么,这篇文章将要告诉你我们需要虚拟化技术的原因。 整合 Consolidation: 使用虚拟化技术的最常见原因是需要整合:把多台机器的工作负载全部整合到同一台机器上面。在更少的物理机器上运行更多的虚拟机。但是你肯定要问:计算机已经越来越便宜了呀。没错,计算机越来越便宜了。但是如果机器非常多的话,这个价格你是绝对不能忽略的。 典型的数据中心 A Typical(full) data center 让我们来看一看当今世界的数据中心。如今的数据中心里急缺存放机器的空间,房子里满满的塞满了机器,你找不到更多的地方来添置计算机或空调之类的设施。空间利用率已经接近极限了。但是,大多数机器的资源利用率却非常地低。大概平均只有10-20%的的资源利用率。简言之,数据中心的物理空间已经饱合,但是物理机器的使用能力确远远没有利用足够。那么,如果数据中心要承担多更的工作负载,你会再建一个数据中心呢还是想办法把没有利用好的资源利用起来。 只有数据中心还有空间让你添置机器,当然多加一台机器就相当容易的解决问题了。但无论如论你放不上新的机器的时候,你应该会有很大的麻烦说服BOSS新建一个数据中心。另外一个大问题是,即使BOSS答应新建一个数据中心来解决问题,但是巨大的电力供应从哪里来呢。一个一千万瓦功率的数据中心不是说接入电网就可以接入电网的。你或许还要说服电网的领导批准提升电网的供电能力。 虚拟化是解决这个问题的最佳办法。用虚拟化把所以机器的性能都利用起来吧! 隔离硬件(Hardware Isolation) 硬件的性能每个月都在快速提高。但是,当我们把工作负载转移到一台新的服务器的时候,我们还需要先在裸机上安装操作系统,然后再配置各种软件环境,再把所有的数据转移到这台新服务器上来。忙到最后我们还要心惊肉跳的祈祷一切顺利! 如果使用虚拟化,你就不必这么麻烦了,因为不再直接与硬件层交互。你只需要在新的机器上部署好虚拟环境,再把虚拟机整个移过来。不需要再额外配置什么鬼东西,因为配置就在虚拟机里面,你已经把虚拟机整个搬来了。 历史遗留的旧操作系统(Legacy Operating System) 计算机工业走了这么多年,碰到要维护旧的操作系统并不鲜见。不幸的是,你有一个致关重要的程序只能够在这个恐龙级别的操作系统下运行。但大多数老旧的操作系统不能够在新的硬件上运行呀,你又没有办法再配置一台旧硬件的机器。 解决方案就是使用虚拟化。比如Vmware的Binary rewriting,或者Xen又或者KVM都可以。工作原理则是虚拟层模拟了简单的硬件,从你的旧操作系统看过去,多核CPU变成了老旧操作系统支持的旧时代CPU,当然频率却变快了。多核,ACPI设备发现,中断路由,支持10G以太网,支持SATA都不会成为你运行旧操作系统的障碍,因为虚拟层(Virtualization Layer)! 当然了,虚拟化本身会占用一些性能。但是因为采用了虚拟化,你才能在非常快速的新硬件上运行旧操作系统,这样得到的效率提高要远远高于在原生态支持旧操作系统的旧硬件上运行。因此,还为你节省了电费。 测试(Testing) 不管你是学习软件开发的在校学生,还是大银行的首席信息官,你一定缺少足够多的测试硬件吧。 虚拟化可以解决这一问题。在虚拟机上测试新发布的Fedora Rawhide或者Debian Unstable先,而不是直接格掉机器安装。还能给你的开发团队一把虚拟机,让每人一台虚拟机想测试什么就测试什么。 维护(Maintenace) 有了虚拟化,能方便很多方面的维护。 比如使用即时迁移技术,像Vmware的vmotion,Xen的Live Migration,你可以在保持虚拟机上的操作系统正常工作的情况下把虚拟机从一台物理机器移动到另一台物理机器。这项技术确实非常有用啊,不仅仅可以用来在你的朋友面前炫燿。 还有很多情况,你可以使用到即时迁移技术。比如物理机的硬件故障。有一台机器的CPU风扇坏了,CPU的保护系统自动启用使用CPU工作在一个非常慢的速度。那么你就可以把虚拟机即时迁移到另一台健康的机器上,然后修理那台坏的机器而不致于产生Downtime。又如,某台虚拟机的工作负载越来越大,那么你可以这台虚拟机所在的物理机上另外一些虚拟机器迁移到其它物理机上,为这台需要更多资源的虚拟机提供更多支持。有时候你需要升级某台机器的硬件,那么先把这台机器上所有的虚拟机即时迁移到其它机器,再开始你的硬件升级工作,还是没有任何Downtime。酷毙了,是吗? 节省能源(Power Saveing) 举个例子,你有100台服务器运行着各种各样的100个服务程序。但每台服务器的负载只有不到50%,那么你可以用50台物理机器虚拟出100台虚拟机运行100个服务程序。一下子节省了50%的电力,不是吗?想想,一个功率是一千万瓦的数据中心如果能节省50%的电力,这是个多么了不起的数字啊!为你节省了电费钱,还为对抗全球变暖做出了贡献。 安全和性能隔离(Security and performance isolation) 如果你采用虚拟机把不同的程序运行在不同的虚拟机里面,那么如果其中有一个程序出错,吃光了所有的内存,它也不至于影响其它程序。因为其它程序运行在不同的虚拟机里,它们仍然运行得很好,一点都不会受到那个出错程序的影响。如果这些程序运行在同一个OS下,那情况就不妙了。 一个相似的情况下,如果有一台虚拟机被入侵者攻陷,那么入侵者仅仅只控制了这一台虚拟机,暂时不能对其它虚拟机造成直接威胁。当然,这些虚拟机应该相互隔离的很好,每台虚拟机都运行着自己的内核,大多数虚拟化技术都是这样做的。但有一种虚拟化技术叫做容器技术(Container Technoloties),如Linux VServer, Virtuozzo/OpenVZ和Solaris Zones,它们实现的虚拟化的隔离性要相当低一些,得到的好处是虚拟化自身消耗更少的硬件资源。 copyright ykyi.net

June 16, 2012 · 1 min · kamus

怎么编译,构建,安装,使用WinKVM

 WinKVM : Windows kernel-based Virtual Machine   WinKVM Windows下台下基于内核的虚拟机(Linux的KVM的windows移植)   怎么编译,构建WinKVM   ...

June 13, 2012 · 1 min · kamus

KVM你问我答 FAQ (四)

KVM和Xen有什么区别? Xen是一个外部虚拟机管理程序(External hypervisor),它承担了管理物理机器的任务并把物理机器的各种资源分配给客户机。与Xen不同,KVM本身是Linux内核的一部分,它使用Linux自己的进程调度和内存管理。这就天然决定了KVM易于使用并于体积会很小。仅管体积小,但KVM的功能确不少。比如,KVM可以把客户机从内存中兑换到物理磁盘上,如同swap普通进程一样释放RAM。KVM目前只在提供支持硬件虚拟化的x86机器上运行(如vt/svm指令集)。从这这方面讲,Xen通过修改客户机操作系统,充许虚拟机运行在没有硬件虚拟化技术的x86平台上运行。这种虚拟化技术称之为准虚拟化paravirtualization,参见另一贴:Linux的虚拟化技术。KVM在CPU级别不支持paravirtualization,但为了指高I/O性能,会对设备驱动程序支持准虚拟化。 KVM和Vmware有什么区别呢? VMware是一个商用专用虚拟化产品,KVM是在GPL许可证下发布的自由软件。 KVM和QEMU有什么区别? QEMU是模拟器。参见Linux的虚拟化技术 KVM & QEMU 。 KVM有windows下的移移植版本吗? ...

June 11, 2012 · 1 min · kamus

KVM你问我答 FAQ (三)

我在使用QEMU,如何知道我有没有启用KVM的硬件加速功能? 如果你怀疑你没有启用KVM提供的硬件加速功能。你可以按照下面的步骤做检查。首先,看看你有没有得到下面的提示信息: qemu-system-x86_64 -hda myvm.qcow2 open /dev/kvm: No such file or directory Could not initialize KVM, will disable KVM support 如果是这种情况,请再检查: kvm模块被正确载入了吗? lsmod | grep kvm. 查看 dmesg 的输出,保证没有这个提示信息: “KVM, disabled by BIOS”. 请确保/dev/kvm 确实存在,而且你有权限使用它。 其它诊断方式: 如果你能使用 QEMU monitor ( ctrl-alt-2, 再 ctrl-alt-1 回到 VM 的显示屏 ),敲入 info kvm 命令。如果正常的话,应该有“KVM support: enabled”这条信息输出。 在host机上敲 lsmod | grep kvm 命令,看看输出的最右栏。如果kvm在正常运行的话,这个数字不能是0。这行的数字与架构相关的模块(一般指的是kvm_intel,或kvm_amd)有联系,它显示了有多少个VM正在使用这个模块。举例说明,如果你有两个虚拟机正在使用KVM模块,host机的CPU使用的是vt技术,那么就会得到: # lsmod | grep kvm kvm_intel 44896 2 kvm 159656 1 kvm_intel ...

June 10, 2012 · 2 min · kamus

KVM你问我答 FAQ (二)

如果我的没有root权限,怎么使用KVM呢? 最简洁的做法就是创建一个组,比如kvm组,然后把将要使用kvm的用户添加到组里面。然后用chown命令把/dev/kvm的所有组改成kvm。如果你的系统里安装了udev,你还可以通过配置udev的方式使得linux自动把新创建的设备设成正确的组。比如在ubuntu的/etc/udev/rules.d/40-permissions.rules文件中增加一行: KERNEL==”kvm”, GROUP=”kvm” 怎么做才能得到kvm的最佳性能呢? See the Tuning KVM page. KVM稳定吗? ****KVM非常稳定而且已经用于工作生产环境之中。对于所有的开始工程,开发版的稳定性总是逊于稳定发行版。建议使用稳定发行版。KVM已经被使用比较长一段时间,模拟常用的操作系统和配置。一但有问题出现,开发者会在第一时间修复。参看Guest Support Status,列举了目前运行良好的操作系统。****zausiu’s blog http://ykyi.net KVM真的可以用于生产环境吗? ****为了稳定性,强列建议你使用你使用的发行版提供的KVM模块。如前面所述,及早使用新特性总是令人开心的事情。但是,你常常要要承担一定的风险,一些未知的问题可能在使用时暴露出来。在生产环境中,最好使用你使用的发行版提供的稳定版,而开发版本,如果你愿意,可以使用在不是那么重要的环境下。 如果我用kill -9杀掉VM进程会发生什么事呢? ****From the guest’s perspective, it is as if you yanked the power cord out. From the host’s perspective, the process is killed and all resources it uses are reclaimed. 从客户虚拟机的立场来看,这就如同被拨掉了电源。从Host机的立场看,仅仅是VM进程被杀死了,这个VM进程所申请的所有系统资源被回收给操作系统。如前文所说,对于linux内核,VM进程就是一个普通的进程。 请帮助我设置客户机的网络。 ****可以参考这里 Networking 设置网站,也可以找找QEMU的网络设置相关文档。 哪里有更多KVM的文档呢? 绝大多数问题都在QEMU的 documentation中被提到了,还有部分在扩展FAQ ( 已经废弃的老板 FAQ). ...

June 9, 2012 · 1 min · kamus

KVM你问我答FAQ (一)

使用KVM需要哪些准备? ****你需要一台运行Linux的x86的机器。它的CPU是有VT技术支持的英特尔cpu或者有SVM(又常被称为AMD-V)支持的AMD的CPU. KVM支持64位的处理器吗? ****KVM支持64位的处理器!此时,你可以运行32位或者64位的客户机。 What is Intel VT / AMD-V / hvm? 英特尔VT,是什么?AMD-V又是什么?hvm是什么? Intel VT 和AMD’s AMD-V 都指的是指令集扩展。它们在硬件层面帮助实现虚拟机管理技术。这种技术使得在虚拟机上运行的速度接近直接在真实机器上运行的速度。HVM是硬件虚拟机的缩写(Hardware Virtual Machine )则是一个生产商中立的词汇(vendor-neutral term),它常常用来指代x86指定集扩展。 从哪里得到KVM内核模块呢? ****可以从这里获得 http://www.linux-kvm.org/page/Getting_the_kvm_kernel_modules 。 我如何知道我的CPU支持Intel VT技术或者AMD-V技术呢? 如果你的Linux操作系统比较新,尝试以下的指令: . egrep ‘^flags.(vmx|svm)’ /proc/cpuinfo* 如果出现一些文字,那说说你的CPU支持虚拟化。你也可以在/proc/cpuinfo文件中找到处理器模块的名字,然后到供应商的网站上查询。 注意: 如果安装了Xen hypervisor,为了防止被劫持,你在dom0和domU中都得不到这些输出。dom0和domU是Xen hypervisor的术语。如果你没有安装Xen,直接忽略。 一些产商默认在BIOS定设中禁用了CPU的虚拟化支持。你需要先在BIOS中打开虚拟化支持。 如果你用的是intel cpu,对于内核版本2.6.15以前的Linux,你得不到这样的输出。如果你用的是amd cpu,对于内核版 本2.6.16以前的linux,你得不到这样的输出。如果你不确定你的Linux内核版本,用#uname -r 命令查看。 出现 “KVM: disabled by BIOS” error 错误 Check if there is an option to enable it in the BIOS. If not, look for a more recent BIOS on the vendor’s web site. 在BIOS设定在找找看有没有启用cpu虚拟化的选项,如果没有,去到主板厂商的网站上面看看有没有新的BIOS发布并支持打开cpu虚拟化,那么你需要刷新BIOS. 注意: 1.对于部分硬件(如 HP nx 6320),你需要先关掉主机电源,再打开主机电源才能使BIOS中启用cpu虚拟化支持生效。 2.BIOS的部分设定有可能与启用CPU虚拟化冲突。比如在Thinkpad T500上,启用Intel AMT技术会出现冲突。这样kvm-intel在载入时会抱怨”disabled by bios”错误。 3. 在一些Dell的硬件中,你还需要禁用”Trusted Execution”,否则不能打开VT。 ...

June 9, 2012 · 1 min · kamus

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

在服务器和桌面上部署虚拟化已经越来越流行。但是大多数一定没有想过在嵌入式环境下部署虚拟化。 Hypervisor(又被称之为虚拟机管理程序virtual machine monitor)如今已经在这颗星球上所有的数据中心遍地开花。因为它给数据中心带来了节省硬件,节省能源的费用,还降低了管理的成本。事实上,从兆兆级的路由器到富媒体的机顶盒,再到手机等等嵌入式系统,它们同样能从虚拟化中受益。 zausiu’s blog http://ykyi.net 因为嵌入式系统的资源非常有限。它们还通常是定制的系统,软硬件紧密结合在一起。初看来,在嵌入式设备中部署虚拟化显得过于隆重。但下文告诉你在嵌入式设备中部署虚拟化的八大理由。 更坚固 定制的硬件是非常昂贵的,如果把多种物理设备集成到一起就能降低成本。集成在一起当然比分布式的环境要简单得多。如果所有的虚拟机运行在相同的服务机上,划分网络的风险就不存在了,硬件故障也有了‘原子性’(hardware failures are atomic),而且在虚拟化环境下已经有非常成熟的解决方案处理硬件故障,这样的故障通常会让没有部署虚拟化的系统崩溃。 更安全 试想,如果一个部署了java虚拟机的手机系统把java stack和通讯栈运行在两个虚拟机上。那么即使应用程序管理部分被攻破了,也不会危险到通迅栈。对于恶意代码,虚拟机环境是一个大沙箱。 更可靠 通过虚拟化可以把特权代码和一般代码分开,能够阻止和减少整个设备的故障率。 易于管理和开发 即使是运行实行操作系统,你不要因为那些非常有限的管理功能就心满意足了。一个运行windows的负责管理功能的虚拟机能够运行图形介面的程序,方便了用户也方便了开发者。 硬件虚拟化 VMM相当适合硬件虚拟化。它连同虚拟控制器一起动态的切分或者合并物理资源。对于大型的,分布式的嵌入式设备如路由器则可以在部署了虚拟化的情况下自由的切分或合并。Zausiu’s blog http://ykyi.net 效率 单核世界已经快速离我们远去,即将消失在历史长河中。而大多数嵌入式软件没有充分利用多核或多处理机的优势。那么,虚拟化帮助系统充分利用嵌入式系统的性能。 新特性 一些振奋人心的超酷特性,如:快照,实时迁移(live migration),External Hibernation能够加强嵌入式设备的可用性,且方便可级。 法律问题 从商用专有代码连接GPL代码会被迫遵守GPL协议。而把GPL代码运行在虚拟机上就可以规僻GPL协议的约束了。 这篇文章译自: http://www.linuxplanet.com/linuxplanet/reports/6490/1 这八大理由中的很多条目我觉得没有说服力!

June 8, 2012 · 1 min · kamus

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包括两部分组件: 一个设备驱动程序用来管理虚拟化硬件。这个驱动是一个字符驱动,用来管理虚拟化硬件(for managing the virtualization hardware)。 一个用户空间运行的模拟器。通常选择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/

June 7, 2012 · 1 min · kamus