2011-05-04
_ ネットワークが有効になったら pogoplugfs を起動する
先日の日記で,pogoplugfs をスタートアップに登録すれば起動時に pogoplug がドライブとして mount されると書いたけど,これはデスクトップ PC で有線 LAN 環境でのこと.これがノート PC などで無線 LAN 環境になると,スタートアップ時にはまだネットワークに接続できていないため,pogoplugfs の起動に失敗してしまいました.必要なときにコマンドラインで呼び出すなり,起動用のスクリプトを用意してもいいのですが,ネットワークがアクティブになったら自動的に mount されて利用できるほうがやっぱりいい.うまく呼び出す方法として何がいいか.
autofs とかどうかなと思ったけど,これはネットワークに繋がっているかどうかまでは見ていなさそう.特定のフォルダへのアクセスがあったときに自動的に mount する 仕組みは使えそうだけど.それよりも autofs から pogoplugfs の呼び出しがうまくできなさそうだったので却下.
次に考えたのがネットワークの起動時にスクリプトが呼び出せる /etc/network/if-up.d 配下に起動スクリプトを置くこと.解決策としてはもっともいいものだと思ったけど,スクリプトの起動が root ユーザーとなってしまっているからか,マウントはできるけどファイルシステムにアクセスできない.ログインユーザー名の取得も環境変数などにはなさそうだったので,これも却下.
もうひとつ思いついたのは pogoplug と同じようなストレージ系のアプリケーションとして,Dropbox や UbuntuOne のような nautilus と連携させる方法.nautilus actions などでコンテキストメニューなどを独自に追加できるようだけど,フォルダアクセス時にマウントするとかそういった類のことはできなさそうなので却下.
ここまでやって,やっぱり無理か,手動でコマンドたたくなりするかなと思ったのですが,if-up.d に配置するスクリプトで,現在 mount しているファイルシステムから gvfs-fuse-daemon を探して,そこから user をひっぱってはこれないかと思いついた.ということで,ひとまずなんとか動いた感じの起動スクリプトが以下.ちなみに,このスクリプトは Ubuntu 11.04 の環境で動作することを確認しています.
まずはネットワークがアクティブになったときに呼び出されるスクリプト./etc/network/if-up.d において利用することを想定.
#!/bin/sh [ "$IFACE" != "lo" ] || exit 0 mount|while read fs on mp type fstype opts do if echo $fs | grep -q "gvfs-fuse-daemon"; then username=`echo $opts | sed -E "s/.*user=([^,]+).*\)/\1/g"` if [ "$username" ]; then sudo -u "$username" sh -c "pogoplugfs --mountpoint /media/pogoplug &" fi fi done
ネットワークが停止するときは umount する.こちらは /etc/network/if-down.d において利用する.
#!/bin/sh [ "$IFACE" != "lo" ] || exit 0 mount | while read fs on mp type fstype opts do if [ "$mp" = "/media/pogoplug" ];then umount /media/pogoplug fi done
これでネットワークの接続,切断時に,pogoplugfs の mount や unmount を実行できるようになりました.ユーザーをどこからとってくるか,who コマンドとかでもよかったのかもしれませんが,他にいい方法はあるのかな.ひとまずより快適に pogoplug を利用できる環境にはなりました.