Skip to content

Instantly share code, notes, and snippets.

@unakatsuo
Created September 15, 2012 12:36
Show Gist options
  • Save unakatsuo/3727609 to your computer and use it in GitHub Desktop.
Save unakatsuo/3727609 to your computer and use it in GitHub Desktop.
kpartxとその問題

kpartx -dする際 "Device or resource busy"で失敗する。

原因は、デバイスファイルが/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デバイスのみサポート

これらの問題はプログラム上の問題であるので、コードの修正がされるまでこれらの制限を避けるのは難しい。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment