Netspace Ltd:$9 256MB OpenVZ VPS

netspaceltd

Netspace LtdWHT 上放出了4美元的 128MB VPS 和7美元的 256MB VPS,只有这周优惠,还是很便宜的,平常价格是9美元。网站上没有任何 “关于” 信息,让人有点犹豫,也没有透露任何服务器和网络信息,根据服务器地址来看服务器好像是从 SoftLayter 租用的。whois 域名显示 netspaceltd.com 是在2008年1月注册的。VPS 配置如下:

服务器在 Texas, Dallas
不带控制面板
10GB 硬盘
256MB Guaranteed RAM,384MB Burst RAM
100 GB 带宽
9美元

InternetVPS:$4.99 256MB OpenVZ VPS

internetvps

InternetVPS 自称是一家 leading VPS service provider. 打开公司网页感觉就像一个小学生刚刚学习用 “土土” 的 Frontpage 做网页,作为 leading provider 至少也应该花钱请个 UI 设计师设计一下吧,再不行花50美元去买个漂亮的 CMS 模板套上去总可以吧。whois 显示 internetvps.com 域名是在2008年2月注册的,和 internetvps.org 是一家公司,只是这个网站做得更烂。网上资料显示 internetvps 是 burstnet 的 reseller. VPS 配置如下:

服务器在 Scranton, PA
没有控制面板
5GB 硬盘
256MB Guaranteed RAM
4.99美元

在 CentOS 上安装和配置 Sun Ray Server Software

sunray2

几年前 Sun Microsystems 给我们捐了一个实验室,大概100多台 SunRay 瘦客户端/显示器 + 几台 SUN 服务器、鼠标、键盘,全套 Sun 的设备,上面一直跑的是 Solaris. SunRay 瘦客户端无 CPU 无 RAM,开机自动找 SunRay Server 然后进入服务器的登录界面,标准的 ”网络就是计算机“。VPSee 最近计划把 Solaris 改成 CentOS,正在做测试。

首先确认安装了 GNOME:

# yum groupinstall "X Window System" "GNOME Desktop Environment"

必要软件

解压 srss_4.2_linux.zip 后,必要的 jre,tomcat 和 pdksh 软件包都在 srss_4.2/Supplemental 下,所以不必单独去下载:

srss_4.2/Supplemental/Java_Runtime_Environment/Linux/jre-6u13-linux-i586.bin
srss_4.2/Supplemental/Apache_Tomcat/apache-tomcat-5.5.20.tar.gz
srss_4.2/Supplemental/RHEL/i386/pdksh-5.2.14-30.3.i386.rpm
srss_4.2/GDM_2.16.7/Linux/Packages/gdm-2.16.7-2.1_01.sunray.i386.rpm

安装一些必要包

# yum install glib dhcp openldap-clients openldap tftp-server libXp \
openmotif22 openssl compat-libstdc++-33 libusb-devel compat-openldap
# yum groupinstall "Development Tools"
# yum install kernel-devel

除了上面必要包以外,SUN Ray 需要用到 pdksh(替代 ksh)以及特别版本的 gdm:

# rpm -ivh --force --nodeps pdksh-5.2.14-30.3.i386.rpm
# rpm -ivh --force --nodeps gdm-2.16.7-2.1_01.sunray.i386.rpm

安装 Java

Sun Ray Software 需要 SUN 版本的 JDK,所以如果是其他版本的 JDK,比如:OpenJDK,IBM JDK 等什么的需要先删除后再安装 SUN JDK,其实 Java 运行环境安装 JRE 就可以了,不一定需要 JDK:

# chmod +x jre-6u13-linux-i586.bin
# ./jre-6u13-linux-i586.bin
# mkdir /usr/java
# mv jre1.6.0_13 /usr/java/
# ln -sf /usr/java/jre1.6.0_13/bin/java /usr/bin/java

安装 Tomcat

不要用 yum install tomcat5 安装 Tomcat,会安装一堆不必要的包。用 srss_4.2_linux.zip 里面那个,省得再去单独下载:

# tar xvzf apache-tomcat-5.5.20.tar.gz
# mv apache-tomcat-5.5.20 /opt; cd /opt
# ln -sf apache-tomcat-5.5.20 apache-tomcat

在 /etc/init.d/ 增加新建一个 Tomcat 启动配置文件:

# vi /etc/init.d/tomcat

#!/bin/bash
#
# Tomcat Server
#
# chkconfig: 345 96 30
# description: Java servlet container

JAVA_HOME=/usr/java/jre1.6.0_13/
PATH=${JAVA_HOME}/bin:${PATH}
TOMCAT_START=/opt/apache-tomcat/bin/startup.sh
TOMCAT_STOP=/opt/apache-tomcat/bin/shutdown.sh
export JAVA_HOME PATH

start() {
    if [ -x ${TOMCAT_START} ]; then
        echo "Starting tomcat server..."
        ${TOMCAT_START} &
    else
        echo "Cannot start tomcat server"
    fi
}

stop() {
    if [ -x ${TOMCAT_STOP} ]; then
        echo "Stopping tomcat server..."
        ${TOMCAT_STOP} &
    else
        echo "Cannot stop tomcat server"
    fi
}

restart() {
    stop
    sleep 10
    start
}

status() {
    echo "No status available for tomcat server"
}

case "$1" in
    'start')
        start
        ;;
    'stop')
        stop
        ;;
    'restart')
        restart
        ;;
    'status')
        status
        ;;
*)
echo "Please supply an argument [start|stop|restart]"
esac

启动 Tomcat:

# chmod +x /etc/init.d/tomcat
# /sbin/chkconfig tomcat on
# /sbin/service tomcat start

安装 Sun Ray Software

# unzip srss_4.2_linux.zip
# cd srss_4.2
# ./utinstall
# /sbin/shutdown -r now

也可以不用 Sun Ray 硬件设备,下载一个 Sun Desktop Access Client 1.0 可以在 Windows 上连接 Sun Ray 服务器。

配置 Sun Ray Server

运行 utconfig 报错:

# cd /opt/SUNWut/sbin
# ./utconfig
...
Enter Sun Ray admin password: 
Re-enter Sun Ray admin password: 
/opt/SUNWut/sbin/utpw: error while loading shared libraries: libldap.so.199: cannot open shared object file: No such file or directory

解决办法:

# ln -sf /usr/lib/libexpat.so /usr/lib/libexpat.so.1
# ln -sf /usr/lib/libldap-2.3.so.0.2.31 /usr/lib/libldap.so.199
# ln -sf /usr/lib/libgdbm.so.2.0.0 /usr/lib/libgdbm.so.3
# ln -sf /usr/lib/liblber-2.3.so.0.2.31 /usr/lib/liblber.so.199

配置 GDM

修改 GDM 配置文件后,启动 GDM:

# vi /etc/X11/gdm/custom.conf

[daemon]
# These are for the SunRay Services
DefaultPath=/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/opt/SUNWut/bin
PostLoginScriptDir=/etc/X11/gdm/SunRayPostLogin/
PreSessionScriptDir=/etc/X11/gdm/SunRayPreSession/
PostSessionScriptDir=/etc/X11/gdm/SunRayPostSession/
DisplayInitDir=/etc/X11/gdm/SunRayInit
#Allow the SRSS to Dynamicly Allcoate XServers
VTAllocation=false
DynamicXServers=true

# Do not allow users to Reboot/Halt/Suspend System
RebootCommand=
HaltCommand=
SuspendCommand=
HibernateCommand=
Greeter=/usr/libexec/gdmgreeter

[security]

[xdmcp]

[gui]

[greeter]

[chooser]

[debug]

[servers]

# /usr/sbin/gdm-binary

配置 DHCP 服务器

安装完 Sun Ray Server 软件后,会增加1个文件 SunRay-interface-eth1 文件,重启 dhcpd 服务的时候会报错,说 SunRay-interface-eth1 这个配置文件格式不对,用以下格式替换:

# vi /etc/opt/SUNWut/net/dhcp/SunRay-interface-eth1

#Sun Ray
option space SunRay;
option SunRay.AuthSrvr  code 21 = ip-address;
option SunRay.AuthSrvr  192.168.128.1;
option SunRay.FWSrvr    code 31 = ip-address;
option SunRay.FWSrvr    192.168.128.1;
option SunRay.NewTVer   code 23 = text;
option SunRay.NewTVer   "4.1_50,REV=2008.09.25.12.37";
option SunRay.Intf      code 33 = text;
option SunRay.Intf      "eth1";
option SunRay.LogHost   code 24 = ip-address;
option SunRay.LogHost   192.168.128.1;
option SunRay.LogKern   code 25 = integer 8;
option SunRay.LogKern   6;
option SunRay.LogNet    code 26 = integer 8;
option SunRay.LogNet    6;
option SunRay.LogUSB    code 27 = integer 8;
option SunRay.LogUSB    6;
option SunRay.LogVid    code 28 = integer 8;
option SunRay.LogVid    6;
option SunRay.LogAppl   code 29 = integer 8;
option SunRay.LogAppl   6;

group
{
        vendor-option-space SunRay;
        subnet 192.168.128.0 netmask 255.255.255.0 {
                default-lease-time 720000;
                max-lease-time 1440000;
                authoritative;
                option routers 192.168.128.1;
                range 192.168.128.100 192.168.128.199;
        }
}

# /etc/init.d/dhcpd restart

关闭防火墙和 SELinux

# /usr/bin/system-config-securitylevel

运行

重启系统后,Sun Ray 就应该自动运行了,需要一些配置才能让 Sun Ray 瘦客户端连上 CentOS 上的 Sun Ray 服务器。Sun Ray 支持两种常见的网络配置方式:dedicated interconnect 和 directly-connected shared subnet,如图所示:

sun ray network topolog

dedicated interconnect 是建立一个私有内部网络,Sun Ray Server 的一个网络接口连着外部局域网,另一个网络接口连着由众多 Sun Ray 瘦客户端组成的私有网络。这时需要在服务器上配置 DHCP Server 来给每个瘦客户端分配 IP 地址。(假设 eth0 连着外部网,eth1 连着内部网)

# /opt/SUNWut/sbin/utadm -a eth1
# /opt/SUNWut/sbin/utrestart

directly-connected shared subnet 是直接连在外部网上,Sun Ray Server 和 Sun Ray 瘦客户端都在同一个子网络上,由第三方 DHCP 服务器提供 IP 地址。

# /opt/SUNWut/sbin/utadm -L on
# /opt/SUNWut/sbin/utrestart

这种方式通常会使用第三方的 DHCP 服务,Sun Ray Server 和 Client 都从第三方得到 IP 地址,这里就会有一个问题,第三方 DHCP Server 没有专门对 Sun Ray 设置必要的参数,导致 Sun Ray 瘦客户端得不到足够多的信息连接上 Sun Ray Server,这时需要把 Sun Ray 瘦客户端用 dedicated interconnect 的方式连上 Sun Ray Server,从服务器那里下载并更新 firmware 后才能正确在 directly-connected shared subnet 的网络上运行,一旦更新 firmware 后就可以脱离 dedicated interconnect 在 directly-connected shared subnet 上运行。

如果不使用第三方 DHCP 服务,由 Sun Ray Server 自己提供 DHCP 服务的话,可以用以下命令把 172.16.38.0 网段加入到 Sun Ray Server 管理:

# /opt/SUNWut/sbin/utadm -A 172.16.38.0
# /opt/SUNWut/sbin/utrestart

Trouble Shooting

经过几天的战斗终于让 Sun Ray Server 运行在了 Linux 上,期间遇到很多问题,很多都和没有正确 link 对应的库有关,做几个连接就好了。主要问题还是在 gdm,如果 Sun Ray 瘦客户端的屏幕上出现 26D/27D 的错误多半和 gdm 有关,要确定装了 GNOME 桌面系统和正确启动了 gdm,记下几个命令以便以后排错:

# /opt/SUNWut/sbin/utrestart
# /opt/SUNWut/sbin/utdesktop -l
# /opt/SUNWut/sbin/utdesktop -lc
# /opt/SUNWut/sbin/utsession -p
# /opt/SUNWut/lib/Xnewt
# /usr/sbin/gdm-binary
# /usr/libexec/gdmgreeter 
# /usr/sbin/dhcpd

如果有任何错误,检查一下有没有需要安装的包没有安装,我的这个系统缺少 glitz:

# rpm -ivh glitz-0.5.6-5.i386.rpm
# rpm -ivh glitz-devel-0.5.6-5.i386.rpm

Host Lambda:$3.99 128MB OpenVZ VPS

hostlambda

Host Lambda 提供很便宜的 VPS,最贵一款才 9.99 美元,业务上线不到6个月,网站上连个联系电话都没有。有意思的是,Host Lambda 使用 ibnefahim 的 ID 在 WHT 上发广告,继续查看所有 ibnefahim 的帖子发现 ibnefahim 是个巴基斯坦人并且人还在巴基斯坦,只能提供 PayPal 付款服务。

ibnefahim View Beta Profile Junior Guru Wannabe Join Date: Oct 2005 Posts: 35
well i m from pakistan , No paypal , no credit card no bank

没有自己的硬件,服务器租用的是 BurstNET 的设备。VPS 配置如下:

服务器在 Scranton, PA
SolusVm 控制面板
5GB 硬盘/10GB
128MB Guaranteed RAM,256MB Burst RAM/256,384MB
200 GB 带宽/350GB
3.99美元/6.99美元

服务器和网络信息:

All our nodes are Xeon based.

Xen 和 KVM 的性能对比

最近出现提供 KVM/Qemu VPS 的服务商让 VPSee 有点惊讶,印象当中 KVM 还是一个很新的项目,还远没有达到成熟应用的工业标准,现在已经看到有人/公司开始提供基于 KVM 的 VPS 了,KVM 在众多重量级厂商的强力推动下果然发展很快。2008年9月 RedHat 宣布收购 KVM 老家 Qumranet,并在今年9月份刚刚过去的 Red Hat Summit 2009 上宣布 KVM 将是 RHEL 5.4 的下一代虚拟技术,RHEL 5.4 同时也会支持 Xen,对 Xen 的支持会持续到 RHEL 5 产品线的结束,Novell 已经在 SUSE Linux Enterprise Desktop 产品线上使用 KVM,Ubuntu 已经指定 KVM 为其默认虚拟技术了,KVM 在短时间内就已经赢得了三大 Linux 厂商的支持,想让人忽略都很难。

前天看了一篇关于 Xen 和 KVM 性能对比的 paper,Quantitative Comparison of Xen and KVM(图片来源),较详细的比较了 Xen 和 KVM 的性能和扩展性,不过这篇 paper 的发表时间是2008年6月,有点老了,现在 KVM 的性能和成熟度肯定有了很大的提高。这篇 paper 从三个角度来比较了 Xen 和 KVM 的性能:

总体性能

分别测试 CPU 速度,内核编译速度和 IO 的读写速度,结果如图,Xen 的 CPU 测试结果非常接近 Linux,性能非常好;KVM 在 CPU 测试中表现也不错,比 Xen 差一点,但是在 IO 测试中要比 Xen 好一些。

craigslist internals overview

隔离性能

隔离性能主要用来测试 Xen 和 KVM 能否有效隔离 guest,以便每个 guest 都能公平的得到计算资源,不会被某个“坏” guest 占用资源。在隔离方面 KVM 比 Xen 做得要好一些,Xen 在网络方面几乎没有隔离,虽然隔离性能不好,反而提高了服务器整体的网络利用率,按需分配肯定比平均分配效率高。图中 DNR 的意思是 “did not return”,是最坏的一种情况。

craigslist internals overview

扩展性能

扩展性能测试的是随着 guest 的增多,有没有、有多少额外的性能损失,因为 guest 之间的切换会造成性能损失。测试结果显示 Xen 有很棒的扩展性能,几乎是随着 guest 的个数线性增加的;而 KVM 扩展性能就很差,扩展到4个 guest 就崩溃了1个 guest,扩展到8个崩了4个,扩到16个崩了7个,扩到30个整个系统都崩溃了。

craigslist internals overview

解决 loop device 数目限制问题

今天早上在 Xen 服务器上增加一个 domU 虚拟机的时候遇到一个问题:

# /usr/sbin/xm create vm05
Using config file "/etc/xen/vm05".
Error: Device 2049 (vbd) could not be connected. Failed to find an unused loop device

上面错误显示没有找到可用的 loop device,可能是当前使用的内核版本或者内核配置对 loop devices 有最大数目的限制,查看一下当前正在使用的的 loop devices:

# /sbin/losetup -a
/dev/loop0: [fd00]:32014427 (/vm/vm01.swap)
/dev/loop1: [fd00]:44105729 (/vm/vm01.img)
/dev/loop2: [fd00]:32014432 (/vm/vm02.img)
/dev/loop3: [fd00]:32014433 (/vm/vm02.swap)
/dev/loop4: [fd00]:32014429 (/vm/vm03.swap)
/dev/loop5: [fd00]:43057161 (/vm/vm03.img)
/dev/loop6: [fd00]:1376674 (/vm/vm04.img)
/dev/loop7: [fd00]:32014428 (/vm/vm04.swap)

CentOS/RHEL 5

在 CentOS/RHEL 5 系统上默认的 active loop devices 数目是8,如上面看到的 loop0-loop7,只创建了4个 vm,用到了8个 loop devices,4个用来挂载 os image,4个用来挂载 swap image. 对于基于 file 的 Xen OS image 来说,需要修改这个默认值以便获得更多的 loop devices 挂载更多的 image. 编辑 /etc/modprobe.conf 来修改 active loop devices 最大限制数目:

# vi /etc/modprobe.conf
options loop max_loop=64

CentOS/RHEL 6

在 CentOS/RHEL 6 系统上更改 loop 最大数目更容易,最多支持256个,还不用重启:

# MAKEDEV -v /dev/loop

不过上面更改重启就会消失,所以把上面命令要加到 /etc/rc.local 里:

# vi /etc/rc.local
...
MAKEDEV -v /dev/loop

Ubuntu/Debian

在 Ubuntu/Debian 上修改默认 loop devices 最大限制数目:

# echo 'options loop max_loop=64' >/etc/modprobe.d/loopdev

逐行读取文本文件的 shell 脚本

网上有很多 shell script 读文本文件的例子,但是都没有讲出故事的全部,只说了一半。举个例子,比如从一个 testfile 文件中读取如下格式的文本行:

$ vi testfile
ls      -a -l /bin |  sort
ls      -a -l /bin |  sort | wc
ls      -a -l |  grep sh | wc
ls      -a -l
ls      -a -l |       sort      |    wc

最常见的一个 line by line 读取文件内容的例子就是:

$ vi readfile
#!/bin/sh

testfile=$1
while read -r line
do
    echo $line
done < $testfile

$ chmod +x readfile
$ ./readfile testfile
ls -a -l /bin | sort
ls -a -l /bin | sort | wc
ls -a -l | grep sh | wc
ls -a -l
ls -a -l | sort | wc

这个例子的问题是读取文本行后,文本格式发生了变化,和原来 testfile 文件的内容不完全一致,空格字符自动被删除了一些。为什么会这样呢?因为 IFS,如果在 shell script 里没有明确指定 IFS 的话,IFS 会默认用来分割空格、制表、换行等,所以上面文本行里多余的空格和换行都被自动缩进了。

如果想要输出 testfile 文件原有的格式,把每行(作为整体)原封不动的打印出来怎么办?这时需要指定 IFS 变量,告诉 shell 以 "行" 为单位读取。

$ vi readfile
#!/bin/sh

IFS="
"

testfile=$1
while read -r line
do
    echo $line
done < $testfile

$ ./readfile testfile
ls      -a -l /bin |  sort
ls      -a -l /bin |  sort | wc
ls      -a -l |  grep sh | wc
ls      -a -l
ls      -a -l |       sort      |    wc     

上面两种方法的输出不是差不多吗,有什么关系呢,第一种还美观一些?关系重大,VPSee 昨天写了一个模拟 shell 的 C 程序,然后又写了一个 shell script 来测试这个 C 程序,这个 script 需要从上面的 testfile 里读取完整一行传给 C 程序,如果按照上面的两种方法会得到两种不同的输入格式,意义完全不同:
$./mypipe ls -a -l | sort | wc
$./mypipe "ls -a -l | sort | wc "
显然我要的是第2种输入,把 "ls -a -l | sort | wc " 作为整体传给我的 mypipe,来测试我的 mypipe 能不能正确识别出字符串里面的各种命令。

如果不用 IFS 的话,还有一种方法可以得到上面第二种方法的效果:

#!/bin/sh

testfile=$1
x=`wc -l $testfile |awk '{print $1}'`

i=1
while [ $i -le $x ]
do
    echo "`head -$i  $testfile | tail -1`"
    i=`expr $i + 1`
done

RentaVPS:$5.95 256MB OpenVZ VPS

rentavps

RentaVPS 今年7月才上线,用 WordPress 搭建的网站,网站上的英文感觉很怪、有很多英语语法错误,难道是老外?(非英语国家老外)网站上没电话,没地址,只有 Email 等网上联络方式。根据 WHT 的广告 RenaVPS 正在打折,优惠码:VPS20OFF,下面这款 20% off 以后,只要 4.76 美元。VPS 配置如下:

服务器在 Softlayers Dallas Datacentre
带一个简易的 VPS 控制面板
20GB 硬盘
256MB Guaranteed RAM,512MB Burst RAM
250 GB 带宽
5.95美元

服务器和网络信息:

We use Dual and Quad core servers with at least 2GB of RAM and 250GB SATAII RAID1 protected storage. We utilize Intel’s Core2Duo/Core2Quad range on our servers.

ARP Networks:$10 256MB KVM/Qemu VPS

arpnetworks

ARP Networks 由 Garry Dolley,Anthony Daulo 两人在1999年创立,和一般 VPS 公司与众不同的是他们家的 VPS 使用的是 KVM/Qemu,full-virtualization 虚拟技术,和 Xen 使用的 para-virtualization 不同,可以直接虚拟出 FreeBSD/OpenBSD/Windows 来,不需要修改 guest 操作系统的内核,缺点就是要比 Xen 慢一些。网站很简陋,据称有10多年的 hosting/data center 从业经验。VPS 配置如下:

10GB 硬盘
256MB RAM
50 GB 带宽
10美元

服务器和网络信息:

4-core Intel servers. Our servers have redundant power supplies feeding into separate PDUs which in turn feed into different branch circuits. These branch circuits also feed into N+1 UPS bays. Power (or lack there of) should not be a reason a server goes down. We run our own multi-homed BGP network.

应该给 Xen Dom0 和 DomU 配置多大内存?

Xen Dom0 需要多大内存来支持各个 DomU 的正常运行要看具体情况,没有一个 magic formula (神奇公式)可以参考;而 Xen DomU 需要多大内存能正常运行则主要取决于运行在 DomU 上的 Guest OS 及应用的需求。

DomU

给 DomU 安排内存较简单,主要看什么样的 Guest 操作系统以及上面跑什么样的应用,复杂的图形桌面系统、还是简单的 Web 服务器,这里有一些操作系统厂商提供的推荐配置:

  • 根据 Ubuntu 官方文档 推荐的最小内存配置,运行 Ubuntu 9.04 Desktop 版本和 GNOME/KDE 等完整桌面图形系统,最小建议 384MB,我试过 256MB,可以运行,速度也可以,但是可用内存剩下不多,已经开始频繁 swap 了;如果使用中量级窗口管理器,像 xfce,最小建议 192MB;使用类似 fvwm/fluxbox/twm/icewm 等轻量级窗口管理器或者完全使用命令行,最小建议 64MB. 运行 Ubuntu 9.04 Server 版本,不用 GUI,最小安装,完全当作服务器使用,最小可以小到 32MB,不过 VPSee 推荐至少 64MB 才可以运行一个由 mysql/php/nginx 支持的小网站、博客。
  • 运行 CentOS 5.3 需要的内存要多一些,不用 GUI,最小安装,完全当作服务器使用,RedHat 推荐最小内存是 256MB;VPSee 推荐最小建议 128MB,我试过 64MB 虽然可以运行,但是明显感到慢,使用 yum 升级就能感觉到,就不用提 mysql/php/nginx 了,就算能运行起来也没多大实际意义。
  • Debian 5.0 的内存需求和 Ubuntu 类似,稍微可以偏低一些。
  • Gentoo 官方推荐最小 64MB,但是每次升级系统都需要编译,即使可以在 64MB 下安装运行意义也不大,因为每次升级软加包都需要下载代码编译,编译需要消耗大量 CPU 和内存。这也是 VPSee 不推荐在小 VPS 上使用 Gentoo 的原因。
  • Freebsd 官方推荐最小 24MB,同样的主要看应用,对于一个 mysql/php/nginx 应用,VPSee 推荐 64MB.

Dom0

为 Dom0 配置内存要稍微复杂一些,配置多了 DomU 可使用的内存就少了,配置少了就会担心 Dom0 不够用。有效限制 Dom0 的内存大小还有助于安全。假设 Dom0 本身不做任何其他的应用(当然也不包括 GUI)。如何分配内存让 Dom0 的内存最小而且又能最有效的管理那些 DomU 呢? Running Xen: A Hands-on Guide to the Art of Virtualization 这本书介绍了一些有用的经验,给 Dom0 分配多大内存没有一般公式可循,只能提供一些经验参考:

  1. 首先看 Dom0 上运行的 OS 对内存的需求怎么样,比如:Dom0 上如果跑的是 CentOS,这样 Dom0 通常最低需要 128MB,如果是 Debian 可能最低需要 64MB;
  2. 再看看需要一些什么样的服务,比如可能会在 Dom0 上运行 DNS/DHCP/SSH 之类的服务来支持 DomU;
  3. 可能需要在 Dom0 上做一些日常维护,比如:备份、管理 DomU、升级、运行一些 shell script、检查日志等,这会需要一些内存运行;
  4. DomU 与外界网络通信需要与 Xen 虚拟出来的网卡打交道,比如:bridge,routing,firewall 什么的,Dom0 要管理这些需要消耗一些内存;
  5. 为了保障安全,最好最小化 Dom0 的功能,最小化安装,只启动必须的服务,让 Dom0 只负责管理 DomU,最小化的策略还可以增加整个服务器的安全性。

举个实例,对于一个 2G 的双核机器来说,如果 Dom0 只是用来管理 DomU,给 Dom0 配置 128-256MB的内存就可以了,剩下的内存可以分出10-15个 128MB 的 DomU.