SSHファイルシステムを使うと、ssh コマンドで入れるPC上のファイルを、NFS(ネットワークファイルシステム)の様に手元のPCにマウントすることが出来る。よって、NFSサーバは立ち上がっていないが、SSHサーバは立ち上がっているというようなPC上のファイルをマウントすることが出来る。ただし、そのPCにアカウントを持ちsshで入れなければならない。SSHファイルシステムを使うには、SSHサーバが立ち上がっているPCでの設定は必要なく、手元にあるクライアントPCにSSHファイルシステムの実装であるsshfsコマンドをインストールすれば良い。
CentOS 4.7(カーネルのバージョンは2.6.9)にsshfsコマンドをインストールする。2009年11月17日現在で最も新しいfuse-2.8.1とsshfs-fuse-2.2がインストールできた。$ uname -a コマンドを打つと、Linux localhost.localdomain 2.6.9-78.ELsmp #1 SMP Fri Jul 25 00:04:28 EDT 2008 i686 i686 i386 GNU/Linuxと表示された。
$ cd # ホームディレクトリに移動。 $ mkdir sshfs # コンパイル用の一時作業ディレクトリを作る。何処に作っても良い。 $ cd sshfs # 作業ディレクトリへ移動。 $ # 以下のコマンドでfuseをダウンロード。リンク先がなかったら、からソースをダウンロードし、sshfsディレクトリに保存。 $ wget http://jaist.dl.sourceforge.net/project/fuse/fuse-2.X/2.8.1/fuse-2.8.1.tar.gz $ tar zxvf fuse-2.8.1.tar.gz # 解凍。vオプションはverboseを表し、解凍の途中結果を表示する。 $ cd fuse-2.8.1 $ ./configure --prefix=/usr # 設定及びMakefile作成。prefixはインストール場所を指定。デフォルトでは、/usr/localにインストールされる。 $ make $ su # fuseをインストールするためにスーパーユーザーになる。 Password: rootのパスワードを入力 # make install # exit $ cd .. # ひとつ上のディレクトリに移動。ここでは、sshfsというディレクトリ。 $ # 以下のコマンドでfuseをダウンロード。リンク先がなかったら、からソースをダウンロードし、sshfsディレクトリに保存。 $ wget http://jaist.dl.sourceforge.net/project/fuse/sshfs-fuse/2.2/sshfs-fuse-2.2.tar.gz $ tar zxvf sshfs-fuse-2.2.tar.gz $ cd sshfs-fuse-2.2 $ ./configure --prefix=/usr # 設定及びMakefile作成。prefixはインストール場所を指定。デフォルトでは、/usr/localにインストールされる。 $ make # makeする。 $ su # sshfsをインストールするためにスーパーユーザーになる。 Password: rootのパスワードを入力 # make install # exit $ cd .. $ rm sshfs -rf # 一時作業ディレクトリを削除。後でアンインストールしたい場合は、削除しない。
sshfsをアンインストールする場合は、上で作ったMakefileを使うと便利。
$ cd # ホームディレクトリに移動。 $ su # fuse及びsshfsをアンインストールするためにスーパーユーザーになる。 Password: rootのパスワードを入力 # cd sshfs # コンパイル用の一時作業ディレクトリに移動。 # cd fuse-2.8.1 # fuse用の作業ディレクトリに移動。 # make uninstall # fuseアンインストール # cd ../sshfs-fuse-2.8.1 # make uninstall # sshfs用の作業ディレクトリに移動。 # exit $ cd # ホームディレクトリに移動。 $ rm sshfs -rf # sshfsの作業ディレクトリを削除。
sshfsを実行する前にまずfuseを立ち上げる。パーミッションの設定が合っているか自信がない。とりあえず、誰でもfuseが使えるようにする。普通は、# chgrp fuse /dev/fuse; chmod g+rw /dev/fuse として、fuseグループに所属する人のみがマウントできるようにするのか?
# su # fuseモジュールを立ち上げる為に、スーパーユーザーになる。 Password: rootのパスワードを入力 # modprobe fuse # fuseモジュール立ち上げ。/dev/fuseができる。 # chmod o+rw /dev/fuse # /dev/fuseのパーミッション変更。これでcrw-------からcrw----rw-になる。 # ls -l /dev/fuse # パーミッション確認。 crw----rw- 1 root root 10, 229 11月 17 01:37 /dev/fuse # exit
fuseが立ち上がっていれば、以下のコマンドでマウントできる。
$ mkdir sshfs_exp # マウントする為のディレクトリを作る。 $ sshfs username@be.nucl.ap.titech.ac.jp:/home/username/exp sshfs_exp # マウント $ cd sshfs_exp # マウントしたディレクトリに移動。 $ ls # ファイルがちゃんと見えるか確認。 public_html ... $ cd .. $ fusermount -u sshfs_exp # アンマウント
username@be.nucl.ap.titech.ac.jp:/home/username/expの最後の部分は、:expでもよい。
インストールがんばった軌跡。
$ ./configure --prefix=/usr ... checking for SSHFS... Package glib-2.0 was not found in the pkg-config search path. Perhaps you should add the directory containing `glib-2.0.pc' to the PKG_CONFIG_PATH environment variable No package 'glib-2.0' found configure: error: Package requirements (fuse >= 2.2 glib-2.0 gthread-2.0) were not met: Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables SSHFS_CFLAGS and SSHFS_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.
sshfsの./configureをするとき、上記エラーがでた。# apt-get install glib2-devel を実行すると大丈夫。
$ sshfs username@be.nucl.ap.titech.ac.jp:/home/username/exp sshfs_exp sshfs: error while loading shared libraries: libfuse.so.2: cannot open shared object file: No such file or directory
ライブラリのパスの指定が間違っている。CentOS 4.7ではfuseの./configureをするときに--prefix=/usrのオプションを付けないと、このエラーがでる。解決策としては、--prefix=/usrのオプションを付けて./configureし、makeし直すか、 LD_LIBRARY_PATH を指定してsshfsを実行するか、libfuse.so.2のリンクを/usr/libに作るか、ldに登録する。
方法1: makeし直し。 $ cd # ホームディレクトリに移動 $ cd sshfs # 上で作ったコンパイル用の一時作業ディレクトリへ移動。 $ cd fuse-2.8.1 # 上出作ったfuse用の作業ディレクトリに移動。 # su # スーパーユーザーになる。 Password: rootのパスワードを入力 # rmmod fuse # fuseモジュール削除。 # make uninstall # exit $ make clean; make # make し直し。 # su # スーパーユーザーになる。 Password: rootのパスワードを入力 # make install # exit $ cd $ sshfs username@be.nucl.ap.titech.ac.jp:/home/username/exp sshfs_exp # マウント 方法2: LD_LIBRARY_PATH を指定 $ locate libfuse.so.2 # libfuse.so.2 の場所を調べる。デフォルトでは、以下の場所である。 ... /usr/local/lib/libfuse.so.2 ... $ LD_LIBRARY_PATH=/usr/local/lib/libfuse.so.2 $ sshfs username@be.nucl.ap.titech.ac.jp:/home/username/exp sshfs_exp # マウント 方法3: libfuse.so.2のリンクを/usr/libに作る $ locate libfuse.so.2 # libfuse.so.2 の場所を調べる。デフォルトでは、以下の場所である。 ... /usr/local/lib/libfuse.so.2 ... # su # スーパーユーザーになる。 Password: rootのパスワードを入力 # cd /usr/lib # ln -s /usr/local/lib/libfuse.so.2 ./libfuse.so.2 # exit $ sshfs username@be.nucl.ap.titech.ac.jp:/home/username/exp sshfs_exp # マウント 方法4: libfuse.so.2のパスをldに登録する $ locate libfuse.so.2 # libfuse.so.2 の場所を調べる。デフォルトでは、以下の場所である。 ... /usr/local/lib/libfuse.so.2 ... # su # スーパーユーザーになる。 Password: rootのパスワードを入力 # echo '/usr/local/lib' > /etc/ld.so.conf.d/fuse.conf # ldconfig # exit $ sshfs username@be.nucl.ap.titech.ac.jp:/home/username/exp sshfs_exp # マウント
$ sshfs username@be.nucl.ap.titech.ac.jp:/home/username/exp sshfs_exp fuse: device not found, try 'modprobe fuse' first
メッセージどおりrootになって# modprobe fuseを実行。
$ sshfs username@be.nucl.ap.titech.ac.jp:/home/username/exp sshfs_exp fuse: failed to open /dev/fuse: Permission denied $ ls -l /dev/fuse crw------- 1 root root 10, 229 11月 18 04:14 /dev/fuse
rootになって# chmod o+rw /dev/fuseなどと実行。これで、すべてのユーザーがマウント可能になる。個別のユーザーがマウントできるようにするには、そのユーザーをfuseグループに追加すればよい?
$ cd $ cd sshfs_exp $ ls ls: .: Input/output error
接続が切れたのか?$ fusermount -u sshfs_expをして、再びマウント。根本的な解決はそのうち調べる。sshの接続を切れないようにするには、/home/username/.ssh/configというファイルを作りServerAliveInterval 60と書く。OpenSSHのクライアントだと大丈夫だが、ssh2はこれで良いのか?OpenSSHかssh2かは、man ssh とすればわかる。sshfs 実行時に-o reconnect というオプションも付ける?
$ sshfs username@be.nucl.ap.titech.ac.jp:/home/username/exp sshfs_exp read: Connection reset by peer
ネットワーク接続が切れているとこのメッセージがでる。ネットワークをつなげれば良い。