2012年10月27日土曜日

CloudStack 2.2.15のインストールパッケージを自作する

CloudStack 2.2系の最新版は2.2.15ということになっているらしい。このバージョンは以下の様な重要な変更点(詳しくはリリースノートを参照のこと)があるのでぜひともバージョンアップしておきたいと思うのだが一般には公開されないもののようだ。

ということでgitリポジトリからパッケージを自作してみることにした。なおOSはターゲットOS、ビルドOSともにCentOS 6.3を使用してる。

githubからソースコードを入手する

以下のコマンドでgithubからソースコードを入手する。

git clone https://github.com/CloudStack-extras/CloudStack-archive.git

カレントディレクトリにCloudStack-archiveというディレクトリが作成され、masterブランチのソースコードが展開されるはずだ。

以降CloudStack-archiveディレクトリで作業を行う。

ブランチを2.2.15に変更する

以下のコマンドで2.2.15のソースコードを展開する。

git checkout -b 2.2.15 TAG_CLOUDPLATFORM_2.2.15_GA2

TAG_CLOUDPLATFORM_2.2.15_GA2というタグが2.2.15のリリース版のハズ(正確なところはよくわからない)。

ビルドに必要なRPMパッケージをインストールする

waf viewrpmdepsというコマンドを実行すればコンパイルに必要なパッケージ一覧が得られる。これらのRPMをyumなりでインストールする。

[mas00 CloudStack-archive]$ ./waf viewrpmdeps
glibc-devel
gcc
commons-httpclient
java-1.6.0-openjdk-devel
rpm-build
ws-commons-util
tomcat6
MySQL-python
jpackage-utils
/usr/bin/mkisofs
'viewrpmdeps' finished successfully (0.001s)

RPMをビルドする

CloudStackのビルドスクリプトはターゲットOSをCentOS/RHEL/Ubuntuとそれぞれ区別して処理を行うように作られているが、CentOS用の処理は(JavaのCLASSPATHなど)色々とおかしいところがあるので、ビルドするOSがCentOSである場合、RHEL6であるように振る舞うように以下の様な変更を行う。

rm /etc/redhat-release
echo Red Hat Enterprise Linux Server release 6 > /etc/redhat-release
mv /etc/centos-release /etc/centos-release.orig

準備が出来たら早速ビルドする。

./waf rpm --package-version=2.2.15 --release-version=0.1

うまくビルドできればartifacts/rpmbuild/RPMS/x86_64にRPMパッケージが作成されているはずだ。

[mas00 CloudStack-archive]$ ls artifacts/rpmbuild/RPMS/x86_64
cloud-agent-2.2.15-0.1.el6.x86_64.rpm
cloud-agent-libs-2.2.15-0.1.el6.x86_64.rpm
cloud-agent-scripts-2.2.15-0.1.el6.x86_64.rpm
cloud-baremetal-agent-2.2.15-0.1.el6.x86_64.rpm
cloud-cli-2.2.15-0.1.el6.x86_64.rpm
cloud-client-2.2.15-0.1.el6.x86_64.rpm
cloud-client-ui-2.2.15-0.1.el6.x86_64.rpm
cloud-console-proxy-2.2.15-0.1.el6.x86_64.rpm
cloud-core-2.2.15-0.1.el6.x86_64.rpm
cloud-daemonize-2.2.15-0.1.el6.x86_64.rpm
cloud-deps-2.2.15-0.1.el6.x86_64.rpm
cloud-python-2.2.15-0.1.el6.x86_64.rpm
cloud-server-2.2.15-0.1.el6.x86_64.rpm
cloud-setup-2.2.15-0.1.el6.x86_64.rpm
cloud-test-2.2.15-0.1.el6.x86_64.rpm
cloud-usage-2.2.15-0.1.el6.x86_64.rpm
cloud-utils-2.2.15-0.1.el6.x86_64.rpm

インストールパッケージを使ってインストールする

ビルドされたRPMパッケージをそのままrpm -ivhしても良いのだが、yumを使用して依存RPM含めて一気にインストールしたい場合はCloudStackのインストールパッケージを借用する。

  1. CloudStack-2.2.14-1-rhel6.1.tar.gzをダウンロードして展開する
  2. CloudStack-2.2.14-1-rhel6.1/ossディレクトリにあるRPMを2.2.15のものに置き換える
  3. CloudStack-2.2.14-1-rhel6.1ディレクトリに移動し"createrepo -d ."を実行する
  4. CloudStack-2.2.14-1-rhel6.1/install.shを実行してインストールする

インストール後の注意点

2.2.14までエージェントのスレッド数の上限(DirectAgentPoolSize)は500とハードコーディングされていたが、2.2.15からdirect.agent.pool.sizeというグローバルコンフィグレーションパラメータでこの値を設定するようになっている。

ところがこの値のデフォルト値が1000となっており、Linuxのulimitを設定しない場合のプロセス上限を超えてしまうので、Out of memory例外を出してCloudStackが停止してしまう。インストール後速やかにこの値を1000以下(2.2.14と同様500で良いと思う)に設定する必要がある。

おそらくこのバグのad hocな対処が原因である。