工作,学习,生活,这里将会有一些记录. 备用域名:http://meisw.wdlinux.cn 注册 | 登陆
浏览模式: 标准 | 列表分类:虚拟化

把物理系统搬入OpenVZ中

OpenVZ真的非常好用,配合上GUI的图形管理很方便,效率也相当好。使用时间长了,一直有个问题困扰着我,就是如何把一些部署在物理服务器上的系统(简称物理系统)搬入OpenVZ中呢?
     OpenVZ默认只提供了几个简单的centos、fedora的模板,虽然官方网站上也提供了大量precreated(预创建)的各种系统模板供使用,但毕竟这些template(模板)都是别人创建的。以前,我就曾写过:[原]创建VPS OS模板的文章,告诉大家如何创建自己的模板。但这还不能满足我的要求,试想想,如果物理系统上已经部署了大量的应用,重新在VPS里面部署、迁移数据,这工作量将是非常庞大的。OpenVZ本身似乎没有提供这样的迁移工具。
     经过查询相关资料,我终于实现了从物理系统到VPS的迁移工作。以下步骤,适用于部署在实际物理服务器上,或VMware、VirtualBox、Xen等虚拟环境中,而物理系统为红旗DC Server 5.0/Asianux 3.0,Centos/RedHat 4.0/5.0,Fedora 7.0/8.0/9.0等操作系统的环境。其余发行版也可参考类似的步骤进行,但因各发行版对配置文件的定义有所差异,需要根据各自的情况进行改动。Debian系列的系统,可以参考底下附录部分的文章处理。

一、准备工作
系统环境:

引用
server1:红旗 DC Server 5.0 192.168.228.99(被迁移系统)
server2:红旗 DC Server 5.0 + OpenVZ 2.6.9-023stab048.4   192.168.228.90(虚拟机HW)


这里,我希望把server1上的物理系统迁移到server2的其中一个VPS中。迁移前,确认:

引用
1、server1上的物理系统可正常运行;
2、server2提供的VPS环境可以支持原server1的操作系统运行,例如核心为2.6.9以上;
3、server1与server2的操作系统应为同一平台,即都为x86或x86_64;
4、server2上已经搭建好OpenVZ环境,最好也把Vtonf等GUI管理配置好;
5、确保server2上有足够的空间供vz使用,建议把/vz作为一个单独分区划分,方便控制磁盘配额等资源。


二、迁移数据
1、创建VPS环境
可以用vzctl create借助模板创建一个VPS环境,然后清空/vz/private/$veid目录。也可以手动创建:

# mkdir /vz/root/101 /vz/private/101
# cat /etc/vz/conf/ve-vtonf.512MB.conf-sample > /etc/vz/conf/101.conf


2、准备拷贝环境
迁移数据的方法有好多,tar、dd、rsync等都可以。我这里使用rsync,所以需要做到:

引用
1、server1和server2两边都已经安装rsync软件包;
2、server1上需提供网络和sshd远程访问;
3、若server1部署了比较多的应用,建议暂时全部停掉;我的做法是,把server1切换到init 1模式,然后启动网络和sshd服务;


3、迁移数据
从server1拷贝数据到server2上:

# rsync -arvpz --numeric-ids --exclude lost+found --exclude /dev --exclude /mnt --exclude /tmp --exclude /proc --exclude /sys --exclude /usr/src --exclude /boot -e "ssh -l root@192.168.228.99" root@192.168.228.99:/ /vz/private/101/


※ 注意,原物理系统上有些目录对于VPS来说是没用的,甚至是有害的,拷贝时请把他们排除
4、设置VPS参数
前面若使用OpenVZ提供的sample配置文件,则还需要对该VPS设置,在server2上执行:

# vzctl set 101 --ostemplate centos-4-i386-default --save
# vzctl set 101 --onboot yes --save
# vzctl set 101 --hostname 101.linuxfly.cn --save
# vzctl set 101 --ipadd 192.168.228.101 --save
# vzctl set 101 --numothersock 120 --save
# vzctl set 101 --nameserver 202.96.134.133 --nameserver 202.96.128.86 --save
# vzctl set 101 --diskspace 10000000:11000000 --save
# vzcpucheck
# vzctl set 101 --cpuunits 40000 --save


这部分的工作,实际是根据今后该VPS运行的情况而设置的,可以参考原来物理系统的配置进行。注意,若修改了网络等参数的话,今后启动VPS后,记得也要修改应用上的设定咯。

三、调整VPS环境
物理系统上的启动与VPS中启动有不少地方是有差异,或冲突的。这也是最重要改动的地方:
1、修改etc/inittab文件

# sed -i -e '/getty/d' /vz/private/101/etc/inittab


2、修改etc/mtab文件

# rm -f /vz/private/101/etc/mtab
# ln -s /proc/mounts /vz/private/101/etc/mtab


3、修改etc/fstab文件
仅保留挂载/dev/pts的哪行:

# cp /vz/private/101/etc/fstab /vz/private/101/etc/fstab.old
# grep devpts /vz/private/101/etc/fstab.old > /vz/private/101/etc/fstab
# rm -f /vz/private/101/etc/fstab.old


4、修改etc/rc.d/rc.sysinit文件
把运行/sbin/start_udev的一行删除或注释掉:

# sed -i -e '/udev/d' /vz/private/101/etc/rc.d/rc.sysinit


5、创建device设备符号

# cd 101
# mkdir dev
# mknod -m 666 dev/ptmx c 5 2
# mkdir dev/pts
# /sbin/MAKEDEV -d /vz/private/101/dev ttyp ptyp
# chmod 660 /vz/private/101/dev/ttyp*
# chmod 660 /vz/private/101/dev/ptyp*
# mknod -m 666 dev/null c 1 3
# mknod -m 666 dev/random c 1 8
# mknod -m 444 dev/urandom c 1 9


6、删除网卡配置文件
因VPS使用虚拟网卡,不再需要启动物理网卡了。你可以修改配置文件中的ONBOOT为no,或直接删掉:

# rm -f /vz/private/101/etc/sysconfig/network-scripts/ifcfg-eth0
# cat /dev/null > /vz/private/101/etc/sysconfig/network


7、创建缺省目录

# mkdir /vz/private/101/proc
# mkdir /vz/private/101/tmp
# chmod 1777 /vz/private/101/tmp


四、启动VPS
启动:

引用
# vzctl start 101
Starting container ...
Container is mounted
Adding IP address(es): 192.168.228.101
Setting CPU limit: 0
Setting CPU units: 1000
Configure meminfo: 32768
Set hostname: 101.linuxfly.cn
File resolv.conf was modified
Setting quota ugidlimit: 0
Container start in progress...
# vzctl enter 101
entered into CT 101


至此,迁移工作全部完成。
您可以进入VPS中看看应用运行是否正常。由于VPS与物理系统环境仍存在一点差异,可能会导致应用启动失败,这需要逐一分析日志解决。最常见的是,提供给VPS的资源不足问题。因物理系统可完全独立获得全部系统资源,而在VPS中,受HW控制资源的分配,这可通过在VPS中:

# cat /proc/user_beancounters


查看failcnt列的信息来判断。然后根据实际情况增加资源即可。

五、参考资料
How To Convert Physical Systems And Xen VMs Into OpenVZ Containers (Debian Etch)
Creating a CentOS 5.0 Template

设置 XEN 的多网卡(3网卡4网卡..)桥接

我有种机器,有 4 个网卡,想在上面整 4 个虚拟机。所以让不同的虚拟机,使用不同的网卡。这样来做桥接设备。方便使用。记录一下方法,如下。

1.安装 xen 虚拟化

最开始当然得使用软件源来安装虚拟化。用 163 的吧,速度不错。 

perl -i -pe 's/mirror.centos.org/mirrors.163.com/g;s/^#baseurl/baseurl/g;s/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-Base.repo
yum -y groupinstall Virtualization

我们计划的设置如下
eth0 – xenbr0 – Dom0, DomN
eth1 – xenbr1 – DomX+1
eth2 – xenbr2 – DomX+2
eth3 – xenbr3 – DomX+3

4个网卡,分别桥接,然后让三个虚拟机分别接到三个机器上

 

2. 修改 xend 的配置文件,让它支持多个网卡,不使用默认的脚本

在 /etc/xen/xend-config.sxp 文件中的 (network-script network-bridge) 修改成 (network-script php-oa-network-multi-bridge).这样启用我们自己的脚本来生成桥接的设备

perl -i -pe 's/\(network-script network-bridge\)/#\(network-script network-bridge\)\n\(network-script php-oa-network-multi-bridge\)/g' /etc/xen/xend-config.sxp

 

3. 写自己自定的脚本 ,来生成自己所需要的网卡数量和绑定的位置,如上面的计划中 
 

perl -le 'for $num (0 .. 3){print "/etc/xen/scripts/network-bridge \"\$@\" vifnum=$num netdev=eth$num bridge=xenbr$num" }' > /etc/xen/scripts/php-oa-network-multi-bridge
chmod u+x /etc/xen/scripts/php-oa-network-multi-bridge

这样会生成一个 /etc/xen/scripts/php-oa-network-multi-bridge 内包含如下的内容。$@ 是用来接收 shell 命令中的 start,stop,status 的命令的。记的要加执行的权限,可一定不能忘记.

/etc/xen/scripts/network-bridge "$@" vifnum=0 netdev=eth0 bridge=xenbr0
/etc/xen/scripts/network-bridge "$@" vifnum=1 netdev=eth1 bridge=xenbr1
/etc/xen/scripts/network-bridge "$@" vifnum=2 netdev=eth2 bridge=xenbr2
/etc/xen/scripts/network-bridge "$@" vifnum=3 netdev=eth3 bridge=xenbr3

 

4.配置物理网卡,让开机就能启动

好了,在使用上面的脚本成前面,我们需要保证这几个网卡配置是能正常启动的。
所以我们要修改二个地方 ,ONBOOT=yes 和 BOOTPROTO=static 这二个,网卡才能正常的启动. 

perl -i -pe "s/ONBOOT=no/ONBOOT=yes/g;s/BOOTPROTO=dhcp/BOOTPROTO=static/g" /etc/sysconfig/network-scripts/ifcfg-eth{1,2,3}

 

5. 测试桥接 

下面的命令就不用解释了,还可以用 ifconfig 检查 

/etc/xen/scripts/ChinaCache-network-multi-bridge start
/etc/xen/scripts/ChinaCache-network-multi-bridge status
/etc/xen/scripts/ChinaCache-network-multi-bridge stop

 

6. 安装第一个虚拟机

下面的命令是用来安装第一个虚拟机的,其它的虚拟机直接 copy 出来就行。然后只要修改其它机器的配置文件就行了。

/usr/sbin/virt-install -p --paravirt --name=node1 -s 5 --ram=8192 --vcpus=2 --file=/xen/node1 --location=nfs:123.125.162.7:/mnt --extra-args="ip=123.125.162.45 netmask=255.255.255.192 gateway=123.125.162.1 dns=202.106.0.20" --network bridge=xenbr0 noipv6

 

以上参数中
–extra-args 这个是传送给启动时的内核用的。
–network 是设置网络的连接方法,还有桥接到那个设备
-s 生成的文件大小 G 为单位
–ram 内存设置
–file 系统文件存放的位置

 

7. 设置自动启动

当主系统启动时,虚拟机启动,自己有几个 虚拟机设置几个

virsh autostart node1

 

8. 其它虚拟机的安装

其它的虚拟机安装比较容易,直接 copy 上面的 /xen/node1 这个操作系统的文件叫别的名字,另外新建几个其它机器的配置文件

cp /etc/xen/node1 /etc/xen/node{1,2,3}

并修改其中几个参数

name = "node1"
disk = [ "tap:aio:/xen/node1,xvda,w" ]
vif = [ "mac=00:16:36:7b:c9:e3,bridge=xenbr0,script=vif-bridge" ]

如上几个参数 ,disk 指向其它的参数。vif 是指本机的 MAC 地址,xenbr0 – xenbr3 是可以桥接的设备
如果要新加硬盘,可以使用下面的语法,来加入物理硬盘

disk = [ "tap:aio:/xen/node1,xvda,w",
"phy:/dev/sdb,ioemu:sdb,w",
"phy:/dev/sdc,ioemu:sdc,w",
]

 

以下经验参考: http://www.cnblogs.com/yangyh/archive/2010/07/16/1778516.html

xenbr0 是会连接vif0.0,vifN.0 (N 表示 xm list 中的 id 号,表示第几个 id 的虚拟主机)
peth0 可以将peth0看作etho的别名
vif0.0表示dom0接口,vif1.0表示dom ID=1的接口(重启或新建几个domain,ID更改后你会发现vif1.0变成vif2.0..3.0了)

如果在xenbr0中删除vif0.0,则在domain中无法ping通本机,但能ping通通过eth0连接的机器,比如本机连接的路由器
如果在xenbr0中删除vif1.0,则在domain中就没有网卡了(相应的vif1.1表示ID为1的DOMAIN的第二块网卡)
如果在xenbr0中删除peth0,则能ping能本机,而无法ping通路由器或局域网其它机器

KVM Network Bridge Setup

http://wiki.solusvm.com/index.php/KVM_Network_Bridge_Setup

Xen bridge network trouble shooting tip

Xen桥接网络非常灵活,然而逻辑和管理方面也还算简单

桥接设备

  • bridge, 网桥;一般起名为:xenbr0, xenbr1, etc.
  • vif, 虚拟网络接口;一般起名为:vif0.0,vif0.1, etc.
  • veth/eth, 虚拟网络设备;一般起名为:eth0, etc.

桥接工具

  • /etc/xen/script/network-bridge, 网桥操作脚本
  • /etc/xen/script/vif-bridge, 虚拟接口操作脚本
  • brctl 工具,事实上以上两个脚本均调用了它

排查步骤

  • brctl show; 再看桥接是否OK。 
  • ethtool peth; 先看物理网卡通不通。
  • ifconfig vif; 看各虚拟接口是否正常。
  • ifconfig eth/veth; 看看虚拟网络设备是否正常。

http://wiki.xensource.com/xenwiki/XenNetworking

Xen bridge network and Xen Networking(转)

本文介绍了Xen桥接网络及出故障时可采用的工具和方法:

Xen桥接网络非常灵活,然而逻辑和管理方面也还算简单

 

桥接设备

  • bridge, 网桥;一般起名为:xenbr0, xenbr1, etc.
  • vif, 虚拟网络接口;一般起名为:vif0.0,vif0.1, etc.
  • veth/eth, 虚拟网络设备;一般起名为:eth0, etc.

桥接工具

  • /etc/xen/script/network-bridge, 网桥操作脚本
  • /etc/xen/script/vif-bridge, 虚拟接口操作脚本
  • brctl 工具,事实上以上两个脚本均调用了它

排查步骤

  • brctl show; 再看桥接是否OK。 
  • ethtool peth; 先看物理网卡通不通。
  • ifconfig vif; 看各虚拟接口是否正常。
  • ifconfig eth/veth; 看看虚拟网络设备是否正常。

链接

  • Xen Networking

Xen网络联接方式

        Xen 提供了 3 种虚拟网络模型来供客户机访问物理设备——桥接、路由和 NAT。在桥接模式中,虚拟网络接口(vif)在外部局域网是可见的,在路由模型中,vif 在外部局域网是不可见的,但是 IP 是可见的。在 NAT 模型中,vif 在外部局域网不可见,它也没有一个外部可见的 IP 地址。

        在桥接模式下, brctl 工具被用来创建软件方式的桥接接口,一个物理网络接口然后附加到桥上。Xen 客户机域的后端 vif 能被附加到这个桥上。当桥接口接收到来自物理接口的包时,物理网络接口将依据各域的虚拟网卡的 MAC 地址转发它们到不同的域上。

        在路由模型下将使用 iptables 机制来进行路由。由物理接口所收到的所有的包将被驱动域的网络 IP 层所处理。驱动域(dom0)查找路由表条目并将包转发到不同的客户机 IP 地址。在路由模式下,驱动域连接 2 个不同的网段:内部由客户机使用的网段和连接外部网络的网段。

       在驱动域作为一个 NAT 网关时,驱动域仍然作为一个路由器,但是更进一步映射一个它自己的 IP 地址和端口到一个客户机的 IP 地址和端口。客户机的 IP 地址隐藏在驱动域后面对外部网络不可见。

        Linux 防火墙提供了 iptables ,而 bridge-utils 则提供了 etables 来进行基本的 MAC 地址过滤。也可以指定一个物理网卡给一个域使用。
                

     Xen网络结构相当灵活,适当配置可以“轻松”实现dom0/domU与物理网络三者之间的复杂拓扑。

桥接模式


 

                                                                          图一、Xen 桥接模式示意图

下图是个桥接的例子。
    

         veth0、vif0.0 是 dom0 的网络接口veth0 被重命名为 eth0xenbr0 接口是软桥接接口vif1.0 是运行的客户机的后端网络接口

        peth0、xenbr0、vif0.0、vif1.0 都共享同样的 MAC 地址 FE:FF:FF:FF:FF:FF,它是以太网的广播地址。这意味着实际的网络接口、dom0 的回环接口、客户机的后端接口都向 xenbr0 广播。当物理网卡接收到包时,它直接发送到桥接接口 xenbr0,这个桥接接口通过包的 MAC 地址决定将包转发到哪个域的后端接口。因此 peth0 不需要 IP,只需要 MAC 地址。物理接口的原先 IP 已经被告知给 eth0——驱动域的虚拟前端接口。    

        xenbr0 通过 MAC 地址是 00:11:25:F6:15:22 或者是 00:16:3e:45:e7:12 来决定包转发到 eth0 或者 vif1.0。客户域相应的前端接口被命名为 eth0。从 dom0 的角度看,客户机中 eth0 实际是 vif1.0。
brctl 命令的显示:

  1. [user@Dom0]# brctl show
  2. bridge name     bridge id               STP enabled    interfaces
  3. xenbr0          8000.feffffffffff       no             vif1.0
  4.                                                        peth0
  5.                                                        vif0.0

在centos 5 上利用 xen 安装 Windows Server 2003

启动命令:virt-manager
XEN确实是不一个不错的虚拟软件,并且RedHat也做了很好的工作,不过还是走了不少弯路。正常安装的过程应该还是比较容易的。还有人建议用xen专门为RHEL 5编译的内核,但是个人觉得没有必要。
1. 在安装时选择虚拟化组件。这样将会看上去安装xen和相应的系统内核。
2. 在计算机的BIOS中打开虚拟功能支持。在Xen上安装Windows需要完全虚拟化,这样需要硬件支持。
在BIOS中打开虚拟功能之后,执行/usr/bin/xm info时应该包含如下信息:
xen_caps : xen-3.0-x86_64 hvm-3.0-x86_32 hvm-3.0-x86_32p hvm-3.0-x86_64
3. 虚拟光驱的设置。
如果使用virt-manager启动管理程序,然后点击New新建虚拟机,则它指定的虚拟光驱ISO文件并不会保存在配置文件中。
手工添加该文件的方法为:
disk = [ ‘phy:/dev/VolGroup01/Win2k3_01,hda,w’, ‘file:/opt/soft/cd1.iso,hdc:cdrom,r’ ]
4. 设置从光盘启动的方法:
boot=”d”
5. 在安装时,在“Setup is starting”时死机。这个问题折腾了我很长时间,甚至把系统都重新安装了好几次,换成32位版,后来又折腾回x64版。
关键步骤是如下设置:
acpi=0

----------------

在安装重起后找不到CD,要在virt-manager里设定ISO文件即可

Xen 支持的虚拟机类型

我们都知道 Xen 支持两种虚拟机类型:半虚拟化(paravirtualization)和全虚拟化(full virtualization),我们也知道 Xen 支持32位的和64位的虚拟机。决定 Xen 服务器是否能支持半虚拟化、全虚拟化、32位和64位的关键因素是处理器,即 CPU 的类型。

当 Xen 虚拟机运行在不支持虚拟化的硬件上的时候(CPU 不支持虚拟化),所有的内核和虚拟机(domains)都必须使用相同类型内存模型和指令大小。比如,如果使用的是 64位的 hypervisor 和 domain0,那么上面所有的 domainU 都必须是64位的或32位 PAE 的;同样,如果使用的是32位(带 PAE 内存扩展)的 xen 内核的话,那么所有在上面运行的 domainU 也都必须是32位(带 PAE 内存扩展)的。

当 Xen 虚拟机运行在支持虚拟化的硬件上、有了硬件的支持的时候(CPU 支持虚拟化),上面的限制就变得宽松多了,可支持的虚拟机类型范围要大多了。1个32位带 PAE 支持的 Xen 内核可以在上面运行1个不带 PAE 支持、全虚拟出来的 domainU;1个64位的 Xen 系统可以运行任何32位的 Linux domainU(包括半虚拟的 domainU 和全虚拟的 domainU);但是1个32位的 Xen 系统可以运行32位半虚拟的 domainU 而不能运行64位半虚拟的 domainU 了。所以 Xen 是向前兼容的,64位的 Xen 内核可以兼容运行32位PAE、纯32位的 domainU,但是不能反过来,32位的 Xen 内核不能运行64位的 domainU 等。

如果觉得上面的文字说明看得有点头昏,VPSee 整理了一个表格:

Hypervisor domain0 domainU (PV) domainU (HVM)
32bit 32bit 32bit 32bit
32bit PAE 32bit PAE 32bit PAE 32bit or 32bit PAE
64bit 64bit 64bit or 32bit PAE 32bit, 32bit PAE or 64bit

 

Intel VT(Virtualization Technology)和 AMD SVM(Secure Virtual Machine)是两大处理器生产商为了迎合虚拟化发展的趋势而在自己的处理器里直接增加对虚拟化技术的硬件支持。辨别自己的 CPU 是否支持虚拟技术很简单,只需要检查 cpuinfo 里面是否带有虚拟化标志,如果使用的是 Intel CPU,那么 flags 里应该有 vms 字样;如果使用 AMD CPU,那么 flags 里应该可以找到 svm,下面是 VPSee 在一台 SUN Fire X2100 服务器上打印的结果:

# cat /proc/cpuinfo | grep flags
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov
pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt rdtscp lm
3dnowext 3dnow pni cx16 lahf_lm cmp_legacy svm extapic cr8_legacy
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov
pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt rdtscp lm
3dnowext 3dnow pni cx16 lahf_lm cmp_legacy svm extapic cr8_legacy

注意:如果已经启动到 Xen 系统中, cat /proc/cpuinfo | grep flags 将在默认情况下不会显示 vmx 或 svm 标志位,只有在安装 Xen 前的纯 Linux 内核下才可以看到。还有就是,确定 BIOS 中打开了 Intel VT 或 AMD SVM 虚拟化的支持。

通常安装完 Xen 后,Xen 就能自动识别出系统支持哪几种虚拟机类型。只需要简单打印出 Xen 虚拟机的兼容名单就可以看出来:

# cat /sys/hypervisor/properties/capabilities
xen-3.0-x86_64 xen-3.0-x86_32p hvm-3.0-x86_32 hvm-3.0-x86_32p hvm-3.0-x86_64

上面打印出来的内容表示这个系统可以运行 64位 domains(xen-3.0-x86_64)、32位带 PAE 的 domains(xen-3.0-x86_32p)、32位全虚拟化 domains(hvm-3.0-x86_32)、32位带 PAE 全虚拟化 domains(hvm-3.0-x86_32p)、64位全虚拟化 domains(hvm-3.0-x86_64).

在普通 Linux 下面的 /proc 里包含了一些运行时的 Linux 内核参数可以查看和修改,和 /proc 的作用类似,在 Xen 里面 /sys 里包含了 xen hypervisor 的一些参数。如果在你的 Xen 系统上没有发现 /sys/hypervisor,多半时因为在配置 Xen 内核的时候没有选择上 XEN_SYSFS,重新配置、编译和安装 带 Xen 的 Linux 内核就可以了。

在自己的 IT 环境里部署 Xen 虚拟化前需要了解一下自身 IT 环境的一些特点,比如:用户的使用类型(将在虚拟机上干什么?),需要运行的应用(是否某应用程序必须运行在老的32位的系统上?)等,这样方便选购服务器、迁移平台和应用以及部署虚拟化。

openVz 安装及应用,入门

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 {完整域名} 这里有一个完整的样例:


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

** 上面这个会提示找不到 ve-vps.basic.conf-sample

** 下面这个例子比较好,新版本openvz已带的一个模板是 ve-basic.conf-sample , 对应 conf basic

vzctl create 101 \
--ostemplate centos-5-i386-default \
--conf  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

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

一如你所期望,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 的网站,因为它收藏了很多材料。

Records:321234