OpenVZ 是采用修改过的 Linux 内核在操作系统层进行虚拟化的技术,它让一台实体服务器能够执行多个被隔离、名为容器、虚拟私人服务器(VPS)或虚拟环境(VE)的实例。现时「容器」是最流行的名称。容器有时会被比拟为 chroot 或 jail 类的环境,但容器其实在隔离、安全性、功能、及资源管理方面都更优胜。
OpenVZ 包括一个特制的 Linux 内核(由 OpenVZ 计划提供)及一些用户级的工具。OpenVZ 的可?性非常高,它并不依赖 CPU 内的 VT 支持,因此它可供 x86、x86-64、IA-64、PowerPC 及 SPARC 等中央处理器系列所应用。
操作系统层的虚拟化与 VMware Server、Parallels Workstation、VirtualBox, QEMU、KVM、及 Xen 等以机器/硬件进行虚拟化的产品有颇大分别,这就是在 OpenVZ 下你只能在 Linux 上将 Linux 虚拟化。
OpenVZ 修改 Linux 内核将高级的容器化功能加入其中,藉此容许隔离了的进程组别在一个 init 的旗下执行,附带的还有二十多个控制容器资源应用方法的动态资源管理参数。OpenVZ 计划维护着三个稳定的内核分支:
本于 RHEL4/CentOS4 的 2.6.9
本于 RHEL5/CentOS 5 的 2.6.18
本于原装的 2.6.18
此外还有数个不稳定的分支本于较新版的 Linux 内核,它们也许会渐渐达至稳定的状态。
为何采用 OpenVZ?
由于它较为轻省,相比起机器/硬件级虚拟化,操作系统级虚拟化提供了不少优点:
它的效率较高
它的扩展性较高
它提供较高的机器密度
它提供较多的资源管理参数
采用动态资源管理,因此无须重新引导容器
OpenVZ 能够取得较优越的效率(与原生效率接近至很难量度)、扩展性及密度是由于只有单一个 Linux 内核在实体主机上执行,至于每个容器只占用当中的进程/服务所需的资源,而不必耗用整个操作系统的额外资源。一个基本的容器在主机上也许会是 8 至 14 个额外的进程。只要配合适切的资源管理设置,OpenVZ 亦能处理更高级的程序,例如拥有数百个进程/线程的巨型 Java 应用程序。
OpenVZ 的另一个优点就是它提供了广泛的动态资源管理参数,包括内存使用量、进程的数目、处理器使用量、磁盘空间使用量等等……它们全都可以在容器运行时被修改。OpenVZ 在容器内亦支持容器的磁盘配额,及(选择性地)支持用户和群组的磁盘配额。
OpenVZ 提供数项高级的功能,包括「检查点」及将容器由一台主机「迁移」到另一台。迁移共有两种方式:
即时迁移减少停机的时间(只须数秒),并且保持机器的运行时间及网络连接。
脱机迁移就是将机器停止,迁移它,然后重新打开它。
OpenVZ 的迁移功能「并不」须要一个共享的存储方案,而是利用 rsync 将容器的目录整全地由一台实体主机复制到另一台。
何时不要用操作系统级虚拟化
虽然在很多应用案例下你都可以考虑使用操作系统级虚拟化,在某些情形下操作系统级虚拟化并不合适,而机器/硬件级虚拟化会是较好的选择:
当你想执行非 Linux 的操作系统
当你想执行多个内核版本
当你需要一个多方面自定的内核
OpenVZ 的历史
SWsoft(现称为 Parallels)在 2001 年针对 Linux 发行了一个名叫 Virtuozzo 的产品。他们的现有产品名叫 Parallels Virtuozzo Containers。微软 Windows 版的 Virtuozzo 在 2005 年被发行。同样在 2005 年,SWsoft 成立了 OpenVZ 计划,以 GPL 2 授权方式公开 Virtuozzo 背底后的技术。
纵使操作系统级虚拟化在媒体里所获的关注不及某些新兴的机器/硬件级虚拟化产品般多,自 2001 年(Virtuozzo)及 2005 年(OpenVZ)的发行,它们在环球数万台服务器上已证明了自已效率高、稳定、安全及耐用。时至今日,Linux 的操作系统级虚拟化(包括了 Linux-VServer)可算是历史最悠久和最广泛部署的 Linux 虚拟化平台。
操作系统级虚拟化与 OpenVZ 的未来
在数个于 2007 及 2008 年发表、关于 Linux 内核的未来的简报里,Andrew Morton 认定容器是他唯一能肯定会在 Linux 内核出现的东西,因为有数位利益关系人如 IBM、Google 及 OpenVZ 计划等都正在研究它。
容器的功能自 2.6.24 版内核开始出现于主线的内核中,更多功能将会在其后的版本相继被加入。这些功能普遍被称为 control groups(简称为 cgroups),而数个内核子系统(如调度器、内存管理器等)已获修改来支持 cgroup。现时亦未知主线 Linux 内核中的 cgroup 支持仍需多久才会功能全备、稳定、及被广泛采用……因此 OpenVZ 似乎仍会逗留一段日子。
还有一个针对 Linux 的操作系统级虚拟化产品名叫 Linux-Vserver。Linux-VServer 同样是一个高质素的产品/计划,但它与 OpenVZ 之间有数个分别。Parallels/OpenVZ 正在与主线 Linux 内核的开发者合作,为要将容器的功能加进主线 Linux 内核里。Linux-VServer 的开发者以独立型式运作,并决定在可见的未来保持 Linux-VServer 为树干以外的修正。这并不是说 OpenVZ 将会直接被放进主线的内核里,因为事情并非如此。cgroup 方面的努力来自所有利益关系人的共识。不过明显地 OpenVZ 计划在主直插式核里已经贡献了很多源代码。
安装 OpenVZ
OpenVZ 计划的网页(www.openvz.org)内备很多高质素的文档,包括一份用户指南 PDF、一份快速安装指南、及 wiki 内丰富的教学及排除疑难文章。这篇文章会简短地涵盖安装的过程。在下面所有步骤中你都须要是 root 用户。
添加 OpenVZ 的 yum 软件库
在一台 CentOS 4 或 CentOS 5 的主机上安装 OpenVZ 很简单,因为 OpenVZ 计划提供了 openvz.repo 供 yum 使用。你只须下载 openvz.repo 这个文件并将它放置在 /etc/yum.repos.d/ 这个目录内。请查看 openvz.repo 这个文件,因为它收录了数个软件库的定义,其中两个缺省是被启用的:(一)以 RHEL5 为基础的内核及(二)OpenVZ 的工具。请编辑它来乎合你的需要。
输入 OpenVZ 的金钥
rpm --import http://download.openvz.org/RPM-GPG-Key-OpenVZ 安装 OpenVZ 内核
视乎你需要哪一种内核结构,你可简单地执行:
yum install ovzkernel.i386 或
yum install ovzkernel.x86_64
OpenVZ 内核安装完成后便是时候重新开机,但在开机前仍有些额外的细节须要处理:
查看 /etc/grub.conf 来确定已缺省所需的内核,
编辑 /etc/sysctl.conf 来启用 OpenVZ 所需的某些内核功能和确定 SELINUX 已被停用。
我不会涵盖如何编辑 /etc/grub.conf,因为这是项很普遍、非 OpenVZ 专用的工作。
编辑 /etc/sysctl.conf
你喜欢的话,请将原装的 sysctl.conf 文件备份(cp /etc/sysctl.conf /etc/sysctl.conf.original)。请利用你喜欢的文字编辑器修改 /etc/sysctl.conf 这个文件并加入以下内容:
# 在硬件节点上我们普遍需要
# 启用封包转发及停用代理 arp
net.ipv4.ip_forward = 1
net.ipv4.conf.default.proxy_arp = 0
# 启用来源路由检验
net.ipv4.conf.all.rp_filter = 1
# 启用 magic-sysrq
kernel.sysrq = 1
# TCP Explict Congestion Notification
# net.ipv4.tcp_ecn = 0
# 我们不想所有网络界面送出转递
net.ipv4.conf.default.send_redirects = 1
net.ipv4.conf.all.send_redirects = 0 停用 SELINUX
很不幸 SELINUX 不能与 OpenVZ 内核兼容,亦不包含在其中。要停用 SELINUX,请利用你喜欢的文字编辑器修改 /etc/sysconfig/selinux 这个配置文件并将它设置为停用:
SELINUX=disabled 现在是时候重新引导你的计算机进入 OpenVZ 内核。
安装工具
要安装 OpenVZ 的工具程序,请简单地执行:
yum install vzctl vzquota 当你安装了 vzctl 后,你便要这样做来引导 OpenVZ 这个服务:
service vz start vz 这个服务应该已经被设置为自动引导,但你可随意用以下方法来检查:
chkconfig --list vz
现在 OpenVZ 的安装已经完成,而你亦准备好创建你的首个容器,但你首先要取得所需 Linux 发行版本的安装媒体。
利用 OpenVZ
操作系统范本 —— Linux 发行版本的安装媒体
vzctl 这个指命是用来创建及设置 OpenVZ 容器。在你创建一个容器之前,你须要拥有你想安装的 Linux 发行版本的安装媒体。OpenVZ 不能应用 CD/DVD 安装媒体(又或者 .iso 光盘映像档)。OpenVZ 需要它称为操作系统范本旳东西来为某个 Linux 发行版本创建一个容器。你可以从 OpenVZ 的网页下载一些预制的操作系统范本。这是推荐给新 OpenVZ 用户的途径。当你对 OpenVZ 更为熟识,你或许会想按照 OpenVZ wiki 上的众多方法从头创建你个人的操作系统范本。你可以这些地方找由 OpenVZ 划计提供的预制操作系统范本:
http://download.openvz.org/template/precreated/
你亦可以在这里找到由社区所贡献的操作系统范本:
http://download.openvz.org/contrib/template/precreated/
请下载所需的操作系统范本并将它放在你的 CentOS 5 主机内的 /vz/template/cache 目录。
创建你的首个容器
要创建一个容器,请采用 vzctl 这个指令,连同 create 选项及数个参数。你须要选择一个独特的容器标识码(CTID)。你也须要一些额外的数据:你想从哪个操作系统范本进行安装?它会拥有哪个 IP 位置?你想给它什么主机名称?你初步想将什么资源赋予它(取自配置文件)?这一切都可以通过以下参数来设置:
--ostemplate {范本名称}
--conf {配置文件名称}
--ipadd {nn.nn.nn.nn}
--hostname {完整域名} 这里有一个完整的样例:
** 上面这个会提示找不到 ve-vps.basic.conf-sample ** 下面这个例子比较好,新版本openvz已带的一个模板是 ve-basic.conf-sample , 对应 conf basic vzctl create 101 \ 这样便会创建一个名叫 /vz/private/{容器标识码} 的目录并将操作系统范本解压到其中。它也会复制指定的文件到 /etc/vz/conf/{容器标识码}.conf 作为该容器的配置文件。请留意 --ostemplate 及 --conf 的值与操作系统范本名称或文件名称并不吻合……它们较为简短。 vps.basic 这个配置文件正如其名,是十分基本……它配置给容器的资源亦比较保守。你若果想查阅与资源相关参数及它们的值,请看看位于 /etc/vz/conf 这个目录内的配置文件。你可以利用 vzsplit 这个指令(man vzsplit)来创建自定的样例配置文件(不限数量),或者复制现有的配置文件到新的文件来进行编辑。 当你创建了一台机器后,你需利用 vzctl set 这个指令来设置数个额外的参数。下面是一个例子: 这样做会更新你的容器的配置文件(在这个样例中是 /etc/vz/conf/101.conf)。当你执行 vzctl set 这个指令时不包含 --save 这个参数时,它便不会将改动存储到你的配置文件内……不过假若该容器正在运作中,它会为该工作阶段动态地更改这些参数。你基本上会经常为 vzctl set 这个指令加入 --save 作为最后一个参数。 引导你的新容器 你只需执行以下的指令来引导你的新容器: 你应该会看见一则信息关于容器正在引导中。若果你没有打错任何参数,它应该立即运行。 一如你所期望,stop 及 restart 这些关键字都会如你预料般运作。假若一个容器没有运行,你可以 destroy 它来删除它的配置文件及从主机的文件系统删除它的目录结构(/vz/private/{容器标识码})。 进入你的新容器 当你的容器已在运作时,它应该如同一部实体的服务器般可以在网络上被访问。但由于你位于主机上,你可以利用 vzctl 这个捷径直接进入容器而不须 root 的凭证。 vzctl enter {容器标识码} 在我们的样例中这是 vzctl enter 101 你应该在新的容器内取得一个新的指命符号。你多数会想利用 passwd 这个指令来设置 root 的密码,或者在主机上执行以下指令: vzctl set {容器标识码} --userpasswd {user}:{password} --save 这里假设你是一个不错的 Linux 系统管理员而且不害怕命令行。请到处看看你的新系统。它在外观及行动上都应该与一台实体的机器无异。你可以安装软件(见下文关于 yum 的部份)、创建户口、新增系统服务及修改它们的设置。 你可以查阅一个容器的 /proc/user_beancounters 文件来查看有多少资源被配置给它。你可以查阅主机上的 /proc/user_beancounters 来查看每个容器的所有参数。资源管理已经超越了这篇文章的范畴,因此详情请参阅 vzctl 的使用手册或 PDF 版的用户指南 。 假若 yum 不在我的容器里,怎样办? 在 2009 年 1 月前,OpenVZ 计划所提供的预制操作系统范本并未安装 yum,而这导致很多用户生气。原因是某些 OpenVZ 系统管理员较喜欢在主机上应用一个名叫 vzyum 的工具,它能在容器里进行类似 yum 的操作。为什么它们喜欢这样做?因为假若每个容器都各自利用 yum,yum 的数据库及高速缓冲文件有时可以占用大量的磁盘空间(及带宽)。在主机上应用 vzyum,只有一个 yum 数据库/高速缓冲会存在,而每个组件只须下载一次。 在 2009 年 1 月 OpenVZ 计划为发行了更新版的预制 CentOS 操作系统范本,当中包含了 yum,因此这个问题已经不再存在。官方的操作系统范本大约每个月更新一次,故此你没有理由采用未安装 yum 的旧版操作系统范本。如果你的 CentOS 操作系统范本并不包含 yum,它要不是旧过 2009 年 1 月,就是来自 OpenVZ 计划以外的源头。 如果你仍然在应用一个未安装 yum 的 CentOS 容器,OpenVZ 的 wiki 有一页解释如何在容器内安装 yum。基本上你要下载 yum 所须的一切 rpm 组件然后利用 rpm 安装它们。盼望这个问题已经成为过去。 结语 这篇文章只处理了 OpenVZ 的最基本部份。未涵盖的主题包括监测容器、资源管理、编辑/创建配置文件(参阅 vzsplit 使用手册)、容器文件系统、与及要成为一位有效率的 OpenVZ 系统管理员的所有额外工序。另外也请留意 OpenVZ 拥有两款网络适配器,而这里只处理了基本/缺省的 venet 类型。veth 这款网络适配器拥有更多元化的功能。 OpenVZ 计划所提供的文档质素很高,数量亦多。请切记阅读 PDF 版的用户指南作为最全面的文档。不过这份指南有一点过时,因为它是在 veth 网络设备、检查点及迁移功能被加入前写成的。还有就是不同指令的使用手册。当你需要迁移容器时,务请阅读 vzmigrate 的使用手册。 我们鼓励你参予及投身在 OpenVZ 计划,方法包括浏览 OpenVZ 网站、应用论坛和 IRC 频道(Freenode IRC 网络上的 #openvz)、与及在 http://bugzilla.openvz.org 汇报你碰到的错误。请让自己熟悉 OpenVZ 的网站,因为它收藏了很多材料。
vzctl create 101 \
--ostemplate centos-5-i386-default \
--conf vps.basic \
--ipadd 199.199.199.199 \
--hostname mynew.container.com
--ostemplate centos-5-i386-default \
--conf basic \
--ipadd 199.199.199.199 \
--hostname mynew.container.com
vzctl set 101 \
--name mynew \
--nameserver "205.171.2.65 205.171.3.65" \
--diskspace 10G:10G \
--save
vzctl start {容器标识码} 或者在我们的样例里:
vzctl start 101