Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1203782
  • 博文数量: 181
  • 博客积分: 6155
  • 博客等级: 准将
  • 技术积分: 1805
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-05 09:24
文章分类

全部博文(181)

文章存档

2015年(2)

2014年(3)

2013年(9)

2012年(29)

2011年(30)

2010年(36)

2009年(40)

2008年(32)

分类: LINUX

2009-09-13 15:00:18

下面,我们来配置第二台电脑,也就是我们的子节点。因为网格是分布式的,我们总不能只有一台电脑吧。

我这子节点,其实是我用虚拟机,虚拟出来的。下面我就来讲一讲,如何配置子节点的。

安装VMWare WorkStation

首先把VMWare WorkStation的压缩包拷贝到/usr/local下面,解压后,进入安装目录,运行安装程序
./install.pl,然后就一步一步提示你安装到那个地方了。网上有很多教程,大家不明白的可以搜索一下。

这里,我要提醒大家的是,我的主节点,最开始安装的是FC 4和VM 5,但是由于总是出毛病,我把系统更新到了FC 6。
但是更新之后,我的VM 5就无法启动了,所以我就准备重新安装VM 5。可是在FC 6上,系统内核版本
过高,VM 5根本无法重新安装,提示我,找不到对应的内核版本。

也可能是我直接升级Fedora的原因,希望大家还是
首先用VM 5试一下,因为VM 6现在根本没有破解的序列号,只能试用的。

所以,我从网上down下来了VM 6,经过安装,哈哈,竟然没有过期的日期,大概是VM 6从系统中,读出了我的VM 5的注册信息。

我用VM 虚拟出了一个FC 4操作系统,大家可能会问我,怎么不用FC 6?其实是我怕麻烦的原因,因为我在把主机从FC 4升级到
FC 6之前,先前已经安装好了虚拟的FC 4,况且,我的电脑配置极低,硬盘也小。那请大家原谅。

下面,有几步,有不清楚的,大家可以参看主节点的配置方法
第一,安装jdk
第二,安装ant
第三,安装globus

大家可以看看,我的安装路径
[root@xx2 ~]# tail /etc/profile

export ANT_HOME=/usr/local/ant
export GLOBUS_LOCATION=/usr/local/globus
export JAVA_HOME=/usr/local/jdk
export CLASS_PATH="./:JAVA_HOME/lib:JAVA_HOME/jre/lib"
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$ANT_HOME/bin:$PLAYER_HOME/bin:$PATH

接下来,让我们对子节点进行安全配置
[root@xx1 simpleCA]# pwd
/home/globus/.globus/simpleCA


[root@xx1 simpleCA]# scp globus_simple_ca_b62cb8c1_setup-0.19.tar.gz xx2.com:/home/globus
root@xx2.com's password:
globus_simple_ca_b62cb8c1_setup-0.19.tar.gz                       100%  211KB 210.8KB/s   00:00

这里,我以前已经安装过了,这里为了做个教程,所以加了参数-force,重新编译
[globus@xx2 ~]$ /usr/local/globus/sbin/gpt-build -force globus_simple_ca_b62cb8c1_setup-0.19.tar.gz

切换到root用户
[globus@xx2 ~]$ su - root
Password:

[root@xx2 ~]# /usr/local/globus/setup/globus_simple_ca_b62cb8c1_setup/setup-gsi -default
setup-gsi: Configuring GSI security
Installing /etc/grid-security/certificates//grid-security.conf.b62cb8c1...
Running grid-security-config...
Installing Globus CA certificate into trusted CA certificate directory...
Installing Globus CA signing policy into trusted CA certificate directory...
setup-gsi: Complete

下面,我们看看security directory下面都是怎样的。
[root@xx2 ~]# ls /etc/grid-security/
certificates       globus-host-ssl.conf  grid-security.conf    hostkey.pem
containercert.pem  globus-user-ssl.conf  hostcert.pem
containerkey.pem   grid-mapfile          hostcert_request.pem

这里,我建议,把globus所要用到环境变量写道/etc/profile文件里面,否则,每次都要运行相应的命令。
所以我们如下一句。
[root@xx2 ~]# tail /etc/profile

. /usr/local/globus/etc/globus-user-env.sh


我们对xx2.com生成一个主机证书,所以要首先运行请求证书命令。
[root@xx2 ~]# grid-cert-request -host xx2.com

    /etc/grid-security/hostcert_request.pem already exists
    /etc/grid-security/hostcert.pem already exists
    /etc/grid-security/hostkey.pem already exists

If you wish to overwrite, run the script again with -force.

哦,我先前已经安装过了,所以加个参数force。

[root@xx2 ~]# grid-cert-request -host xx2.com -force

    /etc/grid-security/hostcert_request.pem already exists
    /etc/grid-security/hostcert.pem already exists
    /etc/grid-security/hostkey.pem already exists

Generating a 1024 bit RSA private key
....++++++
........++++++
writing new private key to '/etc/grid-security/hostkey.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Level 0 Organization [Grid]:Level 0 Organizational Unit [GlobusTest]:Level 1 Organizational Unit [simpleCA-xx1.com]:Name (e.g., John M. Smith) []:

A private host key and a certificate request has been generated
with the subject:

/O=Grid/OU=GlobusTest/OU=simpleCA-xx1.com/CN=host/xx2.com

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

The private key is stored in /etc/grid-security/hostkey.pem
The request is stored in /etc/grid-security/hostcert_request.pem

Please e-mail the request to the Globus Simple CA cy_xiaoxiao@yahoo.com.cn
You may use a command similar to the following:

cat /etc/grid-security/hostcert_request.pem | mail cy_xiaoxiao@yahoo.com.cn

Only use the above if this machine can send AND receive e-mail. if not, please
mail using some other method.

Your certificate will be mailed to you within two working days.
If you receive no response, contact Globus Simple CA at cy_xiaoxiao@yahoo.com.cn

我们可以看到,在子节点上,生成了一个主机私钥/etc/grid-security/hostkey.pem,
请求证书/etc/grid-security/hostcert_request.pem

下面我们应该作什么呢?就是我们要作为globus即网格来给主机签署一下证书,让我们的网格信任xx2.com.
那么,我们应该让哪个globus用户来签署xx2.com的hostcert_request.pem呢?

我们是用xx1.com来作为主节点的,所以,我们应该由xx1.com上的globus用户来签署证书。

那么,究竟我的说法成立不?下面,让我们来看一下,首先切换到相应的目录
[root@xx2 grid-security]# pwd
/etc/grid-security

接着,查看请求文件,其中有一部分如下:
[root@xx2 grid-security]# more hostcert_request.pem
=========================================================================
Certificate Subject:

    /O=Grid/OU=GlobusTest/OU=simpleCA-xx1.com/CN=host/xx2.com

这句,OU=simpleCA-xx1.com,不是说明我们的SimpleCA中心就是xx1.com,
CN=host/xx2.com,说明请求的用户名称是xx2.com的主机。

这就明白了,xx1.com是公司领导,xx2.com是部下,部下要作事情,不是要由领导批准吗?

所以,我们把那个请求文件弄过去,让xx1.com上的globus签署一下。
[root@xx2 grid-security]# scp hostcert_request.pem xx1.com:/tmp

请注意,在这里,我用了“弄”一个字,就是说不管是拷贝还是电邮或者FTP只要送过去就行。

看看,我是09:06拷贝来的,果真是这个文件。
[root@xx1 tmp]# ls -la hostcert_request.pem
-rw-r--r-- 1 root root 1377 07-09 09:06 hostcert_request.pem

下面,切换到globus用户,签署请求文件
[root@xx1 tmp]# su - globus
[globus@xx1 ~]$ cd /tmp

[globus@xx1 tmp]$ grid-ca-sign -in hostcert_request.pem -out hostcert.pem

To sign the request
please enter the password for the CA key:

The new signed certificate is at: /home/globus/.globus/simpleCA//newcerts/03.pem

看一下,声称的主机证书,其中有两句,Issuer是xx1.com,Subject是xx2.com,哈哈,已经成功签署。
[globus@xx1 tmp]$ cat hostcert.pem

Issuer: O=Grid, OU=GlobusTest, OU=simpleCA-xx1.com, CN=Globus Simple CA
Subject: O=Grid, OU=GlobusTest, OU=simpleCA-xx1.com, CN=host/xx2.com

[globus@xx1 tmp]$ scp hostcert.pem root@xx2.com:/tmp

root@xx2.com's password:
hostcert.pem                                  100% 2632     2.6KB/s   00:00

[root@xx2 grid-security]# mv /tmp/hostcert.pem .
mv: overwrite `./hostcert.pem'? yes

下面,我们看看,是不是子节点上有两套证书了。
[root@xx2 grid-security]# ls -la *pem
-rw-r--r--  1 globus globus 2632 Jul  1 23:45 containercert.pem
-r--------  1 globus globus  887 Jul  1 23:45 containerkey.pem
-rw-r--r--  1 root   root   2632 Jul  9 09:15 hostcert.pem
-rw-r--r--  1 root   root   1377 Jul  9 08:48 hostcert_request.pem
-r--------  1 root   root    887 Jul  9 08:48 hostkey.pem

对着呢。所以,我们往下走,既然xx2.com已经有了主机和容器的证书,并且也信任了我们的网格CA,最后一步就是要让xx2.com
信任我在主机xx1.com上的用户zx。因为只有这样的话,我才能用zx用户在xx1.com上调度xx2.com的资源或者命令。

以防大家弄错,我先在xx2.com上新建一个zhangxiao用户,他对应xx1.com上的zx用户,代表zx在xx2.com上执行命令。这个问题
其实很好理解,zx用户对于xx2.com来说是没有意义的,因为xx2.com这台电脑,没有也不知道zx这个用户。所以zx@xx1.com提交的作业
,必须有相应的本地用户来执行。

当大家看明白了上面的那段话,你也可以把zx映射到相依的其它用户,动脑筋稍加修改就可以了。

那么,我们把zx@xx1.com所有的证书拷贝给zhangxiao@xx2.com,然后让在xx2.com上生成认证。

保证切换到相应的目录
[root@xx1 .globus]# pwd
/home/zx/.globus

总共三个文件
[root@xx1 .globus]# ls
usercert.pem  usercert_request.pem  userkey.pem

拷贝过去
[root@xx1 .globus]# scp *.pem zhangxiao@xx2.com/home/zhangxiao/.globus

在xx2.com上面
[root@xx2 .globus]# pwd
/home/zhangxiao/.globus

它们三个已经拷贝过来了。
[root@xx2 .globus]# ls -la *pem
-rw-r--r--  1 zhangxiao zhangxiao 2635 Jul  9 10:04 usercert.pem
-rw-r--r--  1 zhangxiao zhangxiao 1376 Jul  9 10:04 usercert_request.pem
-r--------  1 zhangxiao zhangxiao  963 Jul  9 10:04 userkey.pem


哈哈,接下来我让xx2.com对zx对应的zhangxiao用户进行认证
[zhangxiao@xx2 ~]$ grid-proxy-init -verify -debug

User Cert File: /home/zhangxiao/.globus/usercert.pem
User Key File: /home/zhangxiao/.globus/userkey.pem

Trusted CA Cert Dir: /etc/grid-security/certificates

Output File: /tmp/x509up_u503
Your identity: /O=Grid/OU=GlobusTest/OU=simpleCA-xx1.com/OU=com/CN=zx
Enter GRID pass phrase for this identity:
Creating proxy .........................++++++++++++
...........++++++++++++
Done
Proxy Verify OK
Your proxy is valid until: Mon Jul  9 22:08:44 2007

怎么?最后一行竟然是24小时之后就过期了,太不爽了。下次还要重新认证吗?

原来是我忘记加参数了。这次加上参数让它10000小时0秒后过期
[zhangxiao@xx2 ~]$ grid-proxy-init -verify -debug -valid 10000:0

Warning: your certificate and proxy will expire Fri Jul  4 11:20:07 2008
which is within the requested lifetime of the proxy

嘿嘿,08年才过期呢。


首先,我们要让xx2.com的容器生成证书。

[root@xx2 grid-security]# vi grid-mapfile
[root@xx2 grid-security]# cat grid-mapfile
"/O=Grid/OU=GlobusTest/OU=simpleCA-xx1.com/OU=com/CN=zx" zhangxiao

切换到zhangxiao@xx2.com,我们拷贝一个文件看看
[zhangxiao@xx2 ~]$ globus-url-copy gsiftp://xx2.com/tmp/ gsiftp://xx1.com/tmp/

我们在xx1.com上看看文件属主,果真是zx,这就又验证了zhangxiao@xx2.com是zx@xx1.com的代理映射。
[root@xx1 tmp]# ls -la
-rw-r--r-- 1 zx zx 644 07-09 10:17

那么反向能不能成立啊?我们来试试。
[zx@xx1 tmp]$ globus-url-copy gsiftp://xx1.com/tmp/mytest gsiftp://xx2.com/tmp/form.xx1

[root@xx2 ~]# ls /tmp/form.xx1 -la
-rw-r--r--  1 zhangxiao zhangxiao 337 Jul  9 10:30 /tmp/form.xx1
果真是zhangxiao的属主。
登录到xx2.com,修改sudoers文件
[root@xx2 ~]# visudo

[root@xx2 ~]# tail /etc/sudoers
# Samples
# %users  ALL=/sbin/mount /cdrom,/sbin/umount /cdrom
# %users  localhost=/sbin/shutdown -h now

# Globus GRAM Entities
globus ALL=(zhangxiao) NOPASSWD: /usr/local/globus/libexec/globus-gridmap-and-execute -g /etc/grid-security/grid-mapfile /usr/local/globus/libexec/globus-job-manager-script.pl *


globus ALL=(zhangxiao) NOPASSWD: /usr/local/globus/libexec/globus-gridmap-and-execute -g /etc/grid-security/grid-mapfile /usr/local/globus/libexec/globus-gram-local-proxy-tool *



在上一篇中,我曾经说了出现了错误,其实,如果大家按照上面的步骤去做,是不会错的。

在我调用类似于
[zx@xx1 tmp]$ globus-url-copy gsiftp://xx1.com/tmp/mytest gsiftp://xx2.com/tmp/form.xx1
这样的命令,出现了不能拷贝错误。

原因就是因为我不小心动了某些东西。结果把节点xx2.com上的gsiftp给弄错了,导致gsiftp启动不起来,不能够连接上xx2.com,
并且sudoers文件配置也错误。

于是一狠心,反正xx2.com是虚拟机,从来一遍。于是回到原始的snapshot,啪啪啪啪,反正轻车熟路,一会就安装好了。

执行启动容器的命令,发现地址全不是loopback的,这怎行?

[root@xx2 globus_wsrf_core]# su - globus -c /usr/local/globus/bin/globus-start-container
[1]:
[2]:
[3]: https://127.0.0.1:8443/wsrf/services/SecureCounterService
[4]:
[5]:
[6]:
[7]:
[8]:
[9]:
[10]:
[11]:
[12]:
[13]:
[14]:
[15]:
[16]:
[17]:
[18]: https://127.0.0.1:8443/wsrf/services/SecurityTestService
[19]:
[20]:
[21]: Request
[22]:
[23]:
[24]: Entry
[25]:
[26]:
[27]:
[28]:
[29]:
[30]:
[31]:
[32]:
[33]: Entry
[34]:
[35]:
[36]:
[37]:
[38]:
[39]:
[40]:
[41]:
[42]: https://127.0.0.1:8443/wsrf/services/ManagedExecutableJobService
[43]: Entry
[44]:
[45]:
[46]:
[47]:
[48]:
[49]:
[50]:
[51]:

于是,我连忙修改$GLOBUS_LOCATION/etc/globus_wsrf_core下面的
server-config.wsdd 和 client-server-config.wsdd文件,

中间都添加上,元素,这样就好了。

把容器停止以后,我们再次启动容器,结果发现地址是对了,可是仍然提示FRT错误。
[root@xx2 globus_wsrf_core]# su - globus -c /usr/local/globus/bin/globus-start-container
2007-07-13 21:52:18,916 ERROR service.ReliableFileTransferImpl [main,:69] Unable to setup database driver with pooling.Connection refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.
2007-07-13 21:52:20,143 WARN  service.ReliableFileTransferHome [main,initialize:97] All RFT requests will fail and all GRAM jobs that require file staging will fail.Connection refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.
2007-07-13 21:53:03,390 INFO  impl.DefaultIndexService [ServiceThread-9,processConfigFile:107] Reading default registration configuration from file: /usr/local/globus/etc/globus_wsrf_mds_index/hierarchy.xml
Starting SOAP server at:
With the following services:

[1]: AdminService
[2]: AuthzCalloutTestService
[3]: CASService
[4]: ContainerRegistryEntryService
[5]: ContainerRegistryService
[6]: CounterService


这里,我们要清楚,我们的网格环境进行分布计算是需要RFT(reliable file transfer)支持的,可是我们在xx2.com上面,是没有RFT所需的postgresql数据库的,所以我们要改GRAM的工作环境,把工作台 主机改为xx1.com,协议改为https。

注意,下面这一步是错误的,我故意把它挂上来,提醒大家。我是root用户执行的这个命令,虽然安装成功了,但是启动的时候会出错。
[root@xx2 ~]# $GLOBUS_LOCATION/setup/globus/setup-gram-service-common --staging-host=xx1.com --staging-protocol=https
Running /usr/local/globus/setup/globus/setup-gram-service-common
Determining system information...
Buildfile: /usr/local/globus/setup/globus/build-gram-service-gar.xml

启动的时候出错了,大家看看,原来是不能读取某个文件了。
[root@xx2 globus_wsrf_core]# su - globus -c /usr/local/globus/bin/globus-start-container
Failed to start container: Container failed to initialize [Caused by: Failed to read '/usr/local/globus/etc/gram-service/jndi-config.xml' JNDI configuration file]


幸亏我用的是图形界面,可以翻滚回去,我看看执行安装命令都装了什么东西。

Running /usr/local/globus/setup/globus/setup-gram-service-common
Determining system information...
Buildfile: /usr/local/globus/setup/globus/build-gram-service-gar.xml

generateConfig:
   [delete] Deleting directory /usr/local/globus/tmp/gram-service
    [mkdir] Created dir: /usr/local/globus/tmp/gram-service
     [copy] Copying 1 file to /usr/local/globus/tmp/gram-service
    [mkdir] Created dir: /usr/local/globus/tmp/gram-service/etc
     [echo] Checking for existence of file /usr/local/globus/etc/gram-service/globus_gram_fs_map_config.xml

其中

   [delete] Deleting directory /usr/local/globus/tmp/gram-service
    [mkdir] Created dir: /usr/local/globus/tmp/gram-service

说明了,这个gram-service文件夹应该是新建的,应该是root的属主,我看一下

[root@xx2 gram-service]# ls -la
total 32
drwxr-xr-x  4 root   root    4096 Jul 13 22:00 .
drwxr-xr-x  5 globus globus  4096 Jul 13 22:01 ..
-rw-r--r--  1 root   root   11318 Jul 13 22:00 deploy-jndi-config-deploy.xml
drwxr-xr-x  2 root   root    4096 Jul 13 22:00 etc
-rw-r--r--  1 root   root    1592 Jul 13 22:00 gram-service.gar
drwxr-xr-x  2 root   root    4096 Jul 13 22:00 lib

果真,还真是root的,时间上也对着,现在晚上刚刚10点钟。

这样就明白了,globus用户启动容器,会出现有些文件没有权限读取,

算了,死马当活马医吧,我先删除了子节点上的/usr/local/globus/tmp/gram-service再说,

然后再换作globus用户执行
[globus@xx2 ~]$ $GLOBUS_LOCATION/setup/globus/setup-gram-service-common --staging-host=xxl.com --staging-protocol=https

成功之后,我再启动容器,已经不对GRAM进行报错了,却仍然对RFT进行报错。


我们就仔细思考了,网格是依靠RFT(Reliable File Transfer)进行一些夸平台作业的,现在我们在子节点xx2.com上,并没有安装RFT运行所依赖的postgresql,虽然我们在上一步,已 经执行了把平台作业的主机设为xx1.com,但是我们就像当初,我们配置主机xx1.com一样,postgresql数据库默认只有本地主机 127.0.0.1可以连接。
然而,我们的每个节点都有自己的IP,所以我们必须在安装有postgresql的主机上进行相应设计,使得postgresql数据库允许从其它地方访问。

进入相应目录
[root@xx1 data]# pwd
/usr/local/pgsql/data

修改相应的文件,把xx2.com的IP添加到信任区域。
[root@xx1 data]# tail pg_hba.conf
# "local" is for Unix domain socket connections only
local   all         all                               trust
# IPv4 local connections:
host    all         all         127.0.0.1/32          trust
# IPv6 local connections:
host    all         all         ::1/128               trust
# IPv4 local connections:
host    all         all         211.67.141.181/32     trust
# IPv4 local connections:
host    all         all         211.67.141.189/32     trust

关掉xx2.com的容器,再次启动容器,发现仍然有错误,xx2.com的容器,默认的RFT仍然是自己说
ReliableFileTransferFactoryService
服务失败或者找不到。

我们想,肯定是那个配置文件出了错误,应该连到xx1.com却连到了xx2.com。
那配置文件一般都在etc目录下面,我们进入$globus_location/etc下,一看,果真有rft字样的文件夹,
不管三七二十一,进入

[root@xx2 globus_wsrf_rft]# pwd
/usr/local/globus/etc/globus_wsrf_rft

看看都有什么?
[root@xx2 globus_wsrf_rft]# ls
factory-security-config.xml  registration.xml     server-config.wsdd
jndi-config.xml              security-config.xml

一个一个找吧,我最后找到了应该修改的配置文件
[root@xx2 globus_wsrf_rft]# vi jndi-config.xml
找到其中一段

           
               
                connectionString
               

               
                jdbc:postgresql://xx2.com/rftDatabase
               

           

哈哈,明白了吧,数据库连接出错了。把它改成xx1就好了。
修改后,该是jdbc:postgresql://xx1.com/rftDatabase。

到这里,细心的朋友会问,数据库连接不是有帐号密码吗?不要急,大家接着往下找,结果又发现了两段
           
               
                userName
               

               
                globus
               

           

           
               
                password
               

               
                foo
               

           

哦,帐号密码都有了啊。大家还记得,我们配置第一台服务器的时候,创建了一个数据库rftDatabase,它的用户就是globus,密码是foo啊?
为何默认的是这样?我对postgresql了解不是很深,希望大家能告诉我。

好了,我们重启xx2.com上的容器,这下没有问题了。白天,在实验室憋了一天,已经凌晨了,就写道这里吧,受不了了。
阅读(1517) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~