再帰mountを試す(その4)

安直に作成したubindがどれぐらい使えるか(異常が発生しても使えるのか等)確認するため、mount –bindするディレクトリを、もっと複雑にしてみます。

bashのグロブ展開をつかって、a~zを列挙し、これをランダムなディレクトリ階層を作るのに使用します。

takk@deb9:~/tmp$ echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z
takk@deb9:~/tmp$ 

findでカレントディレクトリの全サブディレクトリを取得して、shufでシャッフルした先頭のパスに、a~zを順に加えていけば、実験用ディレクトリは完成です。

takk@deb9:~/tmp$ ls
takk@deb9:~/tmp$ for i in {a..z}; do mkdir -p `find | shuf | head -1`/$i; done
takk@deb9:~/tmp$ find
.
./a
./a/h
./a/b
./a/b/v
./a/b/v/x
./c
./c/d
./c/d/q
./c/d/q/w
./c/d/e
./c/d/g
./c/z
./c/l
./c/f
./c/f/i
./c/f/i/k
./c/f/i/k/m
./c/f/i/k/m/r
./c/f/i/s
./c/f/i/j
./c/f/i/j/n
./c/f/i/j/n/u
./c/f/i/j/n/t
./c/f/i/j/n/y
./c/f/i/o
./p
takk@deb9:~/tmp$ 

次は、上記のディレクトリのランダムなパス2か所を抽出。

takk@deb9:~/tmp$ find | shuf | head -2
./a/b
./c/l
takk@deb9:~/tmp$ 

抽出した2か所を、xargs 経由でmountへ渡せば、ランダムに2か所をマウントすることができます。

find | shuf | head -2 | xargs sudo mount --bind

mount –bindを使いつつ、findを使うことはできないので、(ループになるとエラーになるため)
echo をいれて、スクリプト生成をします。

takk@deb9:~/tmp$ for i in {1..10}; do find -type d | shuf | head -2 | xargs echo mount --bind ;done > mount.sh

このようなスクリプトができました。

takk@deb9:~/tmp$ cat mount.sh
sudo mount --bind ./c/d ./a/b/v/x
sudo mount --bind ./c ./c/d
sudo mount --bind ./c/f/i/k/m ./c/d/q/w
sudo mount --bind ./c/f/i/j/n ./c/d/e
sudo mount --bind ./a/h ./c/z
sudo mount --bind ./a/b/v ./c/f/i/k/m/r
sudo mount --bind ./a/b/v/x ./c/d/q
sudo mount --bind ./a/b/v ./c/f/i/j/n/t
sudo mount --bind ./c/f/i/j/n ./c/d/q/w
sudo mount --bind ./a/h ./a
takk@deb9:~/tmp$ 

スクリプトを実行します。マウント過程でディレクトリ名が変わってしまってnot existと言われる箇所については、特に考慮していないので無視しておきます。

takk@deb9:~/tmp$ . mount.sh
mount: mount point ./c/d/q/w does not exist
mount: mount point ./c/d/e does not exist
mount: mount point ./c/d/q does not exist
mount: mount point ./c/d/q/w does not exist
takk@deb9:~/tmp$ 

mount –bindされたパスのリストを確認。

takk@deb9:~/tmp$ bindlist
/home/takk/tmp/a/b/v/x
/home/takk/tmp/c/d
/home/takk/tmp/a/b/v/x
/home/takk/tmp/c/z
/home/takk/tmp/a/b/v/x/z
/home/takk/tmp/c/d/z
/home/takk/tmp/c/f/i/k/m/r
/home/takk/tmp/a/b/v/x/f/i/k/m/r
/home/takk/tmp/c/d/f/i/k/m/r
/home/takk/tmp/c/f/i/j/n/t
/home/takk/tmp/a/b/v/x/f/i/j/n/t
/home/takk/tmp/c/d/f/i/j/n/t
/home/takk/tmp/a
takk@deb9:~/tmp$ 

たくさん作ってしまいました。
では、前回同様、ubindを使って、一気にアンマウントしてみます。一回では無理でしょうけど。

takk@deb9:~/tmp$ ubind
umount: /home/takk/tmp/a/b/v/x: mountpoint not found
umount: /home/takk/tmp/c/d: target is busy
        (In some cases useful info about processes that
         use the device is found by lsof(8) or fuser(1).)
umount: /home/takk/tmp/a/b/v/x: mountpoint not found
umount: /home/takk/tmp/a/b/v/x/z: mountpoint not found
umount: /home/takk/tmp/c/d/z: not mounted
umount: /home/takk/tmp/a/b/v/x/f/i/k/m/r: mountpoint not found
umount: /home/takk/tmp/c/d/f/i/k/m/r: not mounted
umount: /home/takk/tmp/a/b/v/x/f/i/j/n/t: mountpoint not found
umount: /home/takk/tmp/c/d/f/i/j/n/t: not mounted
xargs: sudo: 終了ステータス 255。中止しています
takk@deb9:~/tmp$ 

まあ、いろいろメッセージは出てくれましたが、ほとんどアンマウントされたと思います。リストを確認。

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

もう一度ubindを実行すれば、全部アンマウントできると思います。

takk@deb9:~/tmp$ ubind
umount: /home/takk/tmp/c/d: not mounted
takk@deb9:~/tmp$ bindlist
takk@deb9:~/tmp$ 

リストが空になったので、全部アンマウントできました。

次はマウントする数を増やします。1000ぐらいいけるでしょうか。

takk@deb9:~/tmp$ for i in {1..1000};do find -type d | shuf | head -2 | xargs echo sudo mount --bind ;done > mount2.sh
takk@deb9:~/tmp$ wc -l mount2.sh
1000 mount2.sh
takk@deb9:~/tmp$ . mount2.sh 2>/dev/null

ここで、念願の異常発生。システムの応答が異常に遅延するようになりました。
1000個は多すぎのようです。

では、ubindで、復旧するか確認。

takk@deb9:~/tmp$ ubind
unable to execute /bin /umount: Argument list too long

~省略~

そもそもumountで指定できるパラメータ数を超えているようです。ubindでは、どうにも復旧しそうにありません。しかも、PCが非常に重たくなりました。

結局、umount -l 後、rebootして再起動させると、綺麗にmountのリストから外れており、PCが重たくなる現象もなくなりました。
復旧方法について、もう少し考えてみる必要がありそうです。

Leave a Reply

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

CAPTCHA