今天我想和大家分享一下操作系统虚拟化的开源工具--OpenVZ。
之所有选择openVZ,是因为其他两个操作系统虚拟化产品我没法接触到;同时使用OpenVZ后,感觉比较好,所以和大家来分享。
openVZ是SWsoft's公司的虚拟化商业产品Virtuozzo的开源版本,Virtuozzo当然也是基于操作系统级别的虚拟化工具,它允许你将服务划分为多个虚拟专有服务(Virtual Private Servers,as VPS)。
为什么要用OpenVZ,而不是更常见的VMware,Xen或者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 disablednet.ipv4.ip_forward = 1net.ipv4.conf.default.proxy_arp = 0# Enables source route verificationnet.ipv4.conf.all.rp_filter = 1# Enables the magic-sysrq keykernel.sysrq = 1# TCP Explict Congestion Notification#net.ipv4.tcp_ecn = 0# we do not want all our interfaces to send redirectsnet.ipv4.conf.default.send_redirects = 1net.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