使用 WinFsp 和 Rclone 实现 Windows 和 Linux 文件共享

#tech

Table of Contents

使用 WinFsp 和 Rclone 实现 Windows 和 Linux 文件共享

最近写实验报告等文档工作经常需要在 Windows 笔记本和实验室 Linux 主机交换文件(主要是截图),今天终于受不了敲 scp 命令了,所以探索了一个用 WinFspRclone 实现两个系统间文件共享的方案。这下远程 Linux 裸机开发的文件共享的问题彻底解决了,WSL 崩的频率已经让人无法使用了……

前置条件

  1. WinFsp

winfsp

  1. Rclone

请自行选择合适版本下载

  1. 确保两台机器之间能够建立 SSH 连接

配置 SSH 隧道与端口转发

编辑 Windows 下的 ~/.ssh/config 文件。在目标节点的配置中,将本地端口(如 2222)转发到远端的 22 端口,这样可以将读写文件的请求通过 SSH 隧道转发到远程主机

示例配置:

# 目标节点
Host Lab
  Hostname xxx
  User your_user_name

  # 将本地 2222 端口流量转发至远端 22 端口
  LocalForward 2222 127.0.0.1:22

  ServerAliveInterval 60
  ServerAliveCountMax 3

配置 Rclone

在 Rclone 程序同级目录下创建配置文件 rclone.conf。配置 Rclone 直接挂载本地暴露出的 2222 端口(建立 SSH 连接之后,访问本地 2222 端口即通过 SSH 访问远程主机)

[lab]
type = sftp
host = 127.0.0.1
port = 2222
user = your_user_name
key_file = path/to/your/identity/file
shell_type = unix
md5sum_command = md5sum
sha1sum_command = sha1sum

编写静默挂载脚本

创建 PowerShell 脚本 Mount-Lab.ps1(名字什么的随便啦)。该脚本负责清理历史进程、建立后台隧道,并执行挂载命令。

# E:\apps\rclone\Mount-Lab.ps1

# 清理可能残留的挂载进程
Stop-Process -Name "rclone" -Force -ErrorAction SilentlyContinue

# 启动 SSH 隧道
Start-Process -FilePath "ssh.exe" -ArgumentList "-N lab" -WindowStyle Hidden

# 等待隧道建立
Start-Sleep -Seconds 3

$mount_point = "E:\remote\lab"
$parent_dir = Split-Path $mount_point -Parent
$cache_dir = "E:\apps\rclone\cache"                 # 缓存目录
$rclone_exe = "E:\apps\rclone\rclone.exe"
$config_path = "E:\apps\rclone\rclone.conf"

# 注意 mount 命令后的 lab 要与 rclone.conf 里定义的名称保持一致。
# 只挂载自己的用户目录最好,以免手残删掉根目录
$rclone_args = @(
    "mount", "lab:/home/eliza", """$mount_point""",
    "--config", """$config_path""",
    "--vfs-cache-mode", "full",
    "--cache-dir", """$cache_dir""",
    "--vfs-cache-max-size", "10G",
    "--vfs-cache-max-age", "24h",
    "--dir-cache-time", "15s",
    "--vfs-read-chunk-size", "16M",
    "-o", "ThreadCount=16"
)

if (!(Test-Path $parent_dir)) {
    New-Item -ItemType Directory -Force -Path $parent_dir | Out-Null
}
if (Test-Path $mount_point) {
    Remove-Item -Path $mount_point -Force -Recurse
}

# 执行挂载
Start-Process -FilePath $rclone_exe -ArgumentList $rclone_args -WindowStyle Hidden
  • --vfs-cache-mode fullWinFsp 拦截的读写请求会先被 Rclone 缓存到 Windows 的本地临时目录,待文件句柄关闭后,再异步同步到远程主机.在读取时,远程数据会以数据块为单位下载到本地并驻留,后续读会命中本地磁盘
  • --dir-cache-time 15s 目录结构缓存设为 15s,确保远程主机进行文件的增删时 Windows 能够快速更新。不设成更短的时间区间是因为,目录结构同步的请求延迟高,越短性能开销越大

起初我的挂载点是一个全局的盘符 E:\,日常使用中发现资源管理器会经常卡顿,浏览器文件选择会直接卡死,网络 I/O 性能开销过大。于是更改挂载点为一个普通目录,并启用缓存目录,不再出现卡顿情况

配置系统开机静默自启

利用 Windows 任务计划程序实现登录后自动挂载:

  1. 按下Win + R 输入 taskschd.msc 启动任务计划程序,点击右侧的 创建任务

task-create

  1. 常规 标签页:勾选底部的 隐藏

general

  1. 触发器 标签页:新建触发器,开始任务选择 登录时,勾选 延迟任务时间 并输入 30 秒(这是为了确保系统底层网络栈已完全初始化)

trigger

new

  1. 操作 标签页:新建操作,程序填入 powershell.exe,参数填入: -WindowStyle Hidden -ExecutionPolicy Bypass -File "E:\apps\rclone\Mount-Lab.ps1"

operation

注意 -File 参数后要换成脚本所在的正确路径

  1. 条件 标签页:取消勾选“只有在计算机使用交流电源时才启动此任务”,勾选“只有在以下网络连接可用时才启动”,选择“任何连接”

cond

  1. 设置 标签页:取消勾选“如果任务运行时间超过以下时间,停止任务”,勾选“如果任务失败,按以下频率重新启动”(每一分钟,五次)

settings

保存设置并重启系统。登录后等待 30 秒,就可以在资源管理器中会出现映射好的 Z: 盘啦