安直に作成したubindがどれぐらい使えるか(異常が発生しても使えるのか等)確認するため、mount –bindするディレクトリを、もっと複雑にしてみます。
(親記事はコチラ 中級者のためのLinuxコマンド入門)
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が重たくなる現象もなくなりました。
復旧方法について、もう少し考えてみる必要がありそうです。
コメント