web-dev-qa-db-ja.com

SSHFSでinotifyまたは名前付きパイプを使用するにはどうすればよいですか?

ありがとう sshfs 魔法、リモートサーバーからホームディレクトリをマウントできます。

sshfs user@server:/home/user ~/remote

楽観的に、私はローカルを設定すると思いました inotify- hook~/remote/logFilesshfsマウント内)。ローカルプログラムがリモートログの変更に対応できるようにします。

cd ~/remote
touch logFile                                # create remote file
inotifywait logFile &                        # set up local inotify-hook
ssh user@server -x touch /home/user/logFile  # touch file from remote

何も起こりません。ローカルでファイルをinotifywaitしない限り、touchはサイレントです。名前付きパイプへの書き込みも同様に失敗します。

これはなぜですか?
どうすればこのギャップを埋めることができますか?

私はcouldリモートでinotifywaitを実行し、ファイルシステムの変更のシリアル化戦略をハックし、ローカルへの接続を維持しますが、基本的にSSHFSを再実装します =。そして、それは抽象化を完全に殺します。

12
Anko

SSHFSファイルシステムは [〜#〜] sftp [〜#〜] プロトコルの上に構築されています。 SFTPは、「クラシック」な方法でファイルを操作する機能のみを提供します。クライアントがサーバーに要求を出し(ディレクトリの一覧表示、ファイルのアップロードなど)、サーバーが応答します。このプロトコルには、サーバーが何かが発生したことをクライアントに自発的に通知する機能はありません。

これにより、SSHFS内でinotifyなどの機能を提供できなくなります。独自の拡張機能でSSHFSを拡張したり、本格的なSSH接続でそれを補足したりすることが可能です。しかし、私はそのようなSSHFSへの拡張を知りません。

名前付きパイプは、同じ理由でSSHFSの上に実装することはできません。古典的なネットワークファイルシステムであるNFSには、マシン間の名前付きパイプをサポートする機能もありません。ネットワーク化されたファイルシステムでは、名前付きパイプは、サーバーに加えて、それがマウントされている各マシン上に独立した通信ポイントを作成します。

[〜#〜] fam [〜#〜] (Linuxに移植されたSGI IRIXのinotifyアナログ)は、通知をネットワーク経由で送信できるデーモンを提供します。 Linuxは、inotifyが登場して以来、FAMを非推奨にしているため、FAMを実行する方が、独自のアプリケーション固有の通知システムをロールするよりも簡単かどうかはわかりません。 FAMとNFSのネットワークリンクを保護するには、SSH経由でポート転送を設定するか、VPNを確立する必要があります。

クライアントにShellアクセスを与えることに問題がないと想定して独自にロールすることを選択した場合、クライアントに代わってinotifyモニターを実行するのはかなり簡単です。クライアントにSSH接続を開いてinotifywaitコマンドをサーバーで実行し、その出力をクライアントで解析します。 マスター接続をセットアップする を使用すると、同じクライアントから同じサーバーへの多くの接続をより速く開くことができます。