GXP Grid/Cluster Shell Quick Manual

English page.

Download

cvs -d :pserver:anonymous@newcamel.logos.ic.i.u-tokyo.ac.jp:/var/lib/cvs login
cvs -d :pserver:anonymous@newcamel.logos.ic.i.u-tokyo.ac.jp:/var/lib/cvs co gxp
または, こちら (version 2.0.4).

マニュアル

こちら

GXPの論文

Kenjiro Taura. GXP : An Interactive Shell for the Grid Environment. International Workshop on Innovative Architecture for Future Generation High-Performance Processors and Systems

使用例

デモビデオ(.wmv)も参照
  1. 適当なホスト(myhome.jpとする)でpython gxp.pyで起動すると,プロンプ トGXP[1/1/1]が出る.
    myhome.jp:gxp% python gxp.py
    GXP[1/1/1]
    
  2. この時点で,起動したホスト(ホームノード)でコマンド実行が出来るよう になっている.
    GXP[1/1/1] % e hostname
    myhome.jp
    0.014 sec
    
  3. 他のノードを獲得するのにもコマンドを使う.ここでは例として,ホーム ノードの他にもう一つのノード(abc.def.comとする)を使う 場合を考える.

    まず前提条件として,ホームノードからabc.def.comへ,sshでパスフレー ズを聞かれずにログインできる状態にしておく(どうやって? ).そのもとで,以下のようにする.

    GXP[1/1/1] % edges -> abc.def.com
    GXP[1/1/1] % explore 
    

    以下で各コマンドの意味について説明する

    edgesコマンドは,あるノード(の集合)から別のノード(の集合)へ,sshな ど(デフォルトではssh.追加することが可能)のコマンドで,直接ログイン 可能であることをGXPに教える.それと同時に,abc.def.com というホストを 用いたいと言うこともGXPに教えている.-> の左側を省略した場合,それは ホームノードを意味する.したがって今の場合,上記は

    GXP[1/1/1] % edges myhome.jp -> abc.def.com
    

    とも書ける.この時点では実際のログインは行われていない.つぎの exploreコマンドが実際にそれを行うのだが,その前に,show planコマンドを 実行すると,どのようなログインが試みられるかが表示される.

    GXP[1/1/1] % show plan
    myhome.jp
     -> abc.def.com
    

    これは,myhome.jpからabc.def.comへログインが試みられることを示している. では実際にexploreを実行してみよう.

    GXP[1/1/1] % explore
    myhome.jp : explore reached
    myhome.jp : fast path to run GXP on abc.def.com
    myhome.jp : bringing up server on abc.def.com
    myhome.jp : my pid = 23293, child pid = 23294
    myhome.jp : fast path to run GXP on abc.def.com failed, 
     follow slower path
    myhome.jp : selecting remote shell for abc.def.com
    myhome.jp : pid=23295 : ssh -q -o 'ForwardAgent yes' -o
     'BatchMode yes' -o 'StrictHostKeyChecking no' tau@abc.def.com 'echo hello'
    myhome.jp : abc.def.com reachable via remote shell open_ssh (0.40)
    myhome.jp : checking python for abc.def.com
    myhome.jp : multiplying GXP on abc.def.com
    myhome.jp : bringing up server on abc.def.com
    myhome.jp : my pid = 23293, child pid = 23299
    myhome.jp : GXP installed for abc.def.com
    abc.def.com : explore reached
    abc.def.com : explore finished
    myhome.jp : explore finished
    6.757 sec
    GXP[2/2/2] % 
    

    現在のところ,exploreは何が行われているかを詳細に表示するようになって いる.ログインに必要なステップ,ログインにかかる時間は環境や条件によっ て大きく異なる.一般的に言って,LAN内でホームディレクトリを共有してい るようなノード間では高速(数秒)だが,そうでない場合時間(5秒から20秒程度) かかる.LANをまたぐノードにログインする際には,GXP自身のインストールな どが行われるためである.インストールは,ホームディレクトリの下に ./gxp_tmpというディレクトリが作られてその下に行われる.これは作業ディレ クトリであり,gxpが走っていないときはディレクトリごと,いつ消してもか まわない.

    exploreコマンドが無事終了すると,プロンプトが,GXP[2/2/2] % となる. 以降eコマンドで実行されたコマンドは,myhome.jpとabc.def.com の両方で実 行されるようになる.

    GXP[2/2/2] % e hostname
    myhome.jp
    abc.def.com
    0.014 sec
    
  4. もっと大量のノードを使いたい場合,原理的には,edgesコマンドによっ てどんどん使いたいノードを追加して,exploreを実行すればよいのだが,そ れでは手間がかかる.そのためにGXPは,到達したノードの近隣ノード名を自 動的に獲得する仕組みと,その中からホスト名をパターンマッチによって指定 する機能によって,この手間を軽減している.まず,前者についてみるために, show allコマンドを実行してみよう.

    GXP[2/2/2] % show all
    myhome.jp
    yourhome.jp
    ...
    abc.def.com
    abc001.def.com
    abc002.def.com
    abc003.def.com
    ...
    
    0.005 sec
    GXP[2/2/2] % 
    

    これはGXPが現在「知っている」ホスト名を表示している.

    なんと表示されるかは環境によって異なるが,myhome.jpならびにabc.def.com においてNIS検索(ypcat hosts)を行うことで得られる名前が並んでいる.クラ スタなどでは,全ノードが同一NISドメインで運用されていることが多いので, 多くの場合クラスタの一ノードにログインすれば,クラスタ内の全ホスト名が 得られる.

    それにはやはり、edgesコマンドを実行すればよく、この際に パターンを用いることができる。

    GXP[2/2/2] edges abc** -> abc**
    

    とする.**は,. (ピリオド)を含めたすべての文字の列にマッチし、 パターンマッチ対象として、知っているホストの集合を用いる。 実はこのコマンドは以下のように略記もできる。

    GXP[2/2/2] cluster abc**
    

    もちろんこれは事実でなくてはならない.つまり,abcクラスタ内のノード間 でパスフレーズ入力無しログインが可能ではなくてはならない( どうやって?).

    これは,abc** にマッチする任意のホストから,abc** にマッチする任意のホ ストへログインが「可能」であることを示している. これで準備完了.exploreとはやる気持ちを押させてまずは,show planによって 確認しよう.

    GXP[2/2/2] % show plan
    myhome.jp
     --> abc.def.com
      --> abc01.def.com
       --> abc06.def.com
        --> abc31.def.com
        --> abc32.def.com
        --> abc33.def.com
        --> abc34.def.com
        --> abc35.def.com
       --> abc07.def.com
        --> abc36.def.com
        --> abc37.def.com
        --> abc38.def.com
        --> abc39.def.com
        --> abc40.def.com
       --> abc08.def.com
        --> abc41.def.com
        --> abc42.def.com
        --> abc43.def.com
        --> abc44.def.com
        --> abc45.def.com
       --> abc09.def.com
        --> abc46.def.com
        --> abc47.def.com
        --> abc48.def.com
        --> abc49.def.com
        --> abc50.def.com
       --> abc10.def.com
        --> abc51.def.com
        --> abc52.def.com
        --> abc53.def.com
        --> abc54.def.com
        --> abc55.def.com
      --> abc02.def.com
       --> abc11.def.com
        --> abc56.def.com
        --> abc57.def.com
        --> abc58.def.com
        --> abc59.def.com
        --> abc60.def.com
       --> abc12.def.com
        --> abc61.def.com
        --> abc62.def.com
        --> abc63.def.com
        --> abc64.def.com
       --> abc13.def.com
       --> abc14.def.com
       --> abc15.def.com
      --> abc03.def.com
       --> abc16.def.com
       --> abc17.def.com
       --> abc18.def.com
       --> abc19.def.com
       --> abc20.def.com
      --> abc04.def.com
       --> abc21.def.com
       --> abc22.def.com
       --> abc23.def.com
       --> abc24.def.com
       --> abc25.def.com
      --> abc05.def.com
       --> abc26.def.com
       --> abc27.def.com
       --> abc28.def.com
       --> abc29.def.com
       --> abc30.def.com
    0.019 sec
    GXP[2/2/2] % 
    

    ここでexploreを実行すれば,上記のパスにしたがってログインが試みられ る.多くの場合クラスタ内の多数ノードへのログインにはさほど時間がかから ない.理由は,ログインは,樹状にかつ並列に試みられること,クラスタのノー ド間でホームディレクトリが共有されていればGXPをインストールするステッ プが省略されること,クラスタ内ではたいがいの場合ネットワークが高速であ ること,などである.筆者のGigabit Ethernet環境では,64ノードへの explore にかかる時間は10秒程度である.

Config Fileが書きたい?

以上に要した設定はファイルに書いておくことが出来る.シェルスクリプトと 同様,configurationのための特別な文法はなく,単にシェルに投入する コマンドを並べるだけでよい.今の場合,以下を書いておくと良い.

edges -> abc.def.com
cluster abc**
その上で,rコマンドを用いてファイルの内容を実行する.
GXP[1/1/1] % r file名

その上で,exploreを2度実行すれば,一度目でabc.def.comに到達し, もう一度でabc000.def.com, ... らに到達するだろう. このファイルを、~/.gxprcという名前で書いておくと、GXPの起動時に 自動的に実行されるようになる。

その他のコマンド

詳しくは現在執筆中のマニュアルを(将来)参照してください.

SSHでパスフレーズ無しのログイン

3つの方法がある.
  1. sshのpublic key認証を設定.シェルでeval `ssh-agent`とssh-addを用いて, 自分のキーのパスフレーズを一度打ち込んでおく.その後にgxpを同じシェルで 起動すればよい.
  2. sshのpublic key認証を設定.その際に,パスフレーズを空にしておけば よい.危ないと言う人もいる.それは自分のファイルシステムがどのくらい危 ないかによる.既存のキーのパスフレーズは,ssh-keygenの-pで 設定できる.e.g.,
    ssh-keygen -f ~/.ssh/id_dsa -p
    
  3. sshのhostベース認証を用いて特定のホスト間ではユーザ認証を不要にする. 管理者がsshをそのように設定しておかねばならない.

GXPでは各ノード間のログインに以下のコマンドラインを用いる.

ssh -q -o 'ForwardAgent yes' -o 'BatchMode yes' -o 'StrictHostKeyChecking no' 
user@host ...

'ForwardAgent yes'によって,1の方法を用いた場合でも,リモートノード間 での認証でいちいちパスワードを聞かれないようになる. 'StrictHostKeyChecking no'は初めてのノード間でログインが行われた際にssh が表示する,

The authenticity of host 'XXX' can't be established.
RSA key fingerprint is a5:7b:86:97:f1:ad:06:40:37:ff:82:f3:9d:c7:10:97.
Are you sure you want to continue connecting (yes/no)? 

というメッセージを抑制し,これに自動的にyesと答える.
これらのコマンドラインはカスタマイズ可能で,気に入らなければ修正したり 新しいコマンドを追加することも可能である.

SSHを呼び出す際のパラメータ変更方法

以下を行なっているデモはこちら.
  1. show rcmd HOST
    
    で,HOSTにログインする際にどのようなコマンドが実行されるかが表示される。 例:
    GXP[1/1/1] show rcmd newcamel
    ssh -q -o 'ForwardAgent yes' -o 'BatchMode yes' 
     -o 'StrictHostKeyChecking no' tau@newcamel cmd...
    

    これがデフォルトの設定である.

  2. これをeditするのにはrshellコマンドを使う
    rshell rshell名 テンプレート
    

    rshell名は,デフォルトで使うものには open_ssh という名前がついている (わかりにくい!)また,デフォルトのテンプレートは,

    ssh -q -o 'ForwardAgent yes' -o 'BatchMode yes'
     -o 'StrictHostKeyChecking no' %user%@%host% %cmd%
    

    と言う風に設定されている.ここで,%user% はユーザ名に置換され,%host% はホスト名に置換され,%cmd%は実行されるコマンドに置換される.

    単純な場合としてどんなホストについても当てはまるオプション(例 -p 2000) を加えたければ,

    GXP[1/1/1] % rshell open_ssh ssh -p 2000 -q -o 'ForwardAgent yes'
     -o 'BatchMode yes' -o 'StrictHostKeyChecking no' %user%@%host% %cmd%
    

    としてしまえばよい.ホストごとにオプションを変えたい場合は,テンプレー ト内に変数(%...% が変数の記法)を書いておき,それをどのように置換するか のルールを,set コマンドと言うコマンドで別途指定する.

    たとえば, gsihost というホストへのログインだけ, -p 2000 を指定し, その他のホストへは, -p 22 でいいという場合は,

    GXP[1/1/1] % rshell open_ssh ssh -p %port% -q -o 'ForwardAgent yes'
     -o 'BatchMode yes' -o 'StrictHostKeyChecking no' %user%@%host% %cmd%
    

    とした上で,port をどのように置換するかを指定する.それには,

    GXP[1/1/1] % set port=使いたい番号 ホストのパターン
    

    のようにする.たとえば,

    # ------------ デフォルトは22 ------------
    GXP[1/1/1] % set port=22 ** 
    # ------------ gsihostは2000 ------------
    GXP[1/1/1] % set port=2000 gsihost
    

    とする. ひとつめは, パターン**に当てはまるホスト(つまりすべて) に22を 用いることを言っている. 二つめは, パターンgsihostに当てはまるホスト(つ まりgsihost) に2000を用いることを言っている. 複数のルールに当てはまる ホストについては後で加えたルールが前のものを上書きする. よってgsihost には後者が用いられる.あとは,

    GXP[1/1/1] % show rcmd not_gsihost
    GXP[1/1/1] % show rcmd gsihost
    

    などとして,実行前に確認してみると良い.この準備の上で exploreを実行すれば, 新しく設定したコマンドラインが実行される.