web-dev-qa-db-ja.com

切断後も存続するSSHFSマウント

私は [〜#〜] sshfs [〜#〜] ラップトップから中央サーバーへのマウントを使用しています。

明らかに、SSHFSマウントは、長い切断(たとえば、サスペンド中)の後で壊れて、基礎となるSSH接続がタイムアウトする原因になります。

SSHFSマウントを長時間持続する切断(> 5分)や、別のIPでの再ダイアリンにも耐えられるようにする方法はありますか?

60
bene

Autosshとautofsのヒントをありがとう。

しかし、直接的な目的で、あまりよく文書化されていないはるかに単純な解決策を見つけました。

sshfs -o reconnect server:/path/to/mount
54
bene

-o reconnect,ServerAliveInterval=15,ServerAliveCountMax=3を使用

ServerAliveInterval=15,ServerAliveCountMax=3の組み合わせにより、1分間のネットワーク停止後にI/Oエラーが発生します。これは重要ですが、ほとんど文書化されていません。 ServerAliveIntervalオプションがデフォルトのままになっている場合(アライブチェックがない場合)、I/Oハングが発生するプロセスは、sshfsがreconnect 'edされた後でも、無期限にスリープしているように見えます。これは役に立たない行動だと思います。

つまり、ServerAliveIntervalを割り当てずに-o reconnectで発生するのは、I/Oが成功するか、sshがその下に再接続するとアプリケーションが無期限にハングすることです。その結果、一般的なアプリケーションは完全にハングします。 I/Oがエラーを返してアプリケーションを再開できるようにする場合は、ServerAliveInterval=1以上が必要です。

とにかくServerAliveCountMax=3がデフォルトですが、読みやすくするためにそれを指定します。

65
kubanczyk

Autossh sshが停止したか、トラフィックの通過を停止したことに気付いた場合、sshセッションを自動的に再接続します。それは単に自動化されたsshなので、異なるIPとサスペンドから動作します(ラップトップが別のLANで起動した場合でも)。

12
kband

あなたができることの一つは、ファイルシステムを autofs でマウントすることです。 autofsは、ファイルシステムがマウントされるディレクトリで何かを使用するときにファイルシステムをマウントするツールです。アクティビティを検出すると、ファイルシステムがマウントされます。ファイルシステムで何も起こっていないとき、それはアンマウントされます。

これが howto です。Googleでこれを実現するために見つけました。他にもいくつかあります。

9
Zoredache

SSHクライアントが接続をドロップしないように構成できたとしても、サーバーは指定された非アクティブ期間が経過した後にそれを行うように構成されている可能性があり、それをオーバーライドすることができないためです。たとえできたとしても、接続を再開しないと、サーバーはハングしたままになり、時間の経過とともにサーバーリソースの大幅な浪費につながる可能性があります。

コンピューターを一時停止する前にファイルシステムをアンマウントし、コンピューターが再び起動したときに再マウントするのが、より良いテクニックだと思います。そうするためのメカニズムは、コンピュータをどのようにサスペンドするかに完全に依存する可能性があります-私はtuxoniceカーネルを使用し、このようなことをするために、私は次のようなディレクティブを持っています

Unmount /mnt/sshfs

/etc/hibernate/common.conf

2
David Z

kubanczykの答え は素晴らしいです。貪欲なsshfsが原因でインターフェース全体のフリーズに問題がありましたが、ラップトップを開いたときに再接続し、接続が遅くなってもフリーズしないスクリプトによって開始される簡単な接続のために、そのようなbashスクリプトを使用できます(たぶん安全性は高くありませんが、たとえば多くのWebプロジェクトでは便利です):

#!/bin/bash
echo PWD | sshfs USER@SERVER:/ MOUNT_PATH -o password_stdin,reconnect,ServerAliveInterval=15,ServerAliveCountMax=3 -p PORT -C -oStrictHostKeyChecking=no
if xhost >& /dev/null ; then
    pcmanfm MOUNT_PATH
fi
1