folsomのnova.confで指定したbase_dir_nameが効かない件

essexリリースではnova.conf内で指定できていた base_dir_name がfolsomリリースでは さっぱり効いておらず、どのような値の書き方をしても、必ずデフォルト値である $instances_path/_base/ 以下にglanceからダウンロードされるOSイメージファイルのキャッシュが作成されてしまう現象に見舞われて、自分を疑いつつも調査してみました。

このあたり、essexとfolsomでは大幅にロジックが変更されてるんですね。
結果的にはバグでした。

base_dir_nameって何?

仮想マシンがcomputeノード上で起動される際に、$instance_path/$base_dir_name で指定されるディレクトリに、glanceからダウンロードされるOSのイメージファイルがキャッシュとして置かれます。
NFSやGlusterFSを利用してVMイメージを複数のcomputeノードで共有するような構成(よくありますよね)では、この base_dir_name で指定するキャッシュディレクトリを分けておかないと、タイミングによってはキャッシュファイルが破壊されるような状況が発生する(ぼくは未体験ですが)らしく、ノード毎に別ディレクトリにすることが推奨されています。

キャッシュディレクトリをcomputeノード毎に分ける

各computeノードの設定ファイル(/etc/nova/nova.conf)内で以下のような感じで分けるように設定してみました。
$my_ip に設定した自ホストのIPアドレスを利用して base_dir_name をcomputeノード毎に指定します。

  • /etc/nova/nova.conf
[DEFAULT]
my_ip = 172.16.201.200

...中略...

base_dir_name = _base_$my_ip

...以下略...

ところがですよ、essexでは効いていたこの設定がさっぱり効力を発揮せず、デフォルトのパス(/var/lib/nova/instances/_base)にキャッシュが作成されていまします。
で、調べてみると...バグでしたね。
いまのmasterでは、どうやら修正されているようですが、folsomを利用している場合は修正されていませんので、以下のように imagebackend.py を修正してみてください。

$ diff -u nova/virt/libvirt/imagebackend.py.org nova/virt/libvirt/imagebackend.py
--- nova/virt/libvirt/imagebackend.py.org	2012-12-16 21:45:04.858022776 +0900
+++ nova/virt/libvirt/imagebackend.py	2012-12-16 21:45:43.028039906 +0900
@@ -117,7 +117,7 @@
                 fetch_func(target=target, *args, **kwargs)
 
         if not os.path.exists(self.path):
-            base_dir = os.path.join(FLAGS.instances_path, '_base')
+            base_dir = os.path.join(FLAGS.instances_path, FLAGS.base_dir_name)
             if not os.path.exists(base_dir):
                 utils.ensure_tree(base_dir)
             base = os.path.join(base_dir, filename)

決め打ちでしたよ...

あぁぁこれじゃぁ必ず $instances_path/_base に作成されちゃいますねぇ。

base_dir = os.path.join(FLAGS.instances_path, '_base')

ここでは、nova.confの base_dir_name を参照するように修正しました。

base_dir = os.path.join(FLAGS.instances_path, FLAGS.base_dir_name)