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).
myhome.jp:gxp% python gxp.py GXP[1/1/1]
GXP[1/1/1] % e hostname myhome.jp 0.014 sec
まず前提条件として,ホームノードから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
もっと大量のノードを使いたい場合,原理的には,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秒程度である.
以上に要した設定はファイルに書いておくことが出来る.シェルスクリプトと 同様,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-keygen -f ~/.ssh/id_dsa -p
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と答える.
これらのコマンドラインはカスタマイズ可能で,気に入らなければ修正したり
新しいコマンドを追加することも可能である.
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...
これがデフォルトの設定である.
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を実行すれば, 新しく設定したコマンドラインが実行される.