虚拟化技术漫谈--OpenVZ入门   
[ 不指定 2007/04/11 16:20 | by mlsx ]
虚拟化技术漫谈--介绍一文中聊聊了目前已有的虚拟化技术,水平有限,所以谈得比较粗浅。
今天我想和大家分享一下操作系统虚拟化的开源工具-- OpenVZ
之所有选择openVZ,是因为其他两个操作系统虚拟化产品我没法接触到;同时使用OpenVZ后,感觉比较好,所以和大家来分享。

openVZ是 SWsoft's公司的虚拟化商业产品Virtuozzo的开源版本,Virtuozzo当然也是 基于操作系统级别的虚拟化工具,它允许你将服务划分为多个虚拟专有服务(Virtual Private Servers,as VPS)。

为什么要用OpenVZ,而不是更常见的 VMwareXen或者 Qemu? 取决于你准备用它来做什么。如果你想在你的Linux上跑一个非Linux系统(比如FreeBSD或者Windows),那你应该使用VMware,或 者Qemu,或者Virtuozzo,而不是openVZ,因为openVZ其实并不具有运行多个OS的能力(他只是单内核)。相反,如果你并不想运行多 个OS,而仅仅是多个客户机(guests),其目的是尽可能的利用硬件或者说服务分离(比如把文件服务器,打印服务器,WEB服务器分离出来),并且想 负载最小,那恭喜,openVZ无疑是非常的选择。

OpenVZ当然也支持大量的处理品平台。VMware服务器和Xen支持X86,AMD64等CPU;而OpenVZ则支持X86,AMD64,Itanium(IA64),PowerPC,UltraSPARC等CPU。

仔细阅读OpenVZ的相关文档还是一件比较痛苦的事情,所以先来一个快餐方式--如何快速用起来。只有用起来才知道我会不会接下里去阅读他的那一堆文档,OK,切入正题。

安装openVZ

OpenVZ可以运行任意Linux系统,我安装了Fedora Core 5 和Aisanux 2.0。当然你可以安装在Debian,Ubuntu,Fedora Core,Gentoo, RedHat, RedFlag,Mandrive等版本上,不过最好是OpenVZ项目已经有的 OS模板(OS template).OS模板就是一个VPS环境下的工具包集合,用OpenVZ的行业术语说即使虚拟环境(Virtual Environment,as VE)。后面无论提到VPS还是VE指的是同一个意思。

安装OpenVZ之前,首先得安装打过OpenVZ补丁的内核。我这里选择的是2.6.18的内核,因为的主机系统是2.6.18的内核,这样用起来比较方便。
现从站点上下载内核包,比如我下载的是ovzkernel-2.6.18-8.el5.028stab023.1.i686.rpm.安装他

#rpm -ivh ovzkernel-*.rpm

他默认会修改你的引导菜单(/boot/grub/menu.lst),将原来你的系统引导内核和引导镜像修改成vzkernel的,类似下面这样:

title Everest Linux(Virtualization) (2.6.18-8.el5.028stab023.1)
       root (hd0,0)
       kernel /vmlinuz-2.6.18-8.el5.028stab023.1 ro root=LABEL=/everest
                   vga=788 splash=silent resume2=swap:/dev/hda2
       initrd /initrd-2.6.18-8.el5.028stab023.1.img

接下来配置配置几个核心参数,打开/etc/sysctl.conf文件(或者类似此功能的文件,依赖于你的系统),修改或者增加下面的几个参数:
# On Hardware Node we generally need
# packet forwarding enabled and proxy arp disabled
net.ipv4.ip_forward = 1
net.ipv4.conf.default.proxy_arp = 0
# Enables source route verification
net.ipv4.conf.all.rp_filter = 1
# Enables the magic-sysrq key
kernel.sysrq = 1
# TCP Explict Congestion Notification
#net.ipv4.tcp_ecn = 0
# we do not want all our interfaces to send redirects
net.ipv4.conf.default.send_redirects = 1

net.ipv4.conf.all.send_redirects = 0
如果你运行了SELinux,先禁止。编辑/etc/sysconfig/selinux:
SELINUX=disabled。

OK,现在我们可以重启系统来引导信的核心了。登录系统后,确认现在的核心是不是OpenVZ提供的:

Linux mlsx.redflag-linux.com 2.6.18-8.el5.028stab023.1 #1
SMP Tue Mar 20 20:29:40 MSK 2007 i686 i686 i386 GNU/Linux
接下来是安装必要的工具了,OpenVZ需要一些用户级别的工具,包括:
vzctl -- 控制VPSs的,包括创建,销毁,开始,停止,设置参数等功能。
vzquota -- 管理VPSs的配额,大部分情况是被vzctl间接调用。
从官方站点下载对应的工具包,并安装。

rpm -ivh vzctl*.rpm vzquota*.rpm

到这里位置,我们可以启动我们的OpenVZ了,虽然目前还没有一个VPS。
# /etc/init.d/vz start
Starting OpenVZ: ..done
Bringing up interface venet0: ..done
Configuring interface venet0: ..done

接下来要做的就是设置OpenVZ了。

配置和运行OpenVZ

OpenVZ服务已经起来了,接下来就是配置一个VPS了。
首先需要OS模板系统,OS模板可以自动从站点下载(通过yum),或者下载预先创建的模板缓存,或者DIY一个出来。当然各自难度不同。
所以我们先说最简单的--下载预先创建好的OS模板系统。
首先从官方站点下载你喜欢的系统模板,我下载了两个,asianux-2.0-SP1-minimal-x86.tar.gz,fedora-core-5-i386-minimal.tar.gz.
把你下载的模板放到/vz/template/cache目录下,注意不要解压。保留原来的格式就好了。

我们来创建我们的第一个VE(VPS)。

创建很简单,执行下面的几个命令就好了

[root@mlsx ~]# vzctl create 104 --ostemplate fedora-core-5-i386-minimal
Creating VE private area (fedora-core-5-i386-minimal)
Performing postcreate actions
VE private area was created
[root@mlsx ~]# vzctl set 104 --ipadd 192.168.0.7 --nameserver 192.168.0.1
          --hostname firstve01 --save
Saved parameters for VE 104
[root@mlsx ~]# vzctl start 104
Starting VE ...
VE is mounted
Adding IP address(es): 192.168.0.7
Setting CPU units: 1000
Set hostname: firstve01
File resolv.conf was modified
VE start in progress...
[root@mlsx ~]#

稍 微解释一下,第一条命令是创建一个VEID号为104的VE,他的OS模板是fedora-core-5-i386-minimal。第二条命令设置 VEID为104(就是我们刚才创建的VE)的VE的主机名称,IP地址,DNS。第三条命令就非常清楚了,启动VEID为104的VE。

这里的OS模板命令是怎么来的呢?就是来自你下载到/vz/template/cache目录下的预先创建的OS模板缓存(不要后缀)。如果你给定的名字不正确,第一条指定给给出这样的错误:
[root@mlsx ~]# vzctl create 105 --ostemplate fedora-core-5-i386
Creating VE private area (fedora-core-5-i386)
Cached os template /vz/template/cache/fedora-core-5-i386.tar.gz not found
Creation of VE private area failed
非常明确。

怎么知道我们的VE运行了呢?我们可以执行下面的指令得知(后面还会提到其他方法)
[root@mlsx ~]# vzctl exec 104 ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1   2004   668 ?        Ss   07:54   0:00 init [3]
root      5235  0.0  0.1   1656   600 ?        Ss   07:54   0:00 syslogd -m 0
root      5246  0.0  0.2   4996  1092 ?        Ss   07:54   0:00 /usr/sbin/sshd
root      5327  0.0  0.1   2108   820 ?        Rs   07:57   0:00 ps aux

要进入这个VE也很简单,使用下面的命令就可以了
[root@mlsx ~]# vzctl enter 104
entered into VE 104
[root@firstve01 /]# hostname
firstve01
[root@firstve01 /]# exit
exited from VE 104
[root@mlsx ~]#


停止一个VE

[root@mlsx ~]# vzctl stop 104
Stopping VE ...
VE was stopped
VE is unmounted

有了这些,基本上就可以使用VE了。我们再看看如何管理我们的VE。

管理OpenVZ


在启动VE的时候,我们仅仅能看到一些有限的输出信息。启动后,我们可以运行 vzlist命令看查看哪些VE正在运行。比如:
[root@mlsx ~]# vzlist
     VEID      NPROC STATUS  IP_ADDR         HOSTNAME
      101          3 running 192.168.0.4     fc5-minimal
      102          6 running 192.168.0.5     asianux-2.0-SP1-minimal-x86
      103          3 running 192.168.0.6     fc5-minimal-other
使用 -a的参数可以看到所有的VE,不管是否正在运行.
[root@mlsx ~]# vzlist  -a
     VEID      NPROC STATUS  IP_ADDR         HOSTNAME
      101          3 running 192.168.0.4     fc5-minimal
      102          6 running 192.168.0.5     asianux-2.0-SP1-minimal-x86
      103          3 running 192.168.0.6     fc5-minimal-other
      104          - stopped 192.168.0.7     firstve01

你可能还想查看某个VE的资源消耗情况,我们可以使用 vzcalc -v <veid>命令来查看一个VE使用了多少内存:
[root@mlsx ~]# vzcalc -v 104
Resource     Current(%)  Promised(%)  Max(%)
Low Mem          0.10       2.15       2.15
Total RAM        0.36        n/a        n/a
Mem + Swap       0.18       2.81        n/a
Alloc. Mem       0.25       2.81      21.27
Num. Proc        0.02        n/a       0.40
--------------------------------------------
Memory           0.36       2.81      21.27

上面显示了目前被104号VE正在使用的内存是多少(0.36%),分配多少内存(2.81%),能够增长到多少(21.27%)。

缺省情况下,VE不会随系统启动而启动,如果你希望随系统启动,那可以使用下面的命令

#vzctl set 104 --onboot yes --save

vzctl是管理OpenVZ的最重要工具,经常用来设置系统参数,包括但不限于内存大小,CPU资源,iptable访问模块等。我们看几个例子。

不幸的是,OpenVZ并没一个非常直接的方式来做到给某个VE多少内存的方式,因此想达到"给104号VE128M内存"的目标并不简单,你需要调整一系列参数来到达这点,官方站点上也鲜有这样的文档来告诉你如何调整, 这里是找到的一篇

我们还是来举一个实际例子来看看如何做到这件事情,比如我希望给104号VE最小64M内存,可以增加到256M。为了做到这点,我们需要设置 vmguarpages(VE内存担保参数)参数和 privvmpages(授权的最大内存数)参数。

#vzctl set 104 --vmguarpages 16384 --save
#vzctl set 104 --privvmpages 65536 --save
#vzcalc 104
Resource     Current(%)  Promised(%)  Max(%)
Memory           0.36       6.80      25.92

当前我的机器物理内存是512M,swap是512M。所以内存资源是1G。从vzcalc的输出结果来看,我们上面的两个命令起到了效果。

问题是上面的16384和65536是怎么来的呢?
从参数的命名来看,我们知道是以内存"页"(pages)大小为单位计算的。因此你首先需要知道当前你的系统的页大小是多少,一般情况下,普通页大小是4k,巨页(hugetblpage)大小是4096K--4M。
于是64M需要的pages是
64M*1024/4=16384
256M需要的pages便是
256M*1024/4=65536

当然还有一个办法就是让脚本自己去计算。page的大小是4k,先乘以一个256就是1M了,于是大小就变得比较直观了,于是上面的命令我们这样来写:
#vzctl set 104 --vmguarpages $((256 * 64 )) --save
#vzctl set 104 --privvmpages $((256 * 256)) --save

每次设置一个参数,其配置都会存在 /etc/vz/<veid>.conf文件里。于是你可以手工来修改这个文件。修改完成后,可以使用 vzcfgvalidate命令来校验文件的正确性。

前 面我们提到了使用vzctl enter <veid>的方式进入到VE环境,这是在登录到主机系统后才能这样做。如果我需要远程登录呢?OK,使用ssh当然没有问题,但是,我们知 道root的密码吗?还有root默认允许登录吗?所以我们还是先设置root密码先:

#vzctl set 104 --userpasswd root:abc123

这样我们把104号VE的root密码设置为abc123了。
注意:如果这个帐号不存在,那么系统会自动创建帐号。

如果你既不想 vzctl enter进去,也不想ssh进去,还有别的办法来对VE发号施令吗?虽然有这个需求比较怪异,但是办法还是有的,就是前面我们提到的 exec指令:
[root@mlsx conf]# vzctl exec 104 df
Filesystem           1K-blocks      Used Available Use% Mounted on
simfs                  1048576    122919    925657  12% /

作为入门的最后的一个命令介绍--如何擦干净屁股。
我们create了一个VE,也玩了一般,累了,厌倦了,觉得太弱智了。于是我要把他从我的磁盘空间中赶走。那就使用下面的命令吧

#vzctl destroy 104

销毁之前,记得先停止VE,同时要提醒的是,vzctl命令任何时候都不会给你提示,因此时小心。下面的几条指令,结束了我们的演示VE--104--thanks.

Goodbye VE104

[root@mlsx conf]# vzctl destroy 104
VE is currently runing. Stop it before proceeding.
[root@mlsx conf]# vzctl stop 104
Stopping VE ...
VE was stopped
VE is unmounted
[root@mlsx conf]# vzctl destroy 104
Destroying VE private area: /vz/private/104
VE private area was destroyed
Tags: 虚拟化 , openvz
技术技巧 | 评论(1) | 引用(0) | 阅读(469)
fan3838
2007/07/13 12:37
vzctl在删除等一些危险操作的时候,应该有一个确认操作就好了。以防试试看,结果造成后悔。
 
Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐