Linux Tips


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

のように、ローカル側のプログラムから読み込ませて実行してやれば良い。

リンク

:filesystem


Last-modified: 2007/08/15 (水)