藤澤
徹
![]() |
今回パッケージにしてみるソフトウェアは東京大学近山・田浦研究室で開発されているグリッド用の MPI ライブラリである MC-MPI, および MC-MPI を動作させるのに必要となる, 同じく近山・田浦研究室で開発されている並列分散シェルの GXP の 2 つです.
ソフトウェアをパッケージにするには, そのソフトウェアの構成と特徴をよく理解する必要があります. 以下にそれぞれのソフ トウェアの特徴のうち, パッケージを作る際に関係のありそうな事を並べます.
MC-MPI は主に C 言語で記述されたコンパイラとライブラリによって構成されています. また, 一部に Fortran のコードも 含まれており, Fortran インターフェースも持っていますが, これはオブションによりオフにする事もでき ます.
Autotools を使用しており, ./configure && make && make installという見慣れたコマンドによってビルド, インス トールする事ができます.
GXP は Python で記述されたコマンドと, そのコマンドが必要とする Python モジュールによって構成されてい ます.
インストールする, という作業は想定されておらず, ダウンロードして展開して出てきたディレクトリをどこかに置き, そこに パスを通して使うように作られています.
Debian のパッケージを作成する方法にはいくつかあるらしいのですが, 今回は debhelper を使用してみます.
とりあえずは自分の環境で動く事を確かめるため, パッケージとは関係なく使ってみます.
MC-MPI は GXP を必要とするので, まず GXP から試してみましょう.
以下のサイトから執筆時点で最新版であるgxp-3.05.tar.bz2をダウンロードし, 展開します.
$ mkdir gxp
$ cd gxp $ # なんとかして gxp-3.05.tar.bz2 を持ってくる $ tar jxvf gxp-3.05.tar.bz2 $ cd gxp-3.05 |
さて, GXP はインストール不要なので, このままでも動きます. GXP の制御は全てgxpcコマンドで行い ます.
$ ./gxpc
gxpc: no daemon found, create one /tmp/gxp-***-default/gxpsession-***-***-2009-03-20-06-46-07-15360-92311801 |
問題なく動いているようです.
以下のサイトから執筆時点で最新版であるmcmpi-0.21.0.tar.gzをダウンロードし, 展開します.
$ mkdir mcmpi
$ cd mcmpi $ # なんとかして mcmpi-0.21.0.tar.gz を持ってくる $ tar zxvf mcmpi-0.21.0.tar.gz $ cd mcmpi-0.21.0 |
前述のとおり, Autotools を使用しているので以下の見慣れたコマンドを打ちます.
$ ./configure
$ make $ sudo make install |
サンプルプログラムが付属しているので, これをmpicxxでコンパイルしてみます.
$ cd app
$ mpicxx -o hello ./hello.cpp printf: 28: %q: invalid directive printf: 28: %q: invalid directive printf: 28: %q: invalid directive [ g++ -I/usr/local/include /usr/local/lib/libmpigxp.a -lresolv -lpthread -lnsl -lm ] /usr/lib/gcc/i486-linux-gnu/4.3.2/../../../../lib/crt1.o: In function ‘_start’: (.text+0x18): undefined reference to ‘main’ collect2: ld はステータス 1 で終了しました |
おや, 動かないようです. 調べてみたところどうやら%qは使えない事もあるようです. これは文字列を必要ならばクォートす るという指定子なので (おそらく), サクッと\"%s\"に置き換えてしまいます. util以下のmpicc.in, mpicxx.in, mpif77.inに修正を加え, ビルドし直します.
$ cd ..
$ make distclean $ ./configure $ make $ sudo make install |
さて改めてコンパイルします.
$ cd app
$ mpicxx -o hello ./hello.cpp [ g++ -I/usr/local/include "-o" "hello" "./hello.cpp" /usr/local/lib/libmpigxp.a -lresolv -lpthread -lnsl -lm ] |
今度は上手くいったようです. では実行してみましょう. まず GXP でlocalhostのみのクラスタを指定し, カレントディレ クトリに移動します. そこでmpirunによって実行を開始します.
$ gxpc
$ gxpc use ssh localhost $ gxpc explore localhost $ gxpc cd ‘pwd‘ $ mpirun -np 1 ./hello /usr/local/bin/mpirun: 157: Bad substitution |
おや, またしても失敗です. 該当行を見ても
done
|
と, よく分からない感じですが, よく調べてみると
if [ "$CONF_OPT" == "" -o "${CONF_OPT:0:1}" == "#" ] ; then
|
の行で落ちています.
${CONF_OPT:0:1}という書き方は Bash では動きますが POSIX Shell では動かないようなので, とりあえず Bash で動か すように変更してしまいます.
$ cd ..
$ make distclean $ ./configure $ make $ sudo make install |
では改めて実行しましょう.
$ cd app
$ mpirun -np 1 ./hello INFO: _exchange_end_points: 42498 INFO: _measure_latencies: 23884 INFO: _create_bounding_graph: 26520 INFO: _create_routing_table: 57663 INFO: _create_spanning_tree: 20144 INFO: Env_Init: 172304 Hello 0/1 |
今度こそ見事動きました.
まずは MC-MPI のパッケージを作成します.
とりあえずさっきとは別のディレクトリで作業をしたほうが良さそうです.
$ mkdir deb_mcmpi
$ cd deb_mcmpi $ # なんとかして mcmpi-0.21.0.tar.gz を持ってくる $ tar zxvf mcmpi-0.21.0.tar.gz $ cd mcmpi-0.21.0 |
ここでさっきのバグの修正を加えておきます.
MC-MPI では自身のバージョンを/usr/etc/VERSIONに記述する事になっているのですが, これはビミョーなので /usr/share/mcmpi/VERSIONあたりに変更しておきます. 変更するファイルは以下のとおりです.
パッケージを作成する場合にはソフトウェア本体はもちろんの事, インストール方法や依存関係等, そのパッケージの情報を記 述したファイルが必要になります.
dh_makeコマンドを使用するとこれらを記述するためのファイルの雛形を作成してくれます. この際, DEBFULLNAME, DEBEMAIL変数により作者情報を指定できます. この名前, メールアドレスが GPG の鍵の情報と一致しないと作成したパッ ケージにサインできないので困ります.
$ export DEBFULLNAME="Tooru Fujisawa"
$ export DEBEMAIL="arai_a@mac.com" $ dh_make -e arai_a@mac.com -f ../mcmpi-0.21.0.tar.gz Type of package: single binary, multiple binary, library, kernel module or cdbs? [s/m/l/k/b] > s Maintainer name : Tooru Fujisawa Email-Address : arai_a@mac.com Date : Fri, 20 Mar 2009 06:55:00 +0900 Package Name : mcmpi Version : 0.21.0 License : blank Using dpatch : no Type of Package : Multi-Binary Hit <enter> to confirm: > [ENTER] |
途中でType of packageと聞かれます. MC-MPI はライブラリも含みますが, メインはコンパイラ等なのでとりあえず single binaryを選んでおけばよさそうです.
さて, さきほどのdh_makeによって, debianというディレクトリが作成され, この中にいろいろなファイルが並んでい ます.
この中で重要なのは次のものです.
順番に修正していきましょう.
changelog
これはパッケージの更新履歴です. ソフトウェア本体の更新履歴とは別モノです. とりあえず雛形に沿って以下のようにして おきます.
mcmpi (0.21.0-1) unstable; urgency=low
* Initial release -- Tooru Fujisawa <arai_a@mac.com> Fri, 20 Mar 2009 06:55:00 +0900 |
copyright
これはソフトウェアの著作権情報を記述するファイルです. 雛形に沿ってダウンロード元, 元々の作者, ライセンス等を記述し ます.
This package was debianized by Tooru Fujisawa <arai_a@mac.com> on
Fri, 20 Mar 2009 06:55:00 +0900. It was downloaded from http://www.logos.ic.i.u-tokyo.ac.jp/~h_saito/mcmpi/ Upstream Author(s): Hideo Saito <h_saito@logos.ic.i.u-tokyo.ac.jp> Copyright: (c) 2007 Hideo Saito. All Rights Reserved. License: GPL Version 2 The Debian packaging is (C) 2009, Tooru Fujisawa <arai_a@mac.com> and is licensed under the GPL, see ‘/usr/share/common-licenses/GPL’. |
dirs
これはパッケージ作成時に自動的に作成してほしいディレクトリを記述するファイルです. デフォルトではusr/binと usr/sbinが入っていますが, usr/sbinは要らないので削除してしまいます. また, VERSIONをusr/share/mcmpiにコピー するようにしたのでこれを追加します.
usr/bin
usr/share/mcmpi |
control
これはパッケージの依存関係や説明を記述するファイルです.
雛形通りに進むと, まずHomepageにダウンロード元を書き, Dependsに次に作成するgxpを追加しておきます. また, バグ 修正の際に Bash を使用する事にしたのでbashも追加します. 最後に説明を短いものと長いものと書いておき ます.
Source: mcmpi
Subsection: unknown Priority: extra Maintainer: Tooru Fujisawa <arai_a@mac.com> Build-Depends: debhelper (>= 7), autotools-dev Standards-Version: 3.7.3 Homepage: http://www.logos.ic.i.u-tokyo.ac.jp/~h_saito/mcmpi/ Package: mcmpi Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} bash gxp Description: Grid-enabled implementation of MPI MC-MPI is a Grid-enabled implementation of MPI, developed by Hideo Saito at the University of Tokyo. Its main features include the following: - [Firewall and NAT traversal]: MC-MPI constructs an overlay network, allowing nodes behind firewalls and nodes without global IP addresses to participate in computations. There is no need to perform maual configuration; MC-MPI automatically probes connectivity, selects which connections to establish, and performs routing. - [Locality-aware connection management]: Establishing too many connections, especially wide-area connections, results in many problems, including but not limited to the follwing: exhaustion of system resources (e.g., file descriptors, memory), high message reception overhead, and congestion between clusters during all-to-all communication. Therefore, MC-MPI limits the number of connections that are established. If we assume, for simplicity, that n processes are distributed equally among c clusters, then at most O(log n) connections are established by each process and at most O(n log c) connections are established between clusters. As MC-MPI uses a lazy connect strategy, fewer connections are established for applications in which few process pairs communicate. The maximum number of connections allowed can be controlled by passing the -beta option to mpirun (see Subsection 3). - [Locality-aware rank assignment]: Temporarily disabled in this version. |
rule
これはビルドやパッケージの方法を記述するMakefileです. MC-MPI の場合には Autotools を使っているので得に変える 所は無いハズです. (実はありますがそれは後述...)
準備が出来たらdebuildコマンドでパッケージを作成します. ソースパッケージとバイナリパッケージの両方を作ってみ ます.
まずはソースパッケージです.
$ debuild -S
|
小人さんが頑張ってくれた後, サインをするためのパスフレーズを聞いてくるので 2 回くらい入力します.
するとソースパッケージの完成です. 上のディレクトリに色々出来ています.
さて, 続いてバイナリパッケージです.
$ debuild
|
configure, makeなんかが走っている様子が流れていきます.
fortran/.libs/libfortran.a(farg.o): In function ‘mpigxp_getarg’:
*/deb_mcmpi/mcmpi-0.21.0/src/fortran/farg.f:9: undefined reference to ‘_gfortran_getarg_i4’ fortran/.libs/libfortran.a(farg.o): In function ‘mpigxp_iargc’: */deb_mcmpi/mcmpi-0.21.0/src/fortran/farg.f:2: undefined reference to ‘_gfortran_iargc’ fortran/.libs/libfortran.a(initf.o): In function ‘mpi_init__’: */deb_mcmpi/mcmpi-0.21.0/src/fortran/initf.c:16: undefined reference to ‘mpigxp_iargc__’ */deb_mcmpi/mcmpi-0.21.0/src/fortran/initf.c:20: undefined reference to ‘mpigxp_getarg__’ collect2: ld returned 1 exit status |
超怒られました. しかも私の知らない Fortran のコードです. 調べてみたところ, この関数は処理系によっては勝手に作られ るものだそうで, gFortran は作らないようです. 解決する方法が分からないので, ここはいさぎよく Fortran インターフェース を無効にして作り直しましょう.
debian/ruleファイルの中で, ./configureしてる行に--disable-f77を追加します
./configure $(CROSS) --prefix=/usr --mandir=\$${prefix}/share/man --infodir=\$${prefix}/share/info \
CFLAGS="$(CFLAGS)" LDFLAGS="-Wl,-z,defs" --disable-f77 |
改めてビルドします.
$ debuild
... /usr/bin/install -c -d /usr/etc /usr/bin/install: ‘/usr/etc’ の属性を変更できません: No such file or directory |
またまた怒られました. debuild はdebian/mcmpi/以下にソフトウェアをインストールしてパッケージにするハズなのに, 外にインストールしようとしています. これはruleファイルからディレクトリをDESTDIRとして渡しているのに, Makefile の方が対応していないためです.
etc/Makefile.in, util/Makefile.in, の中でprefixにDESTDIRを追加します.
prefix = $(DESTDIR)@prefix@
|
$ debuild
|
今度は成功しました.
上のディレクトリにmcmpi_0.21.0-1_i386.debが出来ています.
依存関係が正しいかどうか, インストールしてみましょう.
$ cd ..
$ sudo dpkg -i mcmpi_0.21.0-1_i386.deb 未選択パッケージ mcmpi を選択しています。 (データベースを読み込んでいます ... 現在 219582 個のファイルとディレクトリがインストールされています。 ) (mcmpi_0.21.0-1_i386.deb から) mcmpi を展開しています... dpkg: 依存関係の問題により mcmpi の設定ができません: mcmpi は以下に依存 (depends) します: gxp ... しかし: パッケージ gxp はまだインストールされていません。 dpkg: mcmpi の処理中にエラーが発生しました (--install): 依存関係の問題 - 設定を見送ります 以 下 の パ ッケ ー ジ の 処 理 中 に エ ラ ー が 発 生しました : mcmpi |
gxpが無いと言われました. 予定通り作成できているようです. とりあえず削除しておきます.
$ sudo apt-get remove --purge mcmpi
|
さて, 無いと言われた GXP パッケージの方を作ります.
こちらもさっきとは別のディレクトリで作業をします. ただし今回, 作業を開始した時点では 3.03 が最新バージョンだったの で, バージョンアップのテストも兼ねて 3.03 のパッケージをまず作ります.
$ mkdir deb_gxp
$ cd deb_gxp $ # なんとかして gxp-3.03.tar.bz2 を持ってくる $ tar jxvf gxp-3.03.tar.bz2 $ cd gxp-3.03 |
ほぼ同様です.
$ export DEBFULLNAME="Tooru Fujisawa"
$ export DEBEMAIL="arai_a@mac.com" $ dh_make -e arai_a@mac.com -f ../gxp-3.03.tar.bz2 Type of package: single binary, multiple binary, library, kernel module or cdbs? [s/m/l/k/b] > s Maintainer name : Tooru Fujisawa Email-Address : arai_a@mac.com Date : Fri, 20 Mar 2009 07:15:35 +0900 Package Name : gxp Version : 3.03 License : blank Using dpatch : no Type of Package : Single Hit <enter> to confirm: > [ENTER] |
GXP は外から見ればコマンド 1 つなので, これもsingle binaryでよさそうです.
さ て , これらを記述する前に考えなければならない事があります. GXP はインストールを想定されていないため, パッケージに した場合にどこに置いてどのように使うかを決めなければいけません.
今回は/usr/share/gxp以下にファイルをコピーし, /usr/bin/gxpcを/usr/share/gxp/gxpcにリンクする事にし ます.
changelog
特に変わった事はしません.
gxp (3.03-1) unstable; urgency=low
* Initial release -- Tooru Fujisawa <arai_a@mac.com> Fri, 20 Mar 2009 07:15:35 +0900 |
copyright
こちらも特に変わった事はしません.
This package was debianized by Tooru Fujisawa <arai_a@mac.com> on
Fri, 20 Mar 2009 07:15:35 +0900. It was downloaded from http://www.logos.t.u-tokyo.ac.jp/gxp/ Upstream Author(s): Dun Nan Kenjiro Taura Yoshikazu Kamoshida Copyright: (c) 2008 by Kenjiro Taura. All rights reserved. (c) 2007 by Kenjiro Taura. All rights reserved. (c) 2006 by Kenjiro Taura. All rights reserved. (c) 2005 by Kenjiro Taura. All rights reserved. License: GPL Version 2 The Debian packaging is (C) 2009, Tooru Fujisawa <arai_a@mac.com> and is licensed under the GPL, see ‘/usr/share/common-licenses/GPL’. |
dirs
さて, GXP はインストーラを持っていないので, インストールのコードは直接ruleに書く事になります. できるだけ作業を 減らしたいので, 必要なディレクトリはこちらに全部書いてしまいましょう.
usr/bin
usr/share usr/share/gxp |
control
GXP は Python のモジュールを内部に持っているので, これらをインストール先でバイトコードにコンパイルしてあげる作 業 を し て あ げ な け れ ば い け ま せ ん . この作業を勝手にしてくれるのがdh_pycentralです. このために, 2 箇所に XS-Python-Version: allを追加します.
また, GXP は環境にアーキテクチャに依存しないので, Architectureをallにします. ただし, 実行に Python が必要に なるのでDependsにpythonを, また前述の作業のためにdh_pycentralが必要になるので, Depends, Build-Dependsに python-centralを追加します.
Source: gxp
Subsection: unknown Priority: extra Maintainer: Tooru Fujisawa <arai_a@mac.com> Build-Depends: debhelper (>= 7) Standards-Version: 3.7.3 XS-Python-Version: all Homepage: http://www.logos.t.u-tokyo.ac.jp/gxp/ Package: gxp Architecture: all Depends: ${shlibs:Depends}, ${misc:Depends}, python XS-Python-Version: all Description: parallel/distributed shell GXP is a parallel/distributed shell, plus a parallel task execution engine that runs your Makefile in parallel on distributed machines. Very easy to install (no need to compile. install it on YOUR machine and use it on ALL machines). |
rule
まず, Makefileが無いので$(MAKE)と入った行は全てコメントアウトします.
そして, $(MAKE) DESTDIR=$(CURDIR)/debian/gxp installの行の後に次のようなインストールのコマンドを追 加します. 展開して出てきたもの全部, としたいのですが, debianディレクトリがあるのでファイルを並べ ます.
cp -r ChangeLog License README doc ex expectd.py gxpbin gxpc gxpc.py gxpd.py gxpm.py ifconfig.py inst_local.py \
inst_remote.py inst_remote_stub.py ioman.py misc mkrelease opt.py $(CURDIR)/debian/gxp/usr/share/gxp ln -s $(CURDIR)/debian/gxp/usr/share/gxp/gxpc $(CURDIR)/debian/gxp/usr/bin/gxpc |
また, dh_pycentralを動かすために, dh_pythonの次の行あたりにdh_pycentralと書いておきます.
# dh_python
dh_pycentral |
まずはソースパッケージを作ります.
$ debuild -S
|
何事もなく完了します.
さ て , 続いてバイナリパッケージです.
$ debuild
... E: gxp: missing-dep-for-interpreter expect => expect (./usr/share/gxp/gxpbin/ssh_passwd) E: gxp: missing-dep-for-interpreter expect => expect (./usr/share/gxp/gxpbin/su_cmd) ... |
途中でエラーが出ています. これはssh_passwd, su_cmdが/usr/bin/expectを使用しているのに, Dependsに入ってい ないという事なので, debian/controlを更新します.
Depends: ${shlibs:Depends}, ${misc:Depends}, python, python-central, expect
|
ではビルドし直します.
$ debuild
|
今度は何事もなく完了し, 上のディレクトリにgxp_3.03-1_all.debができています.
さて, 作業をしている間に GXP の新しいバージョン 3.05 がリリースされたのでこれをパッケージに反映し ます.
debhelper には新しいバージョンのチェック, 更新を自動化するための機構があります. debian/watchファイルに以下のよ うに記述します. (というか, SourceForge なモノは例にあるので拡張子だけ変えます)
version=3
http://sf.net/gxp/gxp-(.*)\.tar\.bz2 |
2 行目が最新バージョンの URL のパターンです. ここから自動的に最新バージョンを探して落としてくれ ます.
$ uscan -verbose
-- Scanning for watchfiles in . -- Found watchfile in ./debian -- In debian/watch, processing watchfile line: http://sf.net/gxp/gxp-(.*)\.tar\.bz2 -- Found the following matching hrefs: /sites/download.sourceforge.net/pub/sourceforge/g/gx/gxp/gxp-3.02.tar.bz2 /sites/download.sourceforge.net/pub/sourceforge/g/gx/gxp/gxp-3.02.tar.bz2 /sites/download.sourceforge.net/pub/sourceforge/g/gx/gxp/gxp-3.03.tar.bz2 /sites/download.sourceforge.net/pub/sourceforge/g/gx/gxp/gxp-3.03.tar.bz2 /sites/download.sourceforge.net/pub/sourceforge/g/gx/gxp/gxp-3.05.tar.bz2 /sites/download.sourceforge.net/pub/sourceforge/g/gx/gxp/gxp-3.05.tar.bz2 Newest version on remote site is 3.05, local version is 3.03 => Newer version available from http://www.mirrorservice.org/sites/download.sourceforge.net/pub/sourceforge/g/gx/gxp/gxp-3.05.tar.bz2 -- Downloading updated package gxp-3.05.tar.bz2 -- Successfully downloaded updated package gxp-3.05.tar.bz2 and symlinked gxp_3.05.orig.tar.bz2 to it -- Scan finished |
と, いう感じで 3.05 がダウンロードされました. これを展開し, 簡単に現在と同じような構成にする事ができ ます.
$ uupdate ../gxp-3.05.tar.bz2
New Release will be 3.05-0ubuntu1. -- Untarring the new sourcecode archive ../gxp-3.05.tar.bz2 Success! The diffs from version 3.03-1 worked fine. Remember: Your current directory is the OLD sourcearchive! Do a "cd ../gxp-3.05" to see the new package $ cd ../gxp-3.05/ |
はて, 何かバージョンがおかしな事になっています. これはdebian/changelogにのみ影響するので, これを書き換えておき ます.
gxp (3.05-1) unstable; urgency=low
* New upstream release -- Tooru Fujisawa <arai_a@mac.com> Fri, 20 Mar 2009 07:32:35 +0900 gxp (3.03-1) unstable; urgency=low * Initial release -- Tooru Fujisawa <arai_a@mac.com> Fri, 20 Mar 2009 07:15:35 +0900 |
あとはビルドし直せば完了です.
$ debuild -S
$ debuild ... E: gxp: ruby-script-but-no-ruby-dep ./usr/share/gxp/gxpbin/tmsub.rb ... |
さて, 今度は Ruby が必要になったようなので, これをdebian/controlに追加します.
Depends: ${shlibs:Depends}, ${misc:Depends}, python, python-central, expect, ruby1.8
|
ではビルドし直します.
$ debuild
|
GXP の方は特別な依存関係は無いのでインストールできるハズです.
$ cd ..
$ sudo dpkg -i gxp_3.05-1_all.deb ... gxp は以下に依存 (depends) します: expect ... しかし: パッケージ expect はまだインストールされていません。 ... |
と思ったらexpectが入ってませんでした.
$ apt-get remove --purge gxp
$ sudo apt-get install expect $ sudo dpkg -i gxp_3.05-1_all.deb 未選択パッケージ gxp を選択しています。 (データベースを読み込んでいます ... 現在 219600 個のファイルとディレクトリがインストールされています。 ) (gxp_3.05-1_all.deb から) gxp を展開しています... gxp (3.05-1) を設定しています ... |
続いて MC-MPI もインストールします.
$ cd ../deb_mcmpi
$ sudo dpkg -i mcmpi_0.21.0-1_i386.deb 未選択パッケージ mcmpi を選択しています。 (データベースを読み込んでいます ... 現在 219699 個のファイルとディレクトリがインストールされています。 ) (mcmpi_0.21.0-1_i386.deb から) mcmpi を展開しています... mcmpi (0.21.0-1) を設定しています ... |
今度は正しくインストールできました.
第 50 回東京エリア Debian 勉強会 2009 年 3 月
____________________________________________________________________________________________