web-dev-qa-db-ja.com

*同じ*絶対パスを持つ2つの*異なる*マウントポイント(バインドマウントの問題)

シナリオ

  • nFS共有は_/mnt/temp/dir_にマウントされます(および他の共有はサブディレクトリにマウントされます)、
  • 私はそこにあるすべてをumountしますが、おそらくうまく機能しません(_umount /mnt/temp/dir_のような「ネストされた」共有を最初にアンマウントする代わりに_/mnt/temp/dir/subdir*_から始めるかもしれません)、
  • 私は_mount -o bind /data/temp /mnt/temp_をします、
  • 私は_mount /mnt/temp/dir_をします、
  • 私は_mount /mnt/temp/dir/subdir1_...を実行し、それはうまく機能します。

注:_/mnt/temp_は、最初はルート(_/_)ファイルシステム_/dev/sda6_でホストされ、_/data_は_/dev/sda8_の別のファイルシステムです。

問題

ルートファイルシステムの_/mnt/temp/dir_ディレクトリを削除できません。

_# mount -o bind / /test/root
# rmdir /test/root/mnt/temp/dir
rmdir: failed to remove `dir': Device or resource busy
_

いくつかの説明

_/mnt/temp/dir_がマウントされます2回、おそらくルートfsに1回、 _/data_ fs。

これが_cat /proc/mounts_です:

_nfsserver:/some/share/ /mnt/temp/dir nfs rw,relatime(...) 0 0
nfsserver:/some/share/ /mnt/temp/dir nfs rw,relatime,(...) 0 0
_

さらに興味深いことに、ここに_cat /proc/1/mountinfo_があります:

_29 20 0:18 / /mnt/temp/dir rw,relatime - nfs nfsserver:/some/share/ rw,(...)
33 31 0:18 / /mnt/temp/dir rw,relatime - nfs nfsserver:/some/share/ rw,(...)
_

参照してください、最初の2つの数字は異なるです。

カーネルドキュメントによると これら2つのフィールドの場合:

_(1) mount ID:  unique identifier of the mount (may be reused after umount)
(2) parent ID:  ID of parent (or of self for the top of the mount tree)
_

また、親20と31(root fsと_/data_ fs)も異なります。以下を参照してください。

_20 1 8:6 / / rw,relatime - ext4 /dev/sda6 rw,(...)
31 20 8:8 /temp /mnt/temp rw,relatime - ext4 /dev/sda8 rw,(...)
_

_umount /mnt/temp/dir_を実行しようとすると、2つのエラーメッセージが表示されます。

_umount.nfs: /mnt/temp/dir: device is busy
umount.nfs: /mnt/temp/dir: device is busy
_

質問

どうすれば「悪い」もの(マウントID 29)をumountできますか?

umount(2)システムコールでさえ、「マウントID」ではなく、引数のパスを取ります。

5
Totor

これはテストされていませんが、少なくとも「デバイスがビジーです」という問題を回避できます。

マウントポイントの1つを別の場所に移動します。そうすれば、2つのマウントポイント間で混乱が生じることはありません。

mkdir /foo
mount --move /mnt/temp/dir /foo
1
Gilles