Eucalyptus Advent Calendar 2012 JP 一日目

Walrus だけ使ってみたよ

Eucalyptus Advent Calendar 2012 JP の一日目なので、内容はライトでキャワワな方向で行きます。

いきなり初日からこいつぁ Geek 臭プンプン匂うぜぇ的な内容だと読む人も参加する人もドン引きでしょうから、「Eucalyptus 3.2 の nightly ビルドを入れて Walrus だけ使ってみたぜぇ?」って感じの内容にします。

前説

Eucalyptus には AWS の S3 互換機能を提供する Walrus という名のコンポーネントがあります。この Walrus くん、辞書で索くとセイウチのことだそうです。EC2 互換機能およびソフトウェア名が Eucalyptus なのに何でここでいきなり海の生き物なんですかね?全然関連性がないですよね?

「全然関係ない」と言えば、AWS の API 操作ライブラリの boto、この boto ですが、Wikipedia によるとアマゾンカワイルカの別名らしいです。まぁ、ホント全然関係ないですけどね。(ノ´*ω*`)ノ

で、この Walrus、S3 互換なので「大規模分散オブジェクトストア」じゃないけど一応「オブジェクトストア」の末席に居まして、ってことは「S3 っぽく使っていいんじゃね?」とムクムクとスケベ心が出てくるわけですよ。やったねホーリーナイト! ってことで、「Walrus だけ使ってみるの巻」です。

パッケージのインストール

じゃーさっそく Walrus のインストール。本当は難しいこと全然ないし、Advent Calendar 向けのポストなので細かいことは省いてサクサク書くつもりだったんですが、ちょいちょいハマる可能性があるので、聖なる紳士淑女のために一応実行したコマンドも書きますね。(あ、ntp のインストールと設定は省きますね)

 ## まずはレポジトリ情報をぶち込みます
 # rpm -Uvh http://downloads.eucalyptus.com/software/euca2ools/2.1/centos/5/x86_64/euca2ools-release-2.1.noarch.rpm
 # rpm -Uvh http://downloads.eucalyptus.com/software/eucalyptus/nightly/3.2/centos/5/x86_64/eucalyptus-release-3.2.0.noarch.rpm
 # rpm -Uvh http://downloads.eucalyptus.com/software/eucalyptus/nightly/3.2/centos/5/x86_64/epel-release-5.noarch.rpm
 ## で Walrus のパッケージをインストールします。やったねたえちゃん!
 # yum install eucalyptus-walrus
 Loaded plugins: fastestmirror, security
 Loading mirror speeds from cached hostfile
  * base: ftp.iij.ad.jp
  * epel: ftp.tsukuba.wide.ad.jp
  * extras: ftp.iij.ad.jp
  * updates: ftp.iij.ad.jp
 http://ftp.tsukuba.wide.ad.jp/Linux/fedora/epel/5/x86_64/repodata/163f5e50189c637abd889887c90b8af108cf2ad1-primary.sqlite.bz2: [Errno 14] HTTP Error 404: Not Found
 Trying other mirror.
 http://mirrors.ustc.edu.cn/fedora/epel/5/x86_64/repodata/163f5e50189c637abd889887c90b8af108cf2ad1-primary.sqlite.bz2: [Errno 14] HTTP Error 404: Not Found
 Trying other mirror.
 http://mirrors.ispros.com.bd/fedora-epel/5/x86_64/repodata/163f5e50189c637abd889887c90b8af108cf2ad1-primary.sqlite.bz2: [Errno 14] HTTP Error 404: Not Found
 Trying other mirror.
 Error: failure: repodata/163f5e50189c637abd889887c90b8af108cf2ad1-primary.sqlite.bz2 from epel: [Errno 256] No more mirrors to try.

はい、いきなりエラーですよ。さすがにこれは予想 GUY! まぁ、でもこれはエラーが示すとおり epel の問題です。そう、Eucalyptus は悪くない、Eucalyptus はいつだって味方だった。悪いのは大人達~♪

まぁ、ミラーが伝播されていないので直接指定するしかないよね?ってことで、/etc/yum.repos.d/epel.repo の [epel] をちょいちょいと以下のように直します。

 [epel]
 name=Extra Packages for Enterprise Linux 5 - $basearch
 baseurl=http://ftp.osuosl.org/pub/fedora-epel/5/$basearch
 #mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=epel-5&arch=$basearch
 failovermethod=priority
 enabled=1
 gpgcheck=1
 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL

そして再アターック!

再アタックは問題なく進んでツマらんので経過は割愛…と思ったら Eucalyptus のサイトが激重なのか途中で

 (53/53): eucalyptus-common-java-libs-3.2.0-0 (64%)  5% [=-                                ] 4.1 kB/s | 3.1 MB    208:02 ETA

ってな素敵な遅さです。(☍﹏⁰) ふぇぇ…こんな調子じゃ 121 が終っちゃうよぉぉぉ…

で本当に Eucalyptus のサイトの所為なのか?と思って別環境で上記のファイルをダウンロードしたら10分ぐらいで落せました。どうやら Eucalyptus のサイトが重いだけじゃないみたい。ということで、別環境で落したこのファイルを /var/cache/yum/eucalyptus-release/packages/eucalyptus-common-java-libs-3.2.0-0.0.370.20121201gita8d7a120.el5.x86_64.rpm に配置して最後の一投。(今度こそ割愛)

で、yum install eucalyptus-walrus でインストールされた主な Eucalyptus パッケージは以下です。

 eucalyptus-common-java-3.2.0
 eucalyptus-common-java-libs-3.2.0
 eucalyptus-admin-tools-3.2.0
 eucalyptus-walrus-3.2.0
 eucalyptus-3.2.0
 python26-eucadmin-3.2.0

あぁ…そうか euca2ools は別に必須じゃないのね。まぁ、使うこともないのでわざわざ入れる必要もないか。ハナクソ( ゚┌・・ ゚) ホジホジ♪

DB の初期化

eucalyptus.conf は Walrus 的には不要な(はずな)ので設定せず、おもむろに Walrus の登録をしたいのですが、その前に DB の初期化を行ないます。

 ## DB の初期化
 # euca_conf --initialize
 Initializing a new cloud.  This may take a few minutes.

………

………

………

返ってこない…orz

で、何が起きているのか見てみたく、–debug オプションを指定してみます。

 # euca_conf --debug --initialize
 Initializing a new cloud.  This may take a few minutes.

…… –debug オプション△…orz

仕方がないので euca_conf –initialize の本丸である /usr/lib/python2.6/site-packages/eucadmin/initialize.py の 74 行目付近を以下のように変更し cmd_string の中身を出力させます。

         print 'Initializing a new cloud.  This may take a few minutes.'
         print 'Command: %s' % cmd_string
         cmd = Command(cmd_string)

そんで実行すると以下のように実行しているコマンドが出力されます。

 # euca_conf --debug --initialize
 Initializing a new cloud.  This may take a few minutes.
 Command: //usr/sbin/eucalyptus-cloud -u eucalyptus -h / --initialize --log-level=EXTREME -L console

じゃー、このコマンドを手動で実行してみます。(あぁ、なんか内容がちょっとライトじゃなくなってきた…?)

 # /usr/sbin/eucalyptus-cloud -u eucalyptus -h / --initialize --log-level=EXTREME -L console
 [error:0300]
 ulimit: resource=7 soft=1024 hard=1024
 ulimit: resource=7 soft=65535 hard=65535
 ulimit: resource=6 soft=16383 hard=16383
 ulimit: resource=6 soft=-1 hard=-1
 2012-12-01 17:43:42  INFO 000000001 SystemBootstrapper       SystemBootstrapper.java:116       | Creating Bootstrapper instance.
 2012-12-01 17:43:43  INFO 000000001 root                     Logs.java:184                     | --------------------------------------------------------------------------------
                                                                                                | Starting system with debugging set as: EXTREME
                                                                                                | --------------------------------------------------------------------------------
 2012-12-01 17:43:43  INFO 000000001 Internets                Internets.java:122                | Trying to determine local bind address based on cli (--bind-addr)...
 2012-12-01 17:43:43  INFO 000000001 Internets                Internets.java:127                | Trying to determine local bind address based on the default route...
 2012-12-01 17:43:44  INFO 000000001 Internets                Internets.java:134                | ==> Decided to use local bind address: /180.235.254.76
 2012-12-01 17:43:46  INFO 000000001 DirectoryBootstrapper    BaseRecord.java:173               | bootstrap  SYSTEM_DIR_CHECK :   [NativeMethodAccessorImpl.invoke0.-2] HOME:/
 2012-12-01 17:43:46  INFO 000000001 DirectoryBootstrapper    BaseRecord.java:173               | bootstrap  SYSTEM_DIR_CHECK :   [NativeMethodAccessorImpl.invoke0.-2] VAR://var/lib/eucalyptus
 2012-12-01 17:43:46  INFO 000000001 DirectoryBootstrapper    BaseRecord.java:173               | bootstrap  SYSTEM_DIR_CHECK :   [NativeMethodAccessorImpl.invoke0.-2] CONF://etc/eucalyptus/cloud.d
 2012-12-01 17:43:46  INFO 000000001 DirectoryBootstrapper    BaseRecord.java:173               | bootstrap  SYSTEM_DIR_CHECK :   [NativeMethodAccessorImpl.invoke0.-2] LIB://usr/share/eucalyptus
 2012-12-01 17:43:46  INFO 000000001 DirectoryBootstrapper    BaseRecord.java:173               | bootstrap  SYSTEM_DIR_CHECK :   [NativeMethodAccessorImpl.invoke0.-2] LOG://var/log/eucalyptus
 2012-12-01 17:43:46  INFO 000000001 DirectoryBootstrapper    BaseRecord.java:173               | bootstrap  SYSTEM_DIR_CHECK :   [NativeMethodAccessorImpl.invoke0.-2] RUN://var/run/eucalyptus
 2012-12-01 17:43:46  INFO 000000001 DirectoryBootstrapper    BaseRecord.java:173               | bootstrap  SYSTEM_DIR_CHECK :   [NativeMethodAccessorImpl.invoke0.-2] LIBEXEC://usr/lib/eucalyptus
 2012-12-01 17:43:46  INFO 000000001 DirectoryBootstrapper    BaseRecord.java:173               | bootstrap  SYSTEM_DIR_CHECK :   [NativeMethodAccessorImpl.invoke0.-2] STATE://var/lib/eucalyptus
 2012-12-01 17:43:46  INFO 000000001 DirectoryBootstrapper    BaseRecord.java:173               | bootstrap  SYSTEM_DIR_CHECK :   [NativeMethodAccessorImpl.invoke0.-2] JNI://usr/lib/eucalyptus
 2012-12-01 17:43:46  INFO 000000001 DirectoryBootstrapper    BaseRecord.java:173               | bootstrap  SYSTEM_DIR_CHECK :   [NativeMethodAccessorImpl.invoke0.-2] SYSFAULTS://usr/share/eucalyptus/faults
 chown: changing ownership of `//usr/share/eucalyptus/faults/en_US/common.xml': Operation not permitted
 chown: changing ownership of `//usr/share/eucalyptus/faults/en_US/1002.xml': Operation not permitted
 chown: changing ownership of `//usr/share/eucalyptus/faults/en_US/1001.xml': Operation not permitted
 chown: changing ownership of `//usr/share/eucalyptus/faults/en_US/1004.xml': Operation not permitted
 chown: changing ownership of `//usr/share/eucalyptus/faults/en_US/2002.xml': Operation not permitted
 chown: changing ownership of `//usr/share/eucalyptus/faults/en_US/1010.xml': Operation not permitted
 chown: changing ownership of `//usr/share/eucalyptus/faults/en_US/1005.xml': Operation not permitted
 chown: changing ownership of `//usr/share/eucalyptus/faults/en_US/1008.xml': Operation not permitted
 chown: changing ownership of `//usr/share/eucalyptus/faults/en_US/1003.xml': Operation not permitted
 chown: changing ownership of `//usr/share/eucalyptus/faults/en_US/1009.xml': Operation not permitted
 chown: changing ownership of `//usr/share/eucalyptus/faults/en_US/2001.xml': Operation not permitted
 chown: changing ownership of `//usr/share/eucalyptus/faults/en_US/2000.xml': Operation not permitted
 chown: changing ownership of `//usr/share/eucalyptus/faults/en_US': Operation not permitted
 chown: changing ownership of `//usr/share/eucalyptus/faults': Operation not permitted
 chgrp: changing group of `//usr/share/eucalyptus/faults/en_US/common.xml': Operation not permitted
 chgrp: changing group of `//usr/share/eucalyptus/faults/en_US/1002.xml': Operation not permitted
 chgrp: changing group of `//usr/share/eucalyptus/faults/en_US/1001.xml': Operation not permitted
 chgrp: changing group of `//usr/share/eucalyptus/faults/en_US/1004.xml': Operation not permitted
 chgrp: changing group of `//usr/share/eucalyptus/faults/en_US/2002.xml': Operation not permitted
 chgrp: changing group of `//usr/share/eucalyptus/faults/en_US/1010.xml': Operation not permitted
 chgrp: changing group of `//usr/share/eucalyptus/faults/en_US/1005.xml': Operation not permitted
 chgrp: changing group of `//usr/share/eucalyptus/faults/en_US/1008.xml': Operation not permitted
 chgrp: changing group of `//usr/share/eucalyptus/faults/en_US/1003.xml': Operation not permitted
 chgrp: changing group of `//usr/share/eucalyptus/faults/en_US/1009.xml': Operation not permitted
 chgrp: changing group of `//usr/share/eucalyptus/faults/en_US/2001.xml': Operation not permitted
 chgrp: changing group of `//usr/share/eucalyptus/faults/en_US/2000.xml': Operation not permitted
 chgrp: changing group of `//usr/share/eucalyptus/faults/en_US': Operation not permitted
 chgrp: changing group of `//usr/share/eucalyptus/faults': Operation not permitted
 chmod: changing permissions of `//usr/share/eucalyptus/faults': Operation not permitted
 chmod: changing permissions of `//usr/share/eucalyptus/faults/en_US': Operation not permitted
 chmod: changing permissions of `//usr/share/eucalyptus/faults/en_US/common.xml': Operation not permitted
 chmod: changing permissions of `//usr/share/eucalyptus/faults/en_US/1002.xml': Operation not permitted
 chmod: changing permissions of `//usr/share/eucalyptus/faults/en_US/1001.xml': Operation not permitted
 chmod: changing permissions of `//usr/share/eucalyptus/faults/en_US/1004.xml': Operation not permitted
 chmod: changing permissions of `//usr/share/eucalyptus/faults/en_US/2002.xml': Operation not permitted
 chmod: changing permissions of `//usr/share/eucalyptus/faults/en_US/1010.xml': Operation not permitted
 chmod: changing permissions of `//usr/share/eucalyptus/faults/en_US/1005.xml': Operation not permitted
 chmod: changing permissions of `//usr/share/eucalyptus/faults/en_US/1008.xml': Operation not permitted
 chmod: changing permissions of `//usr/share/eucalyptus/faults/en_US/1003.xml': Operation not permitted
 chmod: changing permissions of `//usr/share/eucalyptus/faults/en_US/1009.xml': Operation not permitted
 chmod: changing permissions of `//usr/share/eucalyptus/faults/en_US/2001.xml': Operation not permitted
 chmod: changing permissions of `//usr/share/eucalyptus/faults/en_US/2000.xml': Operation not permitted
 2012-12-01 17:43:46  INFO 000000001 DirectoryBootstrapper    BaseRecord.java:173               | bootstrap  SYSTEM_DIR_CHECK :   [NativeMethodAccessorImpl.invoke0.-2] CUSTOMFAULTS:///etc/eucalyptus/faults
 2012-12-01 17:43:46  INFO 000000001 DirectoryBootstrapper    BaseRecord.java:173               | bootstrap  SYSTEM_DIR_CHECK :   [NativeMethodAccessorImpl.invoke0.-2] DB://var/lib/eucalyptus/db
 2012-12-01 17:43:46  INFO 000000001 DirectoryBootstrapper    BaseRecord.java:173               | bootstrap  SYSTEM_DIR_CHECK :   [NativeMethodAccessorImpl.invoke0.-2] BACKUPS://var/lib/eucalyptus/backups
 2012-12-01 17:43:46  INFO 000000001 DirectoryBootstrapper    BaseRecord.java:173               | bootstrap  SYSTEM_DIR_CHECK :   [NativeMethodAccessorImpl.invoke0.-2] TX://var/run/eucalyptus//tx
 2012-12-01 17:43:46  INFO 000000001 DirectoryBootstrapper    BaseRecord.java:173               | bootstrap  SYSTEM_DIR_CHECK :   [NativeMethodAccessorImpl.invoke0.-2] CLASSCACHE://var/run/eucalyptus//classcache

うーん、chown,chgrp,chmod が失敗している部分は本筋に関係なさそうだけど、コンソールにはこの先の出力が流れない…。

 # ps auxwww | grep -i [e]uca
 root      5085  0.0  0.0  10168   764 pts/0    S+   17:43   0:00 eucalyptus-cloud -u eucalyptus -h / --initialize --log-level=EXTREME -L console
 101       5088  2.1  4.9 1590584 101688 pts/0  Sl   17:43   0:05 eucalyptus-cloud -u eucalyptus -h / --initialize --log-level=EXTREME -L console
 101       5140  0.0  0.0  61112   884 pts/0    S    17:43   0:00 chown -R eucalyptus //var/run/eucalyptus//classcache

chown -R eucalyptus //var/run/eucalyptus//classcache がそんなに時間のかかる処理に思えないんだけど…何で返ってこないんだろう?不思議。っていうか /var/run/eucalyptus/classcache/ 配下の所有権が root:root なんだけど、/usr/lib/eucalyptus/euca_rootwrap 使わずに chown とかしても駄目じゃん…orz もうこれ Walrus がどうのこうのっていう話じゃないよなぁ…。

で考えるのが嫌んなっちゃうので、とりあえず手動で (ぉぃ

 # chown -R eucalyptus //var/run/eucalyptus//classcache
 # euca_conf --initialize
 Initializing a new cloud.  This may take a few minutes.
 Command: //usr/sbin/eucalyptus-cloud -u eucalyptus -h / --initialize
 Initialize command failed

はい、もう嫌… T^T

ちょっと出力が長すぎるので省略するけど、つまりは pg_ctl が無いって言ってます。

 2012-12-01 18:13:48 DEBUG 000000001 Groovyness               Groovyness.java:161               | javax.script.ScriptException: javax.script.ScriptException: java.io.IOException: Cannot run program "/usr/pgsql-9.1/bin/pg_ctl": java.io.IOException: error=2, No such file or directory
 javax.script.ScriptException: javax.script.ScriptException: java.io.IOException: Cannot run program "/usr/pgsql-9.1/bin/pg_ctl": java.io.IOException: error=2, No such file or directory

うーん、やっぱ eucalyptus-cloud をインストールしないと色々とハマるんだなぁ…。でも、ここで日和って eucalyptus-cloud をインストールしたんじゃぁご先祖様に申し訳ねぇ…ってことで pg_ctl を入れます。(妻が「ねぇ、晩御飯いつになったら行けるの?」って言ってますけど、きっと「あなた頑張って(はぁと)」っていう意味だと思います)

で、よくよく確認したら postgresql-server が入ってなかったのでインストールします。(はぁと)

 # yum install postgresql91-server

そしてもう一度 euca_conf –initialize を実行。実行……したけど終らない…。終らなすぎて、妻が先にご飯を食べて風呂を沸かして入っちゃうという事案が発生。|壁|ヽ(;*´ω`)ゞ

まぁ、しょうがないのでログを見ますよハイハイ。

 # tail -F /var/log/eucalyptus/cloud-debug.log |grep -i error
 Sat Dec 1 19:01:00 2012 ERROR [ComponentDiscovery:main] [com.eucalyptus.component.ComponentDiscovery.processClass(ComponentDiscovery.java):83] java.lang.reflect.UndeclaredThrowableException
 Sat Dec 1 19:01:00 2012  INFO [ComponentDiscovery:main] [com.eucalyptus.component.ComponentDiscovery.processClass(ComponentDiscovery.java):84] Error occurred while trying to register ComponentId of type: null
 Sat Dec 1 19:01:05 2012 ERROR [setup_db:main] [sun.reflect.NativeMethodAccessorImpl.invoke0(?):?] Insufficient operating system resources! The available number of semaphore identifiers is too low (semmni < 1536)
 Sat Dec 1 19:01:17 2012 ERROR [setup_db:main] [sun.reflect.NativeMethodAccessorImpl.invoke0(?):?] java.lang.Exception: Unable to start the postgres database
 Sat Dec 1 19:01:17 2012 ERROR [Databases:main] [com.eucalyptus.bootstrap.Databases$ScriptedDbBootstrapper.init(Databases.java):988] java.lang.Exception: Unable to start the postgres database
 Sat Dec 1 19:01:36 2012 ERROR [Bootstrap:main] [sun.reflect.NativeMethodAccessorImpl.invoke0(?):?] javax.persistence.PersistenceException: org.hibernate.exception.JDBCConnectionException: Cannot open connection
 Sat Dec 1 19:01:47 2012 ERROR [ComponentDiscovery:main] [com.eucalyptus.component.ComponentDiscovery.processClass(ComponentDiscovery.java):83] java.lang.reflect.UndeclaredThrowableException
 Sat Dec 1 19:01:47 2012  INFO [ComponentDiscovery:main] [com.eucalyptus.component.ComponentDiscovery.processClass(ComponentDiscovery.java):84] Error occurred while trying to register ComponentId of type: null
 Sat Dec 1 19:01:50 2012 ERROR [setup_db:main] [sun.reflect.NativeMethodAccessorImpl.invoke0(?):?] Insufficient operating system resources! The available number of semaphore identifiers is too low (semmni < 1536)
 Sat Dec 1 19:01:51 2012 ERROR [setup_db:main] [sun.reflect.NativeMethodAccessorImpl.invoke0(?):?] java.lang.Exception: Unable to initialize the postgres database
 Sat Dec 1 19:01:51 2012 ERROR [Databases:main] [com.eucalyptus.bootstrap.Databases$ScriptedDbBootstrapper.init(Databases.java):988] java.lang.Exception: Unable to initialize the postgres database
 Sat Dec 1 19:02:08 2012 ERROR [Bootstrap:main] [sun.reflect.NativeMethodAccessorImpl.invoke0(?):?] javax.persistence.PersistenceException: org.hibernate.exception.JDBCConnectionException: Cannot open connection

え………、エラーで処理がループしてますやん…。;゜・(゚ε゚【壁

でエラー見たら The available number of semaphore identifiers is too low (semmni < 1536) ……あぁ、ごめん、確かにリソースのこと確認し忘れてた。だって 2.0.3 まではメモリ 2GB な環境でも動いてたんだもんだもん…T&T

本当はここはサラっと通りすぎて、このあとは以下のような手順でこの日記を進める予定でした

  1. Walrus のサービスを service eucalyptus-cloud start で起動
  2. Walrus を登録 (euca_conf –register-walrus) しようとするけどそもそも CLC が居ないので登録先がない…orz
  3. (やっぱり eucalyptus-cloud のインストールは必要) eucalyptus-cloud のインストール
  4. あらためて euca_conf –register-walrus を実行
  5. ユーザ登録とかをして完成 (`・д・´)ゝ

が、残念ながら私が環境要件の確認を怠ったせいでそれ以前でコケました…。

教訓: Eucalyptus を動かすための最低限のスペックは確認してね☆(๑ゝω・๑)vキャピ

Each machine in your network needs a minimum of 4 GB RAM. However, we recommend more RAM for improved caching.

参考つ Storage and Memory Requirements