原因は、デバイスファイルが/dev/mapper/から消えるまえまでに"ioctl (fd, LOOP_CLR_FD, 0)" (=losetup -d)が行われてしまうこと。 タイミングの問題であるので再現性が低い場合がある。
この問題を回避するためには、"multipath: add udev sync support." (8d63b33d0996e141a2451df552b062b908db15bc)が入っているバージョンを使う必要がある。このchangeにより、"-s"オプションが追加され、udevイベントを待ってからloop deviceの操作が行われるようになる。
これを書いている時点のmultipath-toolsの最新リリースは0.4.9 (2010-10-22)で、このcommitはなんとか入っている。
以下、distro毎の違い
-
RHEL6.x系 このバージョンより古いものなので"-s"が存在しない。
-
Ubuntu/Debian multipath-tools/kpartx 0.4.9以降を含むものであればOK。
結論としては、RHEL系列においては"kpartx -d"は使わないほうがいいということになる。
kpartx -dと同じ内容は、CLIだけでも記述することが可能。 http://bazaar.launchpad.net/~vmbuilder-dev/vmbuilder/0.12/view/head:/VMBuilder/disk.py#L167
# dmsetup info loop0p1
State: ACTIVE
となっていることを確認
# dmsetup remove loop0p1
# udevadm settle
# losetup -d /dev/loop0
"udevadm settle"となっている部分がキモで、dmsetupが行う処理に関係するudevイベントを待つということを行なっている。"dmsetup udevcomplete_all"などでもいいかもしれない。
- イメージファイルのパス文字列が63バイト以下のものだけ動作する。
- 256個までのloopデバイスのみサポート
これらの問題はプログラム上の問題であるので、コードの修正がされるまでこれらの制限を避けるのは難しい。