Enterprise Just Builder

Solution for Enterprise Software Architecture

virtualization

初窥 Windows Container 和 Docker

抽象地说所有的计算都是在一系列物理资源上(包括处理器、 内存、 磁盘、 网络等)运行某些”功能”以达成特定任务,这些计算可以是简单的数学运算,比如“1+1”,也可以是跨越多台机器的复杂应用比如 Exchange。随着时代的进步,物理资源越来越强大,结果应用程序常常只利用了物理机所提供的资源的一小部分。因而,工程师们通过创建“虚拟”资源来模拟底层物理硬件,从而使得多个应用可以并发运行 — — 每个应用使用同一物理机器的部分物理资源。

通常这些模拟技术被称为虚拟化。“虚拟化”一词会让很多人联想到虚拟机。不过“虚拟机”只是虚拟化的一种实现,而容器是另一种类型的虚拟化,也称为操作系统虚拟化。以 Linux 容器为例:在一个 Linux 操作系统中可以创建多个容器,对于运行在容器中的应用程序来说,该 Linux 容器就是一个完全隔离且独立的“操作系统”,它的磁盘就像保存原始 OS 文件的副本,内存驻留的文件和数据也和正常启动的操作系统没什么区别。要实现要做到这一点,创建容器的”宿主”机要实现一系列技术。1

首先是名称空间隔离。名称空间包含了应用程序可交互的一切资源,包括文件、 网络端口和活跃进程的列表。通过名称空间隔离,宿主可以为每个容器分配一个虚拟名称空间,其中包含只对该容器可见的资源。在此受限视图中,无论容器运行在什么权限上,它都无法访问其名称空间之外的文件,就是因为这些文件对容器不可见。容器也无法查看该容器外的应用,当然也无法与之交互,所以容器中的应用就会错认为自己独占了整个系统(其实同一时刻还可能还有成十上百个应用在运行)。

出于效率考虑,宿主操作系统的许多文件、目录以及运行服务都被不同容器所共享,并被投影到每个容器的名称空间中。只有当应用程序改动到其容器,容器才会从底层主机操作系统获得一个独立副本 — 但只是包含被改动的那部分文件。这就是 “Docker” 的“copy-on-write”优化。通过共享单个主机可以高效地部署多个容器。

其次需要宿主管控可供容器使用的主机资源。管控诸如 CPU、 RAM和网络带宽等等资源,可以确保容器获得其预期的资源且不影响主机上其他容器的性能。例可以约束某个容器使得它的 CPU 占用率不得超过 10%。这意味着即使应用程序努力尝试,它也不能获得其他 90% CPU 占用,这部分 CPU 主机可以将分配给其他容器或供自己使用。Linux 使用称为 “cgroups” 的技术来实现这种管控。当然如果同一主机上的不同容器之间是相互协作的,并允许主机根据应用的实际需求变化不断动态调整资源分配,此时就无需资源管控。

>>> 阅读全文

 

, ,

从虚拟化到云计算 (三) 编写自己的 VMWare

我一直认为要了解虚拟化,最好的方法是自己编写一个 VMM 应用程序。这有助于对硬件辅助虚拟化技术的深入理解。本文将离开前面两篇文章的理论论述,开始动手编写一个自己的 VMWare。1

本文将要创建的应用程序将会完成: 做好CPU 虚拟化的预备工作;创建客户机;进入并退出该客户机。为了简单起见,我们只针对 X64 模式来实现。该代码只演示了基本的 VMX 功能,也不一定兼容你手上的 CPU,你不过你可以使用 Bochs 并启用虚拟化,然后你就可以测试这些代码了。

我们先对专有名词做一下简单介绍:

  • VMM (虚拟机监视器 — Virtual Machine Monitor) 宿主程序
  • VM (虚拟机 —Virtual Machine)客户机程序
  • 根操作 (Root Operation) VMM 所执行的代码与上下文
  • 非根操作 (Non Root Operation) VM 所执行的代码与上下文
  • VMX 切换: 从宿主机切换到客户机(VMEntry) 或者从客户机切换到宿主机 (VMExit)
  • VMCS:控制 VM 和 VMX 切换的数据结构
  • VM Entry: 从宿主机到客户机的切换
  • VM Exit:由于某种原因,从客户机到宿主机的切换

VMX 操作的生命周期

  • VMM 检查 CPU 是否支持虚拟化 (CPUID) 并启用 (CR4 和 VMXON)
  • VMM 为每一个 VM 初始化一个 VMCS 控制结构。通过 VMPTRST 和 VMPTRLD 指令告诉 CPU 其指针的位置。VMCS 的读写通过指令 VMREAD, VMWRITE 和 VMCLEAR 来完成。
  • VMM 通过 VMLAUNCH 或者 VMRESUME 指令进入 VM
  • VM 通过 VMEXIT 退出到 VMM
  • 反复进行上面的操作
  • VMM 执行 VMXOFF 将自己关闭

 

, , , , , , ,

玩转 UEFI Secure Boot

对 Windows 8.0 的安全启动 (secure boot) 不少人都有困惑,但鲜有人真正了解它是如何工作的。我觉得理解它的最好方式就是从头开始配置安全启动,之后能就看清楚安全启动究竟带来了什么新功能。

首先要解决硬件问题。因为我手边缺少 UEFI 硬件以供测试。幸运的是 OVMF 开源项目提供了可供虚拟机使用的 UEFI 参考固件,它可以在 QEMU 中运行。EDK2 项目提供了编译好的二进制文件。但要支持安全启动,就需要自己动手重新编译。

我们需要的工具是 Intel 的 UEFI Build Tools,它是 EDK2 开发工具的一部分。 利用 svn 或者 git 可以检出 EDK2 源代码。

git clone git://github.com/tianocore/edk2.git

EDK2 随源代码还提供了最新的 Windows 版和 Unix 版的 BaseTools ,这是进行 UEFI 编程的一些辅助工具;如果选择在 Linux 上进行开发,你不得不选择重新编译 BaseTools,详情请参考 Ubuntu Wiki。1

这里假设 EDK2 源代码保存在 C:\edk2 目录中,后续的编译过程均以此为工作目录。你还需安装 iasl 和 Visual Studio 2012 Express 作为编译工具,isal 用于编译 ACPI 代码。此外还需要 Windows 8.0 SDK 或以上版本以及 .NET 4.5,该 SDK 提供了微软签名工具。

>>> 阅读全文

 

, , , , ,

LXC (Linux Container) 初览

LXC 是 Linux Container的缩写。Linux 容器技术是一种内核虚拟化技术(也叫操作系统虚拟化),它提供了轻量级的虚拟化技术,可以在单一控制主机上同时提供多个虚拟环境(即容器)以隔离进程和资源,每个虚拟环境拥有自己的进程和独立的网络空间。在基于容器的虚拟化技术中,进程不再是个全局概念,而是从属于某个特定的容器。理想情况下,进程跟容器之间是动态关联的,进程可以在容器之间迁移。在基于容器的虚拟化技术中,容器既是资源容器,也是隔离的命名空间,它能有效地将由单个操作系统管理的资源划分到隔离的组中,以更好地在隔离的组之间平衡有冲突的资源的占用需求。从用户的角度上看,容器的运行与表现与独立拥有一台 Linux 服务器并无二致。

容器技术原理是基于操作系统内核对不同的进程提供了不同的系统视图, 它可以在本地 CPU 核心运行指令,避免了全虚拟化指令级模拟或即时编译造成的系统开销。同时也避免了准虚拟化(Para-Virtualization)和系统调用替换的复杂性。但是,容器技术强制所有客户必须使使用与控制主机(Control Host) 相同的内核,用户既不能运行其他种类操作系统,也不能运行不同的内核。图 1-1 显示了容器技术和其他虚拟化技术的不同。

容器虚拟化起源于 1982 年发布的 CHROOT 工具,这是一个特殊的基于文件子系统的容器虚拟,最早由 Sun 公司创始人 Bill Joy 开发并且作为 BSD 4.2 的组成进行发布。此后,大量的容器虚拟化技术不断涌现,主要有:

  • Solaris Zones
  • FreeBSD Jails
  • Linux VServer
  • OpenVZ

但是这些技术都没有被 Linux 内核所接受。相反 Linus 选择使用一系列新的内核特性来实现这一目标。Linux Container (LXC) 就是利用这些新特性实现的下一代容器虚拟化技术,并随着 Linux 内核而发布。

下面我们先看一下容器虚拟化的鼻祖 CHROOT 是如何工作的。

>>> 阅读全文

 

, , , , ,

从虚拟化到云计算 (二) 深入硬件辅助虚拟化技术

从业界的整体趋势来看, 数据中心的焦点已经从“更快的性能”走向了合理的性能、合理的功耗、合理的利用以及合理的管理。虚拟化技术的初衷就是为了实现更高的设备利用率,使用户能够尽可能地利用系统资源。有这样一句话,叫做“更多虚拟,更少管理 (Virtualize more, manage less)”,意思是说,如果你能够在单个服务器上虚拟多个系统,就能够以少数几台计算机完成所有工作,这显然能够节省耗电、空间、冷却和管理开支。一个理想的虚拟化解决方案应该提供不同虚拟机之间的彻底的安全的隔离,并为每个虚拟机提供卓越的性能,从而确保整个平台的出色实用性、可靠性和安全性。

完全虚拟化技术可以提供较好的客户操作系统独立性,不过其性能不高。而操作系统虚拟化可以提供良好的性能,然而各个客户操作系统之间的独立性并不强。无论是何种软件方法,隔离性都是由 Hypervisor 软件提供的,过多的隔离必然会导致性能的下降。对于虚拟化技术来说,无论是软件还是硬件辅助的解决办法,其目的和作用都是一样的,都以提高IT系统利用率、大幅降低成本、提高可管理性和建立完善的合作的整体化系统作为其第一要务的

VMM 对硬件资源的虚拟可以划分为三个部分:CPU 虚拟化,内存虚拟化和 I/O 虚拟化。在计算机中,CPU 无疑是最重要的部件,要想虚拟化出一台电脑,CPU 的虚拟化无疑是重中之重,事实上英特尔和 AMD 近年来也在全力推广 CPU 的虚拟化技术。那么究竟哪些处理器是支持硬件虚拟化,除了处理器还需要什么配合才能实现硬件虚拟化呢?下面我们先来看看支持 CPU 虚拟化的硬件环境要求。

Popek 和 Goldberg 在 1974 年发表的论文中提出一个真正的 VMM 必须满足的三个条件:高效性、资源控制和同质性。高效性是指所有的安全指令都可以在本地硬件上直接运行而不需要 VMM 的干预或仿真,资源控制是指任何客户机软件都不能改变它可用的系统资源分配,同质性是指抛开性能略微下降的因素,虚拟机上执行的任何程序的行为必须和在本地机器上运行一样。根据该定义,指令集支持虚拟化的最高效的状态是:所有敏感指令都是特权指令。

敏感指令和虚拟化方法
从软件角度上来说,处理器呈现给软件的接口就是一系列指令(指令集 ISA)和一堆的寄存器(通用寄存器以及状态和控制寄存器),而 I/O 设备呈现给软件的接口也就是一堆的状态和控制寄存器(有些设备亦有内部存储)。这些都是系统的资源,其中影响处理器和设备状态和行为的寄存器称为关键资源或特权资源,如 x86 的 CR0 ~ CR4 寄存器,MIPS 的 CP0 寄存器,PowerPC 的 Privileged SPR 等等。

>>> 阅读全文

 

, ,

从虚拟化到云计算(一)概述

文章评价:

在计算机科学领域中,虚拟化有广义和狭义两种概念。广义上来说,虚拟化代表着对计算资源的抽象,而不仅仅局限于虚拟机的概念。例如对物理内存的抽象,产生了虚拟内存技术,使得应用程序认为其自身拥有连续可用的地址空间(Address Space),而实际上,应用程序的代码和数据可能是被分隔成多个碎片页或段),甚至被交换到磁盘、闪存等外部存储器上,即使物理内存不足,应用程序也能顺利执行。

狭义的虚拟化技术,则通常指的是硬件虚拟化技术,即计算元件在虚拟的硬件基础上而不是真实的硬件基础上运行。将这个概念应用到计算机系统中,可以在一台计算机上同时运行多个操作系统(例如,一台计算机可以同时运行 Linux 和 Windows),不同用户看到不同的单个系统,而且每一个操作系统中都有多个程序运行,每一个操作系统都运行在一个虚拟的CPU或者是虚拟主机上。这通常称为全虚拟化(full virtualization)。

硬件虚拟化也可以有更加复杂的格式,例如单个计算机看上去具有多个架构(对于一个用户来说,它是一个标准的 x86 平台;对于另外一个用户来说,它是 IBM Power PC 平台)。这种虚拟化形式通常被称为硬件仿真。

反之,更加简单的一种硬件虚拟化是操作系统虚拟化 (OS Level Virtualization),其中一台计算机可以运行相同类型的多个操作系统。在传统操作系统中,所有用户的进程本质上是在同一个操作系统的实例中运行,因此内核或应用程序的缺陷可能影响到其它进程。操作系统级虚拟化是一种在服务器操作系统中使用的轻量级的虚拟化技术,内核通过创建多个虚拟的操作系统实例(内核和库)来隔离不同的进程,不同实例中的进程完全不了解对方的存在。比较著名的有 Solaris Container,FreeBSD Jail 和 OpenVZ 等。

>>> 阅读全文

 

, , , ,