SSH経由でNFSv3を使う

おおむねdarwinMacBook ProのうえのSnow Leopard)のうえで仕事したり遊んだり、仮想機械またはネットワーク(あるいはその両方)のうえのUNIXもしくはUNIXみたいなシステムにSSHでログインして暮らしている。リモートからローカルのファイルにアクセスしたいときがときどきある。

ときどきあるので、NFSSSHで転送している。問題はdarwinがNFSv4に対応していない点にある。対応していないので、NFSで利用するポートを限定する必要がある。Linux JFのhttp://www.linux.or.jp/JF/JFdocs/NFS-HOWTO/security.html#NFS-SSHが参考になる。以下、darwinと書いたとき、Snow Leopardのことを指す。


darwinのnfsdはlaunchdから起動される。/etc/exportsにエクスポートの設定が書かれているとnfsdが起動する。ちなみに初期状態だと/etc/exportsにはなにも書かれていない。たとえば、feedfaceというユーザの$HOME/Shareというディレクトリをエクスポートする設定を

/Users/feedface/Share -mapall=feedface 127.0.0.1

と書く(http://developer.apple.com/Mac/library/documentation/Darwin/Reference/ManPages/man5/exports.5.html参照)。


次に、nfsdが利用するポートを限定する必要があるので/etc/nfs.confに設定する。ちなみに初期状態だと/etc/nfs.confは存在しない(他の方法としてnfsdの引数で指定する方法もある)。nfsdが6049番ポートを、mountdが6050番ポートを利用し、非特権ポートからのマウントを許可するために

nfs.server.mount.port = 6050
nfs.server.mount.require_resv_port = 0
nfs.server.port = 6049

と書く(http://developer.apple.com/Mac/library/documentation/Darwin/Reference/ManPages/man5/nfs.conf.5.html参照)。もちろん指定するポートはなんでもいい。


ここまで設定したら、

ssh -R 6049:localhost:6049 -R 6050:localhost:6050 remote

とかやってリモート転送付きでSSHする。リモートからのマウントは、たとえばLinuxの場合、

sudo mount -t nfs -o port=6049,mountport=6050,nolock,tcp \
    localhost:/Users/feedface/Share /mnt/feedface-share

とかする。