在 CentOS 上安装和配置 NFS 4.0

NFS 网络文件系统协议最早是于1984年由 SUN 公司开发的,NFSv4 是最新的修订版本,2003年4月发布(RFC 3530)。由于 NFS 是一个开放的协议和标准,所以各个系统上的实现不同,所表现出来就是稳定性和性能差异,VPSee 的经验是 NFS 在 Solaris 上最稳定、功能最丰富;在 FreeBSD 上的性能最好,但是缺少一些功能,比如 FreeBSD 8.0 内核才增加了 NFS 文件锁的支持;NFS 在 Linux 上表现最一般了,所以我们至今仍有部分服务器低调地运行着古老的 Solaris 2.5 和 NFSv3,相比 NFSv3 来说 NFSv4 做了一些重大改进,比如:性能的提升、安全性的增强和 ACL,更容易与防火墙集成等。下面地操作在 CentOS 5.5 上完成。

安装 NFS 服务器

安装 NFS 服务器所需的软件包:

# yum install nfs-utils nfs4-acl-tools portmap

配置 NFS 共享

和安装任何其他服务器软件一样,安装完 NFS 服务后就需要对 NFS 服务进行配置。输出服务器端的某个目录,以便 NFS 客户端能挂载和访问到这个目录:

# vi /etc/exports
/bak              172.16.20.11(rw,sync,fsid=0) 172.16.20.12(rw,sync,fsid=0)

172.16.20.11 和 172.16.20.12 上面的用户可以挂载 NFS 服务器(172.16.20.1)上的 /bak 目录到自己文件系统里;rw 在这里表示可读可写。

把 NFS 服务加入系统启动脚本并且手动启动 NFS 服务:

# chkconfig nfs on
# chkconfig portmap on

# /etc/init.d/portmap start
# /etc/init.d/nfs start

确认 NFSv4 服务器成功运行:

# rpcinfo -p
   program vers proto   port
    100000    2   tcp    111  portmapper
    100000    2   udp    111  portmapper
    100003    2   udp   2049  nfs
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    ...
    100005    3   tcp    750  mountd

检查 NFS 服务器是否输出我们想共享的目录 /bak:

# exportfs
/bak          	172.16.20.11
/bak          	172.16.20.12

注意 NFS 使用 portmap,而且新版本的 portmap 使用 hosts.deny 和 hosts.allow 文件来控制访问源,修改这2个配置文件以便 NFS 客户端能正常连接到服务器:

# vi /etc/hosts.deny
portmap:ALL

# vi /etc/hosts.allow
portmap:172.16.38.0/255.255.254.0

使用 NFS 客户端

首先启动 portmap:

# /etc/init.d/portmap start

检查 NFS 服务器端是否有目录共享:

# showmount -e 172.16.20.1
Export list for 172.16.20.1:
/bak 172.16.20.11,172.16.20.12

使用 mount 挂载服务器端的目录 /bak 到客户端某个目录下:

# mkdir /home/vpsee/bak
# mount -t nfs4 172.16.20.1:/ /home/vpsee/bak/

# df -H
Filesystem             Size   Used  Avail Use% Mounted on
...
172.16.39.1:/        232G    23G   198G  11% /home/vpsee/bak

在 /etc/fstab 中挂载 nfs 文件系统:

# vi /etc/fstab
172.16.20.1:/    /bak  nfs4   soft,intr,rsize=8192,wsize=8192,nosuid

# chkconfig netfs on

在成功挂载服务器端的 /bak 后就可以在客户端里操作了,这时候写文件或者拷贝文件的时候会遇到一个权限问题报错 : Permission denied,这是因为上面我们在服务器端建立了 /bak 但是 /bak 的 owner 是 root:root,而客户端的正在访问 NFS 的用户是 vpsee,NFS 要求服务器端和客户端的 UID 和 GID 必须一致,所以要在 NFS 服务器端修改 /bak 的权限和所属:

# chown -R vpsee:vpsee /bak

注意使用 NFS 的时候,客户端的用户 UID 和 GID 必须和服务器端的 UID 和 GID 完全符合,否则会造成权限错误。在小规模用户的情况下,我们可以偷懒通过在客户和服务器两端同时建立相同的用户和组来解决这个问题,但是在大规模用户情况下最好的办法是利用 NIS 或者 OpenLDAP 来统一管理用户,做到一次登录,到处访问。

Troubleshooting

1、在上面的操作过程中,如果你不幸遇到下面这个问题的话,可以尝试更新 Linux kernel 或通过打开 IPv6 来解决这个问题,这是1个 bug

# mount -t nfs4 172.16.20.1:/ /home/vpsee/bak/
mount.nfs4: Cannot allocate memory

2、如果遇到如下问题,可能是因为你的 mount -t nfs 使用的是 nfsv3 协议,需要明确指出使用 nfsv4 协议挂载 mount -t nfs4:

# mount -t nfs 172.16.20.1:/ /home/vpsee/bak/
mount: mount to NFS server '172.16.20.1' failed: RPC Error: Program not registered.

# mount -t nfs4 172.16.20.1:/ /home/vpsee/bak/

MocoSpace 的架构

MocoSpace.com 是一家移动社交网站,有1200多万注册用户,每个月30亿的 PV ,是美国最大的移动社区。我们来看看 MocoSpace 是如何来架构他们的网站的。先来看看他们的统计数据,注意他们只有1个系统管理员,8个程序员,14台服务器(数据和原文来自 MOCOSPACE ARCHITECTURE – 3 BILLION MOBILE PAGE VIEWS A MONTH):

数据

每月30亿 PV
全美第4大流量的网站,继 MySpace, Facebook, Google 之后
75% 手机 Web, 25% Web
1200 万用户
每月600万独立访问
10万在线用户
每月上传1200万照片
每天接受和发送450万 email
8个程序员,2个测试员,1个系统管理员

平台和工具

CentOS + Red Hat
Resin application server, Java Servlets, JavaServer Pages, Comet
PostgreSQL
Memcached
ActiveMQ’s job + message queue,Red Hat 集群做 HA
Squid 静态内容缓存,曾试过 Varnish 但是 Varnish 不稳定
JQuery + Ajax
S3 用来存储用户照片和视频,现在用 Amazon S3 做外部存储是主流,EC2 用来做照片处理
F5 BigIP 负载均衡,用 gzip 压缩所有页面
Akamai CDN,每天 2TB 数据、2.5亿次请求。
Nagios 用来警告,Zabbix 用来监测
EMC SAN 用大量磁盘做 RAID 10 做需要高 IO 的数据库存储,用来替代高性能的 SSD,节省了大量成本
PowerMTA 做邮件传送,用Barracuda 做 spam 和 firewall
Subversion 做源代码控制,Hudson 做 continuous integration
FFMPEG 用来做视频处理
Selenium 用来自动测试浏览器
5x Dell 1950, 2x dual core, 16G RAM(Web 服务器)
5x Dell 6950/R905, 4x dual core, 32G RAM(Web 服务器)
2x Sun Fire X4600 M2 Server, 8x quad core, 256G RAM(数据库服务器)
2x Dell 6950, 4x dual core, 64G RAM(数据库服务器)

架构

他们的网站主要是面向手机应用的,所以他们遇到的一个大挑战是如何让他们的网站在几百种(从最新的 iPhone 到古董级的 Motorola Razrs)不同的手机设备上运行,屏幕大小、缺少相应的 Web 标准等都是问题。他们在几百种不同手机的数据上抽象出了一个表现层,只要用一套代码通过一个手机数据库(包括屏幕大小、允许的文件类型、允许打开的页面大小等)把处理好的页面发到对应的手机上。

他们也是通过 shard 数据库来分担负载的,以用户 key 作为 shard 的依据,通过查找一张全局表来找到用户所在的 shard,他们自己写了查询层,可以用来在不同的 shards 之间自由查询和关联数据。他们 offline 的时候检查数据的一致性,他们认为如果不是做银行系统的话,一致性不是那么重要,牺牲一点一致性来换回性能还是值得的。他们把大表划分成了小表,这样分散了锁表带来的问题。

他们使用多级缓存,从应用服务器里的缓存到分布式 memcached,当需要更新 memcached 的数据的时候,他们通过消息发送给每台应用服务器上的缓存,以做到数据一致。他们的服务器通过分布式消息队列来通讯,比如用户实时通过发消息告诉系统需要更新缓存等。

他们用专门的服务器来打造 social graph,并都放在内存里。

他们用 Kickstart 自动安装服务器,用 Puppet 来配置服务器,web 服务器、数据库服务器、cache 服务器等。

经验

  • 在增加服务器之前先确定现有的服务器硬件还能不能往上升级,可以挑选一些二手的 4U 服务器。
  • 理解瓶颈在那里?是 CPU 还是磁盘、网络 IO?数据库总是有磁盘 IO 问题。
  • 扩展 web 服务器很容易也很便宜,扩展数据库服务器就很麻烦了,找出数据库系统查询最多的、查询执行时间最长的,尽早跟踪和测试这些查询找出数据库性能瓶颈。他们使用 pgFouine log analyzer 和 PostgreSQL pg_stat_statements 工具来测量。
  • 不要让用户等待,尽量在后台处理。避免异步通讯,比如数据等待积累一定程度后再一次提交给数据库;S3 存储的延迟和错误都可能会很大,把失败的请求放在队列里,等队列积累到一定程度的时候再试,而不是失败一个试一个,减少开销。
  • 在设计阶段就考虑监测系统和性能,而不是到了部署的时候才开始监测。他们试过很多监测工具,Cacti, Ganglia, Hyperic, Zabbix, Nagios 等,最重要的是要找到自己用得顺手的工具。
  • 网站变大以后就要做好防黑客、防垃圾的准备。
  • 删除可能会开销很大,尽量软删除,而且用户删错了的话软删除容易恢复。
  • N+1 设计,永远不要少于两种方案。

在 CentOS 下源码安装 Xen

在 CentOS 源码编译安装 Xen 的过程和在 Debian 上编译安装 Xen 的过程差不多,只是第一步安装编译所需要的工具和软件包有所不同,后续步骤有点小差别,不过方法都是一样的,这也说明各个 Linux 发行版之间的区别真的不大,没有必要为选择 Linux 发行版而发愁。编译一个 Xen 内核和编译一个普通 Linux 内核没有什么不同,如果发现编译后的内核启动不了,出现 kernel panic 的情况,多半是内核与机器的硬件没有配置好的原因,和 Xen 没有关系,比如常见的 switchroot: mount failed: No such file or directory 就可能是因为内核配置的时候忘了加上 root 的硬盘驱动,也可能找到驱动了但是挂载的时候发现文件系统类型不对,等等。VPSee 在一台 Intel(R) Core(TM) i3 CPU 540 @ 3.07GHz, 4GB 机器上使用最新的 Xen 4.0.0 源代码和 CentOS 5.4 完成以下操作。这里还有在 Ubuntu 上源码安装 Xen 的详细过程。如果觉得源码安装很麻烦的话,这里有 在 CentOS 上安装和配置 Xen 的二进制安装过程。

安装需要的软件包

首先最小化安装 CentOS,然后安装编译 Xen 和 Linux xen kernel 所需要的软件包:

# yum groupinstall "Development Tools" 
# yum install hmaccalc ncurses-devel zlib-devel openssl-devel python-devel \
bridge-utils  libtool-ltdl iasl xorg-x11-drv-evdev xorg-x11-drv-fbdev \
xorg-x11-drv-i810-devel xorg-x11-drv-via-devel xorg-x11-proto-devel \
xorg-x11-server-sdk xorg-x11-xtrans-devel

安装完以上软件包后,剩下的操作就和在 Debian 上编译和安装 Xen 差不多了。

安装 Xen hypervisor 和 tools

到 http://www.xen.org/products/xen_source.html 下载最新的 Xen 源代码,然后解开、编译、安装,标准的 Linux 软件源码安装动作:

$ tar zxvf xen-4.0.0.tar.gz
$ cd xen-4.0.0/
$ make xen tools stubdom
# make install-xen install-tools install-stubdom

上面 make stubdom 的时候会从网上自动下载一些东西,所以如果是用代理上网的话需要在自己根目录下的 .wgetrc 里加上代理服务器,以便 wget 能通过代理正常下载:

$ vi .wgetrc
http_proxy = http://proxy.vpsee.com:3128/
use_proxy = on

加入到启动脚本:

# /sbin/chkconfig --add xend
# /sbin/chkconfig --add xendomains
# /sbin/chkconfig xend on
# /sbin/chkconfig xendomains on

安装 Xen 内核

下载 Linux 内核后给内核打 xen 补丁:

$ cd
$ wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.31.8.tar.bz2
$ tar -xjf linux-2.6.31.8.tar.bz2

$ wget http://gentoo-xen-kernel.googlecode.com/files/
xen-patches-2.6.31-10.tar.bz2
$ mkdir xenpatch-2.6.31.8
$ cd xenpatch-2.6.31.8
$ tar -xjf ../xen-patches-2.6.31-10.tar.bz2
$ cd ..

$ cd linux-2.6.31.8
$ for i in `ls ../xenpatch-2.6.31.8/`; \
do patch -p1 < ../xenpatch-2.6.31.8/"$i"; done

配置带 xen 的 Linux 内核:

$ make menuconfig

Processor type and features --->
  [*] Enable Xen compatible kernel
Networking support --->
  Networking options --->
    <*> 802.1d Ethernet Bridging
Device Drivers --->
  XEN --->
    [*] Privileged Guest (domain 0)
     Backend driver support
       Block-device backend driver
       Block-device tap backend driver
       Block-device tap backend driver 2
       Network-device backend driver
       PCI-device backend driver
       SCSI backend driver
       USB backend driver
    <*> Block-device frontend driver
    <*> Network-device frontend driver
     SCSI frontend driver
     USB frontend driver
    <*> Framebuffer-device frontend driver
    <*>   Keyboard-device frontend driver
    [*] Disable serial port drivers
    <*> Export Xen attributes in sysfs
        Xen version compatibility (3.3.0 and later) --->
           3.3.0 and later

配置好内核参数以后,保存并退出,开始编译 Linux 内核:

$ make
$ make modules
# make modules_install
# make install
# /sbin/depmod 2.6.31.8

更新 grub:

#  vi /boot/grub/menu.lst
...
title CentOS (2.6.31.8-xen)
        root (hd0,0)
        kernel /xen-4.0.0.gz
        module /vmlinuz-2.6.31.8 ro root=/dev/VolGroup00/LogVol00
        module /initrd-2.6.31.8.img
...

重启系统,确认 Xen 安装成功:

# reboot

# uname -a
Linux localhost.localdomain 2.6.31.8 #2 SMP Tue Apr 20 11:19:19 SAST 2010 x86_64 GNU/Linux

# xm list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0  3713     4     r-----     36.0

在64位的 CentOS 上只安装64位的软件包

在 64位版本的 CentOS 5.4 上使用 yum 安装软件包的时候如果不小心的话会同时安装 i386 和 x86_64 版本的软件,如下面安装的 httpd-devel 就有 i386 和 x86_64 两个版本:

# yum install httpd-devel
...
Dependencies Resolved

================================================================================
 Package              Arch       Version                      Repository   Size
================================================================================
Installing:
 httpd-devel          i386       2.2.3-31.el5.centos.2        updates     147 k
 httpd-devel          x86_64     2.2.3-31.el5.centos.2        updates     147 k
Installing for dependencies:
...

同时安装32位和64位版本的软件虽然不是什么错,也不会对系统造成什么问题,但是这样会浪费硬盘空间,而且显得系统臃肿、不干净。如果想要保持一个纯的64位系统、在64位 CentOS 上避免安装32位软件包的话很容易,只需要在 yum.conf 加上一行过滤掉 i386, i686 的软件包就可以了:

# vi /etc/yum.conf
[main]
...
exclude=*.i?86

然后删除系统上已经安装的 i386/i686 包:

# yum remove \*.i\?86

在 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

Xen 性能对比:Native,Dom0 和 DomU

安装和配置完 Xen 后很好奇虚拟出来的系统性能怎么样,虚拟化后性能肯定会有牺牲。VPSee 决定做个简单的测试看看性能差多少。

测试环境

测试工具:unixbench-5.1.2

Native:
CPU:Dual-Core AMD Opteron(tm) Processor 1220, 2800 MHz
内存:2 GB DDR2/667 ECC RAM
硬盘:2×500G SATA II
操作系统:CentOS 5.3

Dom0:
CPU:2
内存:1.8 GB RAM
操作系统:CentOS 5.3

DomU:
CPU:1
内存:256MB RAM
操作系统:CentOS 5.3

下载 unixbench-5.1.2 解压后,打开 Makefile,找到 GRAPHIC_TESTS = defined 一行注释掉,不进行图像测试。

vi Makefile
#GRAPHIC_TESTS = defined

测试结果


继续阅读 »

在 CentOS 上安装和配置 Xen

现在实验室 Masters 都配有1台 PC 和 1台笔记本,但是 Honours 只配有1台 PC,1台机器做项目很不方便,开发经常会用到多系统,比如有的人做的是手机 VoIP 的相关项目,手机客户端界面要在 Windows 平台上做,VoIP 服务器端要用到 Linux,所以要用虚拟机虚拟一个 Linux 出来,如果这些都跑在一台物理机器上会很慢。现在给 Honours 配置的 PC 只有 1G 的内存,如果运行 Windows + 手机模拟器 + Elipse IDE(需要 Java)+ VMware(VMware 上再跑个 Linux + Asterisk + MySQL),然后开个客户端收邮件、开几个浏览器看资料就会很困难。

所以 VPSee 打算把自己在用的1台 SUN 服务器捐出来做成 Xen 服务器,给每个 Honours 分一个虚拟系统,省下他们自己装虚拟机的时间和资源,VPSee 成了免费的 Xen VPS provider 了:)。SUN 服务器上同时运行16个 Xen 虚拟系统实例,每个配 256 MB 内存,4GB 硬盘,不开 GUI。下面的安装步骤和配置过程是基于 CentOS 5.3 版本,Ubuntu 版本可以参看:在 Ubuntu 上安装和配置 Xen,Debian 版本参看:在 Debian 上安装和配置 Xen,OpenSolaris 版本参看:在 OpenSolaris 上安装和配置 Xen,NetBSD 版本参看:在 NetBSD 上安装和配置 Xen. 对 OpenVZ 和 KVM 感兴趣的童鞋可以看:在 CentOS 上安装和配置 OpenVZ在 CentOS 上安装和配置 KVM.

安装 Xen

安装支持 Xen 的 Linux 内核 和 Xen:

# yum install kernel-xen xen

安装成功后,可以看到 xen.gz-2.6.18-128.2.1.el5 内核已经装好,修改 default 的值默认启动 Xen 内核。

# vi /etc/grub.conf 

default=0
timeout=2
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-128.2.1.el5xen)
	root (hd0,0)
	kernel /xen.gz-2.6.18-128.2.1.el5
	module /vmlinuz-2.6.18-128.2.1.el5xen ro root=/dev/VolGroup00/LogVol00
	module /initrd-2.6.18-128.2.1.el5xen.img
title CentOS (2.6.18-128.1.16.el5)
	root (hd0,0)
	kernel /vmlinuz-2.6.18-128.1.16.el5 ro root=/dev/VolGroup00/LogVol00
	initrd /initrd-2.6.18-128.1.16.el5.img


继续阅读 »

yum update 升级报错解决办法

今天在一个 CentOS VPS 上升级系统时遇到一个问题,yum 报错:

# yum update
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Traceback (most recent call last):
  File "/usr/bin/yum", line 29, in ?
    yummain.user_main(sys.argv[1:], exit_code=True)
  File "/usr/share/yum-cli/yummain.py", line 229, in user_main
    errcode = main(args)
  File "/usr/share/yum-cli/yummain.py", line 104, in main
    result, resultmsgs = base.doCommands()
  File "/usr/share/yum-cli/cli.py", line 339, in doCommands
    self._getTs(needTsRemove)
  File "/usr/lib/python2.4/site-packages/yum/depsolve.py", line 101, in _getTs
    self._getTsInfo(remove_only)
  File "/usr/lib/python2.4/site-packages/yum/depsolve.py", line 112, in _getTsInfo
    pkgSack = self.pkgSack
  File "/usr/lib/python2.4/site-packages/yum/__init__.py", line 591, in 
    pkgSack = property(fget=lambda self: self._getSacks(),
  File "/usr/lib/python2.4/site-packages/yum/__init__.py", line 434, in _getSacks
    self.repos.populateSack(which=repos)
  File "/usr/lib/python2.4/site-packages/yum/repos.py", line 223, in populateSack
    self.doSetup()
  File "/usr/lib/python2.4/site-packages/yum/repos.py", line 71, in doSetup
    self.ayum.plugins.run('postreposetup')
  File "/usr/lib/python2.4/site-packages/yum/plugins.py", line 176, in run
    func(conduitcls(self, self.base, conf, **kwargs))
  File "/usr/lib/yum-plugins/fastestmirror.py", line 181, in postreposetup_hook
    all_urls = FastestMirror(all_urls).get_mirrorlist()
  File "/usr/lib/yum-plugins/fastestmirror.py", line 333, in get_mirrorlist
    self._poll_mirrors()
  File "/usr/lib/yum-plugins/fastestmirror.py", line 376, in _poll_mirrors
    pollThread.start()
  File "/usr/lib/python2.4/threading.py", line 416, in start
    _start_new_thread(self.__bootstrap, ())
thread.error: can't start new thread

yum 在启动 fastestmirror 插件时出错,是 yum 的一个 bug(http://yum.baseurl.org/ticket/70)。如果停掉 mysqld,yum 一切工作正常。临时解决办法是 yum update 时禁止启动 fastestmirror 插件。

yum --disableplugin=fastestmirror update

CentOS 5 上配置 Trac 和 Subversion

trac

这是一篇很久以前做项目的时候写的笔记,以前很多笔记都是记在一个一个 txt 里或者干脆不记用到了就去 google 搜,现在有了一个记笔记的好地方:),嗯,就是这个博客。关于 trac 和 subversion 的介绍可以 google 一大堆出来,这里就不赘述了,个人认为 trac 和 subversion 非常适合小型团队或者创业小公司用来管理源代码,追踪 bug,trac 还集成了一个 wiki,可以用来管理文档,发布网页,功能很强大,全 web based 的。很多 open source 项目以及一些欧美小公司都是用 trac + subversin 这个组合来管理项目的。

这里有个问题,为什么装了 lighttpd 后还需要 apache 呢? 原因是 lighttpd 现在还没有 svn-dav 模块,只有 apache 有,所以如果要集成 subversion 的话还需要 apache 的支持,当然只配置 apache 来同时处理 web 和 svn 也是可以的。不过这里用 lighttpd 来处理 web,apache 的 svn-dav module 来处理 svn 部分。

安装必要的软件包

首先下载并且安装必要的软件包

yum install mysql mysql-server MySQL-python
yum install subversion
yum install httpd mod_dav_svn
rpm -ivh lighttpd-1.4.13-3.fc5.i386.rpm lighttpd-fastcgi-1.4.13-3.fc5.i386.rpm
rpm -ivh clearsilver-0.10.4-2.el5.rf.i386.rpm
rpm -ivh python-clearsilver-0.10.4-2.el5.rf.i386.rpm
tar zxvf trac-0.10.4.tar.gz; cd trac-0.10.4; python ./setup.py install


继续阅读 »

128MB VPS 上优化 CentOS 5

centos

CentOS 是一个构建在 Red Hat Enterprise Linux (RHEL) 源代码上的 Linux 发行版,并且从二进制的角度100%兼容 RHEL 软件包,简单的说 RHEL上 可以运行的软件包在 CentOS 上不需要编译就可以直接安装运行。除了少量的版权信息外,CentOS 和 RHEL 基本上一样。CentOS 是免费的,并且有着 RHEL 的稳定,因此深受各大 hosting 服务商支持,几乎所有 Linux VPS 都支持 CentOS。

一般来说如果 VPS 配置较高我会选 CentOS,配置低的话就选 Debian,当然这是个人偏好,大多数 Linux VPS 服务商也会提供 Gentoo,不过每次安装程序,升级都要编译会消耗很多资源,耗时,而且性能没有明显提高,不推荐给配置低的 VPS。

VPS 服务商一般给的操作系统版本都是最小安装版本,或者优化过的版本。每个 VPS 服务商提供的版本都可能不同,安装 CentOS 的系统最低要求至少 64MB 内存(纯文字界面),1GB 硬盘空间。

安装和升级系统

1、登录 VPS 安装 CentOS 5。

继续阅读 »