filesystem/sshfs
NFSを用いずに、ssh を使ってネットワーク経由でファイルへアクセスする方法がある。それが sshfs。fsということで、mount することが可能。
仕組みとしては、リモート側で sftp を起動させ、ローカル側での操作を反映させるのを、fuse を用いて実現しているようだ。
必要なファイルのインストール †
まず、カーネルで、fuse が使えるようにしておく必要がある。通常は、モジュールとしてインストールされているだろうから、
# modprobe fuse
で組み込む。
自分でカーネルをビルドしている場合、CONFIG_FUSE_FS を有効にしてビルドする。
さらに、ソフトウェアの方のfuse をインストールする。パッケージ管理システム(yum, apt, emerge等)を使う場合、sshfsをインストールする際に、一緒にインストールされると思う。
そして、メインの sshfs をインストール。
# emerge -av fuse
設定 †
リモート側で、sshdが起動し、ローカル側からログイン出来れば良い。ただ、リモート側で、sshdの設定として、sftp が使えるようにしておく必要がある。
これは、sshd_config で、
Subsystem sftp /usr/lib/sftp-server
のように設定するが、通常は sshd_config の一番最後に書かれていて、必要があれば勝手に起動してくれる。
マウント †
ローカル側から、以下のように指定する。
% sshfs foo@server2:/home/foo ~/mnt
もし、マウント先のディレクトリ(ここでは mnt) が空でない場合は、nonempty をオプションとして指定する。
% sshfs -o nonempty foo@server2:/home/foo ~/mnt
通常は、マウントできない場合でも理由が表示されないので、その場合は、
% sshfs -o sshfs_debug foo@server2:/home/foo ~/mnt
のようにすると、ssh のエラーなどを確認できる。
umountは、
% fusermount -u ~/mnt
とする。
注意点 †
この時の注意点として、ssh で実際にログイン出来るユーザ権限でないと、マウントも行えないことが挙げられる。当然、パスワードが必要な場合は、ssh-askpass などを使っていないとパスワードを求められる。
また、ssh のオプションを渡すことが出来るので、セキュリティ証明書を使っている場合は、以下のようにして指定も可能。
% sshfs -o ssh_command="-i /home/bar/.ssh/rsa" foo@server2:/home/foo ~/mnt
_ fstab/automount
これらは、/etc/fstab へ記述し、起動時にマウントさせることも可能。ただし、上で述べたように、ユーザの違いやパスワードに注意。通常、root ではログインできないようにしてあると思うので、
sshfs#foo@server2:/home/foo /home/bar/mnt fuse rw,nodev,nonempty,user,noauto,noatime 0 0
のように、user, noauto を指定して、該当ユーザが手動でマウントすれば良いだろう。
あるいは、automount を使用して、
mnt -fstype=fuse,rw,nodev,nonempty,noatime sshfs#foo@server2:/home/foo
のように設定することも可能。
なお、セキュリティ証明書を使っての fstab/automount の利用はできない。理由は、/etc/fstab と automount のコンフィグでは、スペースが delimiter として扱われてしまうため、ssh_command="-i /home/bar/.ssh/rsa" を渡すことが出来ないから。
注意点 †
mountを一般user権限で行うと、sshfs でマウントしたファイルを直接実行することが出来ないという点。これは、filesystemに関係なく、mountの仕様。例えば、sshfs でマウントしたディレクトリに
-rwxr-xr-x 1 foo users 274 2006-07-06 19:35 make_menu.sh
というファイルがあったとして、これを実行すると、
% ./make_menu.sh ./make_menu.sh: 許可がありません.
となる。これは、マウントオプションに、exec を付けても変わらない。解決策として、
% sh ./make_menu.sh
のように、ローカル側のプログラムから読み込ませて実行してやれば良い。
