Fedora5

SSHFSとは

Unixでネットワーク越しに他のPCのファイルをマウントする場合は、必然的にNFSになると思います。NFSは80年代から続く枯れたプロトコルであり、初期のLinuxシステムでさえサポートしている程の豊富なバージョンがあります。ところが言い意味でも枯れたプロトコルであるNFSは、インターネット環境において利用するにはセキュリティがほぼ考慮されていないことから、インターネット越しにNFSを使おうとすると、FWを慎重に設定しVPNを張らなければなりません。

SSHプロトコルはSCP/SFTPによるファイル転送をサポートして、ネットワーク越しのファイル送受信にセキュリティを提供しています。セキュアなSSH経由でネットワークの先にあるPCをマウントしてしまうシステムが、SSHFSなのです。しかもSSHFSはクライアントのみでの実装です。サーバ側はSSHサーバさえあれば、特別な操作を必要としません。

SSHFSの実装は2つ有名で、FUSE-SSHFSとshfsがあります。shfsがSSHFSとして先に有名になったのですが、実装が強くLinuxカーネル依存で泥臭いコードだと聞いています。Kernel2.6に迅速に対応できなかったのも、早くから2.6に移行したFedoraにはマイナスでした。

FUSEはFilesystem in Userspace(ユーザ空間ファイルシステム)といい、Fedoraではextrasに含まれています。従来のファイルシステムはカーネルモジュールとして開発されるのですが、カーネルやファイルシステムの内部構造を理解していなければなりませんでした。FUSEフレームワークが提供するシンプルなAPIを通して、カーネルに直接依存しない形でのファイルシステムを提供できる様になります。FUSEのサポートは既にkernel2.4.21で標準に取り込まれており、Linuxカーネル2.4/2.6やFreeBSD6.0などで利用できます。

FUSE-sshfs

FUSE-sshfsは、FUSEフレームワークでのSSHFSの実装です。shfsと比べて実装もシンプルです。これからはインターネット越しにあるPCのファイルも、ローカルファイルと同様に扱えるのです。

とにかく使ってみよう

fuse-sshfsをインストールしてください。たったこれだけです。

# yum install fuse-shfs

ユーザ権限でマウントさせたいなら、補助グループにfuseを追加します。

# usermod -a -G fuse [username]

udev権限で /dev/fuse は、MODE="0660" OWNER="root" GROUP="fuse"で設定されます。詳しい設定はman udevを参照してください。MODE="0666"にすると全ユーザがsshfsを利用できる様になります。

# vi /etc/udev/rules.d/60-fuse.rules

マウントします。ユーザーで行うことが推奨されていますし、デフォルトでsshdはrootでのログインを許可していないはずです。manはありませんがオプションはsshfs --helpで参照することができます。マウント元のディレクトリは、scpコマンドと同じuser@host:dir形式で指定します。SSHの設定次第ですが、シグネチャの確認やパスワードを聞いてきます。

$ sshfs [user@]host:[dir] mountpoint [options]
  • ローカル権限を指定するには、 -o uid=500,gid=500 などとIDをOptionsに指定してください。ただ、これはローカル上でのお話なので、当然、接続ユーザがリモートでのアクセス権を所持してなければ「許可がありません」となります。
  • マウントしたユーザではない他のユーザやrootは、デフォルトではこのファイルシステムにアクセスできません。ファイルシステムレベルで弾かれるのでパーミッションすら見れません。そこで -o allow_other (root含む)や -o allow_root (2つのオプションは片方しか指定できません)が必要になります。これらは/etc/fuse.confの設定が必要です。

アンマウントします。fstabに書き込んでないのでfusermountを使います。SSHコネクションが残ってしまうことがあるので、正しくアンマウントやPCの終了を行ってください。

$ fusermount -u mountpoint

/etc/fuse.conf

まだfuse.confファイルがrpmパッケージには含まれていないようです。元々のリリースに含まれてないのですから、まだそれほど設定項目が多いわけでは無いことが幸いしてるようです。

この警告が出たらuser_allow_otherを追加します。

fusermount: option allow_other only allowed if 'user_allow_other' is set in /etc/fuse.conf
# echo 'user_allow_other' >> /etc/fuse.conf

exsample

コマンドを実際に見たいかもしれませんね。こんな感じに組み立てましょう。

$ sshfs weise@****.mmj.jp:/var/share /mnt/ssh -o uid=500,gid=500,allow_other

SSHでログインするのと同じメッセージが流れます。

The authenticity of host '****.mmj.jp (***.***.***.***)' can't be established.
RSA key fingerprint is ****.
Are you sure you want to continue connecting (yes/no)? yes
weise@****.mmj.jp's password:

fstabに設定する

FUSEバージョン2.4.0から可能になったそうです(FAQより)。頻繁に接続したいホストがあれば登録しておいても便利ですね。Fedora環境を個人ユースで利用しているなら可能ですね。

sshfs#user@host:/    /mnt/host    fuse    defaults    0 0
  • ドライブは、user@host:dir形式を書きます。接続ユーザ名を書くとそれに固定されます。
  • ファイルシステムは、fuseです。
  • オプションは、user,exec,suid,rw,async,noautoを使っています。auto(defaults)はお薦めできません。FUSEやsshfsのオプションもuid=500,gid=500,allow_otherなどと書けます。

fstabを設定したら通常のマウントオプションを使います。

$ mount /mnt/host