再帰mountを試す(その3)

続きです。
続きですが、まだmountの再帰は試みません。前回と同じく、手動で一つずつmount –bindします。

takk@deb9:~/tmp$ ls
takk@deb9:~/tmp$ mkdir -p a/b/c
takk@deb9:~/tmp$ sudo mount --bind a a/b/c
takk@deb9:~/tmp$ sudo mount --bind a a/b/c/b/c

引数なしのmountで、mountポイントが一覧表示されますので、カレントパス等でgrepすると、さきほどmount –bindしたパスが表示されます。

takk@deb9:~/tmp$ mount | grep `pwd`
/dev/sda1 on /home/takk/tmp/a/b/c type ext4 (rw,relatime,errors=remount-ro,data=ordered)
/dev/sda1 on /home/takk/tmp/a/b/c/b/c type ext4 (rw,relatime,errors=remount-ro,data=ordered)
/dev/sda1 on /home/takk/tmp/a/b/c type ext4 (rw,relatime,errors=remount-ro,data=ordered)
takk@deb9:~/tmp$ 

パスだけを抽出。

takk@deb9:~/tmp$ mount | grep `pwd` | cut -d' ' -f3
/home/takk/tmp/a/b/c
/home/takk/tmp/a/b/c/b/c
/home/takk/tmp/a/b/c
takk@deb9:~/tmp$ 

さらにbash関数化して、いつでも簡単に使えるようにしておきます。

takk@deb9:~/tmp$ bindlist(){
> mount | grep `pwd` | cut -d' ' -f3
> }
takk@deb9:~/tmp$ 

さっそく使ってみます。

takk@deb9:~/tmp$ bindlist
/home/takk/tmp/a/b/c
/home/takk/tmp/a/b/c/b/c
/home/takk/tmp/a/b/c
takk@deb9:~/tmp$ 

表示されるパスは、同じですね。

さて、複雑な–bindのマウントを一気に解除するコマンドを作ります。

仕組みとしては、umountに全リストを与えるだけ。

takk@deb9:~/tmp$ bindlist | xargs sudo umount
umount: /home/takk/tmp/a/b/c: target is busy
        (In some cases useful info about processes that
         use the device is found by lsof(8) or fuser(1).)
takk@deb9:~/tmp$ 

メッセージは出ましたが、どこかのパスは、umountできるはずです。
残っているマウントのパスのリストを確認します。

takk@deb9:~/tmp$ bindlist
takk@deb9:~/tmp$ 

全部消えてました。ってことは、全部アンマウントできたのですね。

さて、全部アンマウントもbash関数化します。

takk@deb9:~/tmp$ ubind(){
> bindlist | xargs sudo umount
> }
takk@deb9:~/tmp$ 

今までに使ったディレクトリは一旦削除しておきます。

takk@deb9:~/tmp$ rm -rf a
takk@deb9:~/tmp$ ls
takk@deb9:~/tmp$ 

では、もっと複雑な入れ子のマウントをして、ubindを試してみることにします。

takk@deb9:~/tmp$ mkdir -p a/b/c/d/e/f
takk@deb9:~/tmp$ sudo mount --bind a a/b/c/d/e/f
takk@deb9:~/tmp$ sudo mount --bind a/b/c a/b/c/d/e/f/b/c/d/e/f
takk@deb9:~/tmp$ sudo mount --bind a/b a/b/c
takk@deb9:~/tmp$ 

マウントリストを確認してみます。

takk@deb9:~/tmp$ bindlist
/home/takk/tmp/a/b/c/d/e/f
/home/takk/tmp/a/b/c/d/e/f/b/c/d/e/f
/home/takk/tmp/a/b/c/d/e/f
/home/takk/tmp/a/b/c
/home/takk/tmp/a/b/c/d/e/f/b/c
/home/takk/tmp/a/b/c/d/e/f
/home/takk/tmp/a/b/c/d/e/f/b/c/d/e/f
takk@deb9:~/tmp$ 

マウントリストだけみると、かなり複雑になりました。

findは当然、エラーになります。

takk@deb9:~/tmp$ find
.
./a
./a/b
find: ファイルシステムのループが検出されました。 ‘./a/b/c’ は ‘./a/b’ のファイルシステムのループの一部になっています。
takk@deb9:~/tmp$ 

では、ubind。

takk@deb9:~/tmp$ ubind
umount: /home/takk/tmp/a/b/c/d/e/f: mountpoint not found
umount: /home/takk/tmp/a/b/c/d/e/f/b/c/d/e/f: mountpoint not found
umount: /home/takk/tmp/a/b/c/d/e/f: mountpoint not found
umount: /home/takk/tmp/a/b/c/d/e/f/b/c: not mounted
umount: /home/takk/tmp/a/b/c/d/e/f: target is busy
        (In some cases useful info about processes that
         use the device is found by lsof(8) or fuser(1).)

どれぐらいアンマウントできたでしょうか。残りのマウントリストを確認。

takk@deb9:~/tmp$ bindlist
/home/takk/tmp/a/b/c/d/e/f

1個ですね。

残りの1個もubindしましょう。

takk@deb9:~/tmp$ ubind
takk@deb9:~/tmp$ bindlist
takk@deb9:~/tmp$ 

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA