OpenVZ的核心是Linux,并进行了修改以加入对OpenVZ虚拟环境的支持。修改后的核心提供了虚拟化,隔离,资源管理和checkpointing。
每一个虚拟环境都是一个单独的個体,表现得和一个物理服务器所表现的相同。每一个虚拟环境都有其自己的:
文件 系統 函式庫, 應用軟體,虛擬化的 /proc 及 /sys,虛擬化的 鎖等等。 用户和用户组 每一个虚拟环境都有其自己的 root用户、用户和用户组。 进程树 虚拟环境只能看见其自己的 进程(从 init开始)。PID也是虚拟化的,所以init的PID是1。 网络 虚拟的 网络设备,允许虚拟环境拥有自己的 IP地址, 以及一组 netfilter (iptables) 及 路由 規則。 设备 如果需要,任何虚拟环境都可以授予访问真正设备,如 网络接口, 串口, 磁盘分区等的权力。 进程间通信对象 共享内存, 信號量, message passing。OpenVZ的资源管理包括三个部分:两级磁盘配额,公平的CPU调度器,以及 user beancounters。这些资源在虚拟环境的运行过程中可以调整,可以不必重启动。
每一个虚拟环境都有其自己的磁盘配额,以磁碟的 block 數和 inode(大概相當於文檔的數目)的數目來計算。在虚拟环境中,可以通过标准的工具来设置UNIX用户和用户组的磁盘配额。
OpenVZ中的调度器是一个两级的公平分享调度策略的实现。
在第一级,调度器根据每个虚拟环境的cpuunits的值决定哪一个虚拟环境被分配CPU时间片。在第二级,标准的Linux调度器使用标准的Linux进程优先级和相关机制决定该虚拟环境中的哪一个进程获得CPU。
2006年4月中旬的OpenVZ发布了动态迁移和checkpointing功能。这使得在将一个虚拟环境从一个物理服务器迁移到另一个物理服务器的过程中不需要进行关机。这个过程被称为动态迁移:一个虚拟环境被冻结,然后它的所有状态被存到磁盘中的一个文件中;这个文件被传输到另外一个机器,然后虚拟环境在那里被解冻(恢复)。整个过程的延迟时间只有数秒。由于状态通常被完整地保护,这个暂停看起来就像一个正常的计算延迟。
OpenVZ提供了命令行工具来管理虚拟环境(vzctl)和虚拟环境中的软件(vzpkg)。
这是一个简单的用于管理一个虚拟环境的高级命令行工具。
vzctl create VEID [--ostemplate <name>] [--config <name>] This command will create a new Virtual Environment with numeric ID of VEID, which will be based on a specified OS template (a Linux distro) and having resource management parameters taken from a specified config sample. Both --ostemplate and --config parameters are optional, defaults for them are given in a global configuration file. vzctl start VEID Starts a given VE. Start means creating a Virtual Environment context within the kernel, setting all the resource management parameters and running VE's /sbin/init in that context. vzctl stop VEID Stops a given VE. A VE can also be stopped (or rebooted) by its owner using standard /sbin/halt or /sbin/reboot commands. vzctl exec VEID <command> Execute a command inside a gived VE. Say, to see a list of processes inside VE 102, use vzctl exec 102 ps ax. vzctl enter VEID Open a VE shell. This is useful if, say, sshd is dead for this VE and you want to troubleshoot the case. vzctl set VEID --parameter <value> [...] [--save] Set a parameter for VE. There are a lot of different parameters. Say, to add an IP address to a VE, use vzctl set VEID --ipadd x.x.x.x --save. To set VE disk quota, use vzctl set VEID --diskspace soft:hard --save. To set VE kernel memory barrier and limit, use vzctl set VEID --kmemsize barrier:limit --save.由于OpenVZ使用了一个单独的核心模型,它就和 2.6 Linux 核心有同样的可扩放性,它支持高达64个CPU和64G内存。一个单独的虚拟环境可以扩放到整个物理服务器,比如说使用所有的CPU和所有的内存。
OpenVZ可以在一台相当好的硬件(主要的限制是内存和CPU)上运行上百个虚拟环境。
图标显示了虚拟环境上的Apache HTTP Server响应时间与虚拟环境数目的关系。测量是在一台有768M内存的机器上进行的;每一个虚拟环境都运行一组通常的进程:init、syslogd、crond、sshd和Apache。Apache用來提供靜態頁面,而這些頁面是由http_load所讀取,然後測度第一個響應的時間。就如你看到的一样,随着虚拟环境的数量增加,响应时间由于内存存储和交换而变得更長。
在这种场景下,在一个768M内存的硬件上运行高达120个这样的虚拟环境是可能的。并以线性的方式外推,所以可以在1台2G内存的硬件上运行320个这样的虚拟环境。
一台OpenVZ物理服务器(也称为硬件节点)的擁有者(root)可以看见所有虚拟环境的进程和文件。这使得大規模的管理成为可能。試想想當你是用 VMware 或 Xen 來做伺服器整合的情況:为了给你的10个虚拟服务器进行安全更新,你必须登录到每一台机器并运行更新过程,這跟你為10台物理伺服器進行更新是一樣的。
在OpenVZ,你可以运行一个简单的shell脚本,就可以一次更新所有的(或只是你选择的)虚拟环境。
