2022年12月18日星期日

在Windows下使用sshfs-win挂载sftp协议远程目录为本地磁盘

 

sshfs-win原理介绍

Windows下的sshfs-win与Linux下的sshfs原理基本一致,即它们都是建立在用户空间文件系统的基础上的应用。

sshfs将SFTP协议转换为FUSE的接口,FUSE再将这一接口以文件系统的方式暴露给内核;而sshfs-win则将SFTP协议转换为WinFSP(Windows文件系统代理)提供的接口,WinFSP所做的事情大致可以列举为以下三件:

注册一个设备驱动,让Windows能够挂载它 实现NT内核下CreateFile、ReadFile、WriteFile等API,管理读写队列 调用挂载到WinFSP上应用程序对应的FUSE接口 Windows的内核扩展与驱动程序非常复杂,因此为Windows开发内核态文件系统需要比在Linux下开发内核态文件系统更多的精力,而WinFSP作为FUSE接口到Windows文件系统的桥梁(这就是名字里代理的由来),能以更加全面与完整的API,以及对FUSE良好的兼容性,降低文件系统开发的难度。

接下来我们开始讲解如何安装与使用依赖WinFSP的sshfs-win。

sshfs-win安装与使用

上文提到,sshfs-win依赖WinFSP, 因此我们要首先安装WinFSP:https://github.com/billziss-gh/winfsp WinFSP安装结束后,我们再安装sshfs-win:https://github.com/billziss-gh/sshfs-win

两者都安装完毕后,我们在Windows的文件资源管理器中点击『映射网络驱动器』: 在弹出的对话框中,我们选定需要赋予的盘符,然后在文件夹中输入如下内容:

\\sshfs\用户名@IP地址!端口号

需要注意的是这里端口号不是我们通常使用的:,而是!,点击完成后,输入用户名对应的密码即可连接成功。

一些需要注意的细节

尽管sshfs-win的操作较为简单,但如果你想做更多操作两个需要注意的细节。

1. 如何挂载子目录

默认情况下,我们在输入第二节提到的连接串后,会将用户的家目录映射到Windows中,如果我们只是为了管理网站目录、做做备份或者是作为NAS使用,可能需要挂载其他子目录,但这时我们可能会发现,使用如下的连接串会导致连接时出现『位置不可用』的报错:

\\sshfs\用户名@IP地址!端口号\home

这是因为连接串中的路径是以用户家目录为参考的相对路径,即如果我们需要映射/home目录,则需要使用如下连接串

\\sshfs\用户名@IP地址!端口号\..\..\home

其中…\的数量需要根据实际情况决定,这样就能成功映射到我们所需的目录

这样的方式很容易造成误解,也让连接串变得复杂,因此sshfs-win支持另一种更为简明的连接串语法:

\\sshfs.r\用户名@IP地址!端口号\home

这里的r指的是root,即默认从根目录挂载而非家目录,这样就无需使用丑陋的…\回到根目录,我们可以直接从根目录开始,输入绝对路径来挂载我们所需的文件夹。

其实除了sshfs.r以外,还有其他的一些连接串规则能帮助sshfs-win变得更加方便,具体可以参考:https://github.com/winfsp/sshfs-win

2. 如何取消挂载

在已挂载的盘符上右键选择断开连接即可取消挂载。

在使用sshfs-win的时候,可能会出现无法卸载盘符的情况,无论通过文件资源管理器右键断开连接,还是通过cmd执行net use 盘符: /delete操作,均会在提示卸载成功后发现盘符依旧存在。 这可能是由于和其他应用程序的冲突引起。冲突可能不便解决,但我们可以利用上文描述过的原理,即WinFSP为sshfs提供支持,从WinFSP的角度下手解决这个问题。

我们打开命令提示符(或者PowerShell,取决于你的喜好),定位目录到WinFSP的安装目录,默认应该是C:\Program Files (x86)\WinFsp\bin\,然后执行如下命令:

.\launchctl-x64.exe list

这时它会列出正在运行的挂载任务,

这里可以看到,某条挂载任务的语法存在错误,这可能是导致它无法正常取消挂载的原因,这时候我们可以执行如下命令来取消挂载:

.\launchctl-x64.exe stop sshfs root@xxx...

命令执行成功后,我们打开文件资源管理器就会发现之前无法取消挂载的盘符已经成功消失。

其他的替代品

尽管sshfs-win简单直接,但如果读者需要更多功能(如图形界面、缓存等),就需要其他的替代品来实现同样的功能。这里推荐几款替代品:

rclone:一款号称『挂载任何存储服务』的跨平台开源软件,支持范围之广从Amazon S3到Google Drive,或者是更为传统的FTP、SFTP,甚至内存!rclone提供了超过30种存储目标,并提供充分的自定义选项支持,可以实现缓存、权限等复杂配置。美中不足的是rclone并未提供图形界面,而在Windows下编写服务配置文件较为复杂,因此该软件适合有较多自定义需求的用户使用。 raidrive: raidrive相对比rclone最大的特色就是提供了图形界面支持,可以更方便地管理挂载目录,但这是一款商业软件,免费套餐只支持较少的挂载目标,也无法支持缓存等高级功能。 类似的软件还有很多,如SFTP Drive等,读者可以根据自己的需求挑选适合自己的软件。

需要注意的是,这些软件的原理大多类似,其中还有不少是基于WinFSP的二次开发,因此在性能和稳定性方面,它们是相差不多的。