在 CentOS 5 上安装及应用 OpenVZ

请注意 OpenVZ 内核是 OpenVZ 计划的产品,而且并不由 CentOS 支持。

OpenVZ 计划紧贴 RHEL 所发行的内核,并适时地在新版的 Red Hat(和 CentOS)内核发行后提供更新。因此以 RHEL 为基础的 OpenVZ 内核十分适合在 RHEL 及 CentOS 主机上应用,并(差不多)支持相同的硬件。不过请留意 OpenVZ 内核将某些硬件的支持直接编译在内,因此它的模块性较标准的 Red Hat/CentOS 内核为低。

我们推荐你完整地阅读完这篇教学文章后才尝试当中所示范的步骤。

OpenVZ 是什么?

OpenVZ 是采用修改过的 Linux 内核在操作系统层进行虚拟化的技术,它让一台实体服务器能够执行多个被隔离、名为容器虚拟私人服务器(VPS)或虚拟环境(VE)的实例。现时「容器」是最流行的名称。容器有时会被比拟为 chrootjail 类的环境,但容器其实在隔离、安全性、功能、及资源管理方面都更优胜。

OpenVZ 包括一个特制的 Linux 内核(由 OpenVZ 计划提供)及一些用户级的工具。OpenVZ 的可㩦性非常高,它并不依赖 CPU 内的 VT 支持,因此它可供 x86、x86-64、IA-64、PowerPC 及 SPARC 等中央处理器系列所应用。

操作系统层的虚拟化与 VMware ServerParallels WorkstationVirtualBox, QEMUKVM、及 Xen 等以机器/硬件进行虚拟化的产品有颇大分别,这就是在 OpenVZ 下你只能在 Linux 上将 Linux 虚拟化。

OpenVZ 修改 Linux 内核将高级的容器化功能加入其中,藉此容许隔离了的进程组别在一个 init 的旗下执行,附带的还有二十多个控制容器资源应用方法的动态资源管理参数。OpenVZ 计划维护着三个稳定的内核分支:

  1. 本于 RHEL4/CentOS4 的 2.6.9
  2. 本于 RHEL5/CentOS 5 的 2.6.18
  3. 本于原装的 2.6.18

此外还有数个不稳定的分支本于较新版的 Linux 内核,它们也许会渐渐达至稳定的状态。

为何采用 OpenVZ?

由于它较为轻省,相比起机器/硬件级虚拟化,操作系统级虚拟化提供了不少优点:

  1. 它的效率较高
  2. 它的扩展性较高
  3. 它提供较高的机器密度
  4. 它提供较多的资源管理参数
  5. 采用动态资源管理,因此无须重新引导容器

OpenVZ 能够取得较优越的效率(与原生效率接近至很难量度)、扩展性及密度是由于只有单一个 Linux 内核在实体主机上执行,至于每个容器只占用当中的进程/服务所需的资源,而不必耗用整个操作系统的额外资源。一个基本的容器在主机上也许会是 8 至 14 个额外的进程。只要配合适切的资源管理设置,OpenVZ 亦能处理更高级的程序,例如拥有数百个进程/线程的巨型 Java 应用程序。

OpenVZ 的另一个优点就是它提供了广泛的动态资源管理参数,包括内存使用量、进程的数目、处理器使用量、磁盘空间使用量等等……它们全都可以在容器运行时被修改。OpenVZ 在容器内亦支持容器的磁盘配额,及(选择性地)支持用户和群组的磁盘配额。

OpenVZ 提供数项高级的功能,包括「检查点」及将容器由一台主机「迁移」到另一台。迁移共有两种方式:

  1. 即时迁移减少停机的时间(只须数秒),并且保持机器的运行时间及网络连接。
  2. 脱机迁移就是将机器停止,迁移它,然后重新打开它。

OpenVZ 的迁移功能「并不」须要一个共享的存储方案,而是利用 rsync 将容器的目录整全地由一台实体主机复制到另一台。

何时不要用操作系统级虚拟化

虽然在很多应用案例下你都可以考虑使用操作系统级虚拟化,在某些情形下操作系统级虚拟化并不合适,而机器/硬件级虚拟化会是较好的选择:

  1. 当你想执行非 Linux 的操作系统
  2. 当你想执行多个内核版本
  3. 当你需要一个多方面自定的内核

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.repoyum 使用。你只须下载 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 内核安装完成后便是时候重新开机,但在开机前仍有些额外的细节须要处理:

  1. 查看 /etc/grub.conf 来确定已缺省所需的内核,

  2. 编辑 /etc/sysctl.conf 来启用 OpenVZ 所需的某些内核功能和

  3. 确定 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 {完整域名} 

这里有一个完整的样例:

vzctl create 101 \
--ostemplate centos-5-i386-default \
--conf vps.basic \
--ipadd 199.199.199.199 \
--hostname mynew.container.com 

这样便会创建一个名叫 /vz/private/{容器标识码} 的目录并将操作系统范本解压到其中。它也会复制指定的文件到 /etc/vz/conf/{容器标识码}.conf 作为该容器的配置文件。请留意 --ostemplate--conf 的值与操作系统范本名称或文件名称并不吻合……它们较为简短。

vps.basic 这个配置文件正如其名,是十分基本……它配置给容器的资源亦比较保守。你若果想查阅与资源相关参数及它们的值,请看看位于 /etc/vz/conf 这个目录内的配置文件。你可以利用 vzsplit 这个指令(man vzsplit)来创建自定的样例配置文件(不限数量),或者复制现有的配置文件到新的文件来进行编辑。

当你创建了一台机器后,你需利用 vzctl set 这个指令来设置数个额外的参数。下面是一个例子:

vzctl set 101 \
--name mynew \
--nameserver "205.171.2.65 205.171.3.65" \
--diskspace 10G:10G \
--save 

这样做会更新你的容器的配置文件(在这个样例中是 /etc/vz/conf/101.conf)。当你执行 vzctl set 这个指令时不包含 --save 这个参数时,它便不会将改动存储到你的配置文件内……不过假若该容器正在运作中,它会为该工作阶段动态地更改这些参数。你基本上会经常为 vzctl set 这个指令加入 --save 作为最后一个参数。

引导你的新容器

你只需执行以下的指令来引导你的新容器:

vzctl start {容器标识码} 

或者在我们的样例里:

vzctl start 101 

你应该会看见一则信息关于容器正在引导中。若果你没有打错任何参数,它应该立即运行。

一如你所期望,stoprestart 这些关键字都会如你预料般运作。假若一个容器没有运行,你可以 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 的操作。为什么它们喜欢这样做?因为假若每个容器都各自利用 yumyum 的数据库及高速缓冲文件有时可以占用大量的磁盘空间(及带宽)。在主机上应用 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 的网站,因为它收藏了很多材料。

额外资源

OpenVZ 计划的网站
OpenNode Bare-metal CentOS-based distro with OpenVZ and KVM
访问 OpenVZ 计划经理
OS Virtualization vs. Hardware Virtualization video presentation from Linuxfest Northwest 2008
迁移容器的示范影片
Performance evaluation of Xen vs. OpenVZ by HP Labs
OpenVZ 网志
Parallels Inc.
Linux-VServer 的网站
访问 Linux-VServer 计划的领导人

这是本教学文档的初版,而本人(Scott Dowdle)计划加入额外信息作为更新,尤其是当我收到读者的反馈。我鼓励各位提供推荐及评语。请电邮至:dowdle at montanalinux.org 。

请勿将关于 OpenVZ 的问题电邮到 CentOS 邮件列表或带到 CentOS 的 IRC 频道上。请改用 OpenVZ 的 IRC 频道及其它用来支持 OpenVZ 的资源。 

Translation of revision 18

zh/HowTos/Virtualization/OpenVZ (last edited 2010-04-16 01:39:19 by TimothyLee)