unix服务器间文件共享解决方案之sshfs
2010-12-27 10:32:37 阿炯

如果你能通过ssh来访问服务器,那么你就可以在那个服务器上设置文件夹并且在本地访问这个文件夹。sshfs使用fuse,因此要安装所有它需要的fuse附件,安装fuse-sshfs包,如果是Rpm系的Linux可在epel中找到。使用fuse-sshfs包提供的sshfs工具可以基于ssh直接挂载远程目录,不用像NFS一样还要export。Linux下文件简单共享的方法有几种:nfs、samba、sshfs或(s)ftp。

sshfs可以把ssh连接到的主机资源,映射到本机的文件系统当中,然后用户可以像操作本地文件一样操作,而实际的文件改动将通过ssh传输到远程主机当中。类似于mount了一个windows共享目录,或者另外一台linux主机的samba共享,或者是nfs共享,只是"共享协议"变成了ssh通道罢了。

SSHFS (Secure  SHell  FileSystem)  is a file system for Linux (and other operating systems with a FUSE implementation,such as Mac OS X or FreeBSD) capable of operating on files on a remote computer using just a secure shell login on  the remote computer. On the local computer where the SSHFS is mounted, the implementation makes use of the FUSE (Filesystem in Userspace) kernel module. The practical effect of this is that the end user  can  seamlessly  interact  with  remote files  being  securely served over SSH just as if they were local files on his/her computer. On the remote computer the SFTP subsystem of SSH is used.

用如下的命令来设置远程服务器:
sshfs {{user id}}@{{server hostname}}:{{desired remote share}}
{{desired local mount point}} -o idmap=user -o allow_other -o uid={{local user id}} -o
gid={{local group id}}

这段命令不只设置了远程共享,用uid和gid选项它可以解决了用户ID与你指定的ID不匹配的问题。如果两台机器间的网络连接状况很好的话,该软件性能非常好。当可以通过SSH访问远程服务器的时候,使用sshfs是设置该服务器的非常好的选择。即使没有用户id/主机不匹配这类问题,它那优良的性能也应当是你不错的选择,还提供相当出色的安全链路保证。

debian源中已经包含了sshfs了,以及所需的fuse包,直接apt安装就可以了,一共是三个包:“fuse-utils libfuse2 sshfs”。安装的时候会自动创建用户组fuse,要使用sshfs的用户需要先加到这个用户组里才行(记得完成后还要重新登录):
# usermod -a -G fuse hto

不然会没有权限执行fusermount:
fuse: failed to exec fusermount: Permission denied

在使用sshfs命令进行挂载时,会报下面的错误提示:
fuse: failed to open /dev/fuse: Permission denied

使用就简单的多了,一般来说,连接远程主机到本地用户:
sshfs user@hostname:path mount_point
$ sshfs hto@192.168.2.102:/home/hto /home/hto/freeoamnt/
hto@192.168.2.102's password:

$ df -h
文件系统              容量  已用 可用 已用% 挂载点
/dev/sda2             9.2G  824M  7.9G  10% /
tmpfs                 126M     0  126M   0% /lib/init/rw
udev                   10M  116K  9.9M   2% /dev
tmpfs                 126M     0  126M   0% /dev/shm
/dev/sda1             1.8G   44M  1.7G   3% /boot
/dev/sda5              37G  355M   35G   1% /home
/dev/sda6             4.8G  138M  4.4G   3% /tmp
hto@192.168.2.102:/home/hto 37G  1.1G   34G   3% /home/hto/freeoamnt

需要输密码就输密码,当然配置成自动登录的ssh更方便了,用完之后要umount,还可以:
fusermount -u mount_point

在普通用户环境下使用,非常方便的。如果想每次开机都自动挂载,可以在/etc/fstab中加入:
sshfs#user@hostname:path mount_point fuse defaults,auto,allow_other 0 0

这就要求必须先把ssh自动登录配置好了,让root用户能够使用user身份登录远程主机,另外allow_other这个参数很重要,没有这个参数的话,挂载过来的目录只有root能够访问。

相比于NFS来说sshfs简洁很多,它是基于fuse模块来实现的,可以认为sshfs所挂载的文件系统是fuse文件系统的一种实现。fuse文件系统全称为filesystem in userspace,它是用户空间的文件系统(其实是一个虚拟文件系统),其功能非常强大,可用于实现自己的文件系统。详细信息可以sshfs -h,man sshfs,man fusermount,man mount.fuse。

但是NFS比sshfs要完整的多,nfs毕竟是老牌的分布式文件系统,对数据的一致性、完整性实现的都比较完美,访问权限控制也比sshfs要丰富的多。总的来说,sshfs可以临时用来快速访问远程文件。非常类似于Windows下的带本地设备和资源(磁盘分区)带入到到被连接的远程主机中。

三者的在不同场景下的性能对比,请参考Jake的个人博客:NFS vs. SMB vs. SSHFS,在NAS环境下的对比。