在 CentOS 上安装和配置 OpenVZ

经常有人问到 OpenVZ 和 Xen 哪个好,事实上 OpenVZ 和 Xen 不是同一层面的技术,OpenVZ 是操作系统层面(Operating system-level virtualization)的虚拟产品,和 FreeBSD Jail, Solaris Zone, Linux-VServer 等类似;而 Xen 和 VMware, KVM, Hyper-V 等产品站在同一阵营。OpenVZ VPS 实际上提供的是一个虚拟环境(Virtual Environment/VE),也叫容器(Container);而 Xen VPS 提供的是基于 Hypervisor 的虚拟机(Virtual Machine),这是本质上的不同,现在大家已经习惯用 VPS 这个名字把这两种不同的产品和技术混为一谈了。比起 Xen 专注于企业虚拟化和云计算领域,OpenVZ 最大的应用可能就在低端 VPS 市场,有无数的 VPS 服务商都使用 OpenVZ 提供10美元以下的 VPS 产品。了解一下 OpenVZ 的安装和配置也会对使用 OpenVZ VPS 有所帮助,以下的安装和配置操作在 VPSee 的一台空闲 PC 和 CentOS 5.5 上完成。对 Xen 和 KVM 感兴趣的童鞋请看:在 CentOS 上安装和配置 Xen在 CentOS 上安装和配置 KVM.

安装 OpenVZ

首先加入 openvz 源、升级系统、安装 openvz 内核和 vzctl, vzquota 等工具:

# cd /etc/yum.repos.d
# wget http://download.openvz.org/openvz.repo
# rpm --import http://download.openvz.org/RPM-GPG-Key-OpenVZ
# yum update

# yum install ovzkernel
# yum install vzctl vzquota

调整内核参数

为了能让 VE/VPS 访问外部网络,我们必须启动 ip forwarding;如果内核出错或者运行很慢,我们希望能用特殊按键 dump 一些信息到控制台并结合 log 排错,所以建议打开 kernel.sysrq:

# vi /etc/sysctl.conf
...
net.ipv4.ip_forward = 1
kernel.sysrq = 1
...

为了减少麻烦最好关闭 selinux,selinux 带来的麻烦往往比得到的好处多:

# vi /etc/sysconfig/selinux
...
SELINUX=disabled
...

检查 vz 服务是否自动启动,并重启机器进入 openvz 内核:

# chkconfig --list vz 
vz             	0:off	1:off	2:on	3:on	4:on	5:on	6:off

# reboot

创建和安装 guest

Perl 语言之父 Larry Wall 说过真正优秀的程序员有三大优良品质:偷懒,没有耐性和骄傲自大。所以能利用别人的劳动成果就不要自己重造轮子。我们可以到 http://download.openvz.org/template/precreated/ 下载已经安装好的模版,有 centos, debian, ubuntu, fedora, suse 等几个模版可以选择:

# cd /vz/template/cache
# wget http://download.openvz.org/template/precreated/ubuntu-10.04-x86.tar.gz

有了 ubuntu 10.04 的模版以后就可以用这个模版来创建 guest 系统(VE/VPS)了,以刚下载的 ubuntu-10.04-x86 为模版创建一个 ID 为 1 的 Virtual Environment (VE),并指定 IP 地址、DNS 服务器地址、主机名、磁盘空间等,创建成功后启动 ID 为 1 的 VE,最后修改 root 密码:

# vzctl create 1 --ostemplate ubuntu-10.04-x86

# vzctl set 1 --onboot yes --save
# vzctl set 1 --ipadd 172.16.39.110 --save
# vzctl set 1 --nameserver 8.8.8.8 --save
# vzctl set 1 --hostname vps01.vpsee.com --save
# vzctl set 1 --diskspace 10G:10G --save

# vzctl start 1
# vzctl exec 1 passwd

启动、重启、关闭和断电关闭 ID 为 1 的 VE/VPS:

# vzctl start 1
# vzctl restart 1
# vzctl stop 1
# vzctl destroy 1

查看正在运行中的 VE/VPS:

# vzlist
      CTID      NPROC STATUS    IP_ADDR         HOSTNAME
         1          8 running   172.16.39.110   vps01.vpsee.com

计算 ID 为 1 的 VE/VPS 用到的资源:

# vzcalc -v 1
Resource     Current(%)  Promised(%)  Max(%)
Low Mem          0.06       1.44       1.44
Total RAM        0.19        n/a        n/a 
Mem + Swap       0.08       1.30        n/a
Alloc. Mem       0.11       1.62       3.09
Num. Proc        0.01        n/a       0.32
--------------------------------------------
Memory           0.19       1.62       3.09

进入 guest

VE 成功启动后就可以进入系统了,相当于 xen 的 xm console,不过从 VE 退出来不需特殊按键直接 exit 就可以:

# vzctl enter 1
entered into CT 1
[email protected]:/# exit
logout
exited from CT 1

评论 (15 Comments)

  1. 学习了,这样可以很方便地建立一个虚拟机来测试一些操作,特别是在一些老的机器上(CPU不支持虚拟化的),openvz 的性能方便还是很有优势。

  2. 原創嗎? 好文章哦, 多謝了

  3. 根据你的指南配置成功了,可是ve无法解析域名,nameserver什么的,都ok,能够ping通,就是无法解析域名,请指点一下。ifconfig下有3个网卡,应该是哪个起作用呢?
    inet addr:127.0.0.1 Mask:255.0.0.0
    inet addr:127.0.0.1 P-t-P:127.0.0.1 Bcast:0.0.0.0 Mask:255.255.255.255
    inet addr:192.168.28.201 P-t-P:192.168.28.201 Bcast:192.168.28.201 Mask:255.255.255.255

  4. 虚拟机可以 ping 外部 IP 吗?比如 ping 8.8.8.8?可以 ping 的话,可能就是 DNS 解析文件问题,你在虚拟机里(/etc/resolv.conf)设置了 nameserver 吗?

  5. 问下只有一个IP可以安装openvz么?然后用所有的虚拟机都用一个IP。国内IP贵啊

  6. @苏州大学
    所有虚拟机可以通过 NAT 共用一个外部 IP,但是不同虚拟机的需要使用不同的内部 IP,比如,
    eth0: 206.220.2.6(外部 IP)
    eth1: 192.168.0.100(内部 IP)
    vz01: 192.168.0.101(虚拟机 IP)
    vz02: 192.168.0.102(虚拟机 IP)
    这样做的问题是虚拟机可以访问外部,但是外部不能直接访问内部虚拟机。

  7. 很不错,第一次使用openvz,不过博主能介绍下具体怎么配置虚拟机吗,参数列表都是什么?哪里可以找到

  8. 如果主机是64位即,GUEST可以是32位机吗?我需要这样的方式。

  9. @ZSWLB
    可以。

  10. 你好博主按教程做了但是请教下,为何在VPS里面开个火狐,free -m 内存会虚高的显示300M,但是实际没有占用那么大,比如我256上面开个火狐也是站用到256,如果在512上面开一个火狐也是占用到接近512,这是为什么呢?我自己买的VPS,free -m都是还用多少占用多少的,不明白原因。

  11. @itos
    火狐的任务是尽可能用完所有可以用的内存。你把火狐开一个月,8g的内存也可以用完。关于为啥 linux 内存会用完可以参考本站 linux 内存管理、性能监测方面的文章,还和火狐这样的应用程序的工作方式和内存管理有关。简单说是 linux 会把不用的内存拿来做缓存,避免频繁从硬盘读数据。

  12. yum install ovzkernel 这个应该是 yum install vzkernel 才对的.

  13. @cfanbo
    嗯嗯,貌似现在改成 vzkernel 了。这篇文章写于 2011 年,那个年代是 ovzkernel.

  14. hello,你好,我咨询一下 我在openvz中测试mmm-mysql ,但是我发现虚拟ip没有自动配置上,我现在想手动配置,但是我使用命令 ip addr add 192.168.1.212 dev venet0;发现其他虚拟机无法ping通这个地址???

  15. 请教博主有没有配置做过双网卡的环境

发表评论