東京工業大学大学院理工学研究科基礎物理学専攻中村研究室メンバー

ホームページおぼえがき > SSHファイルシステム

SSHファイルシステム

SSHファイルシステムおぼえがき。
(間違いが沢山あるかも。)

SSHファイルシステム(SSHFS)

SSHファイルシステムを使うと、ssh コマンドで入れるPC上のファイルを、NFS(ネットワークファイルシステム)の様に手元のPCにマウントすることが出来る。よって、NFSサーバは立ち上がっていないが、SSHサーバは立ち上がっているというようなPC上のファイルをマウントすることが出来る。ただし、そのPCにアカウントを持ちsshで入れなければならない。SSHファイルシステムを使うには、SSHサーバが立ち上がっているPCでの設定は必要なく、手元にあるクライアントPCにSSHファイルシステムの実装であるsshfsコマンドをインストールすれば良い。

sshfsインストール(CentOS 4.7)

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アンインストール(CentOS 4.7)

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の作業ディレクトリを削除。

fuse実行(CentOS 4.7)

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

sshfsでマウント(CentOS 4.7)

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でもよい。

sshfsインストール時及び使用時のエラー集(CentOS 4.7)

インストールがんばった軌跡。

■ glib-2.0がない

$ ./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 を実行すると大丈夫。

■ libfuse.so.2がない

$ 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 # マウント

■ /dev/fuseがない

$ 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グループに追加すればよい?

■ Input/output error

$ 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

ネットワーク接続が切れているとこのメッセージがでる。ネットワークをつなげれば良い。

参考文献・webページ


ページ制作履歴
2009/11/17 制作開始
2009/11/17 webにアップ
2010/05/49 Permission deniedを修正