<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Sshfs on BINGBlog</title><link>https://20.48.50.55.sslip.io/tags/sshfs/</link><description>Recent content in Sshfs on BINGBlog</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Wed, 16 Sep 2026 22:40:00 +0800</lastBuildDate><atom:link href="https://20.48.50.55.sslip.io/tags/sshfs/index.xml" rel="self" type="application/rss+xml"/><item><title>把云主机挂成本地盘：WSL + Windows 双端实战</title><link>https://20.48.50.55.sslip.io/posts/2026-09-16-mount-azure-vm/</link><pubDate>Wed, 16 Sep 2026 22:40:00 +0800</pubDate><guid>https://20.48.50.55.sslip.io/posts/2026-09-16-mount-azure-vm/</guid><description>&lt;p&gt;博客和代理跑在同一台 Azure 小机器上，改文件只能 &lt;code&gt;ssh&lt;/code&gt; + &lt;code&gt;vim&lt;/code&gt;。于是把它的家目录挂成本地盘：WSL 里是普通路径，Windows 里是盘符。&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="最终效果：资源管理器里的 Z: 盘" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://20.48.50.55.sslip.io/images/posts/mount-azure-vm/z-drive.png"&gt;&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;场景&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;方案&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;终端 / VS Code&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;WSL：&lt;code&gt;~/remote/vm&lt;/code&gt;（sshfs + systemd，断线自愈）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;资源管理器&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Windows：&lt;strong&gt;Z: 盘&lt;/strong&gt;（rclone + WinFsp）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;前提：这台机器&lt;strong&gt;直连不通&lt;/strong&gt;——TCP 握手能通，SSH 立刻被 reset，所有流量必须走本机 clash 代理（&lt;code&gt;127.0.0.1:7890&lt;/code&gt;）。&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="架构" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://20.48.50.55.sslip.io/images/posts/mount-azure-vm/architecture.svg"&gt;&lt;/p&gt;&#10;&lt;h2 id="wsl-侧sshfs--systemd-自愈"&gt;&lt;a href="#wsl-%e4%be%a7sshfs--systemd-%e8%87%aa%e6%84%88" class="header-anchor"&gt;&lt;/a&gt;WSL 侧：sshfs + systemd 自愈&#10;&lt;/h2&gt;&lt;p&gt;sshfs 协议成熟、支持断线重连，用起来和本地路径没差别。先让 SSH 走代理：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Host proxy-vm&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; HostName 20.48.50.55&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; User azureuser&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; IdentityFile ~/.ssh/id_rsa&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ProxyCommand nc -X connect -x 127.0.0.1:7890 %h %p&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;再交给 systemd user 服务托管，断线自动重挂：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ~/.config/systemd/user/azure-proxy-vm-mount.service&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[Unit]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;Description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Mount Azure proxy-vm home via SSHFS&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;StartLimitIntervalSec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[Service]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;simple&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;ExecStartPre&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;-/usr/bin/fusermount3 -uz %h/remote/vm # 清掉残留挂载&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/usr/bin/sshfs proxy-vm:/home/azureuser %h/remote/vm -f \&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; -o reconnect,ServerAliveInterval=15,ServerAliveCountMax=3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;ExecStop&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/usr/bin/fusermount3 -u %h/remote/vm&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;Restart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;always&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;RestartSec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;10&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[Install]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;WantedBy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;default.target&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl --user &lt;span class="nb"&gt;enable&lt;/span&gt; --now azure-proxy-vm-mount&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo loginctl enable-linger &lt;span class="nv"&gt;$USER&lt;/span&gt; &lt;span class="c1"&gt;# 不登录也保活&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;实测：&lt;code&gt;kill -9&lt;/code&gt; 后 10 秒内自动恢复。&lt;/p&gt;&#10;&lt;h2 id="windows-侧为什么最后选了-rclone"&gt;&lt;a href="#windows-%e4%be%a7%e4%b8%ba%e4%bb%80%e4%b9%88%e6%9c%80%e5%90%8e%e9%80%89%e4%ba%86-rclone" class="header-anchor"&gt;&lt;/a&gt;Windows 侧：为什么最后选了 rclone&#10;&lt;/h2&gt;&lt;p&gt;目标：资源管理器里出现一个盘符。&lt;/p&gt;&#10;&lt;p&gt;先试了 &lt;strong&gt;SSHFS-Win&lt;/strong&gt;（WinFsp 上的 sshfs 移植），挂载直接报 &lt;code&gt;read: Connection reset by peer&lt;/code&gt;：它不支持 SOCKS 代理，Windows 上也没有 &lt;code&gt;connect&lt;/code&gt; / &lt;code&gt;ncat&lt;/code&gt; 这类跳板工具，直连又会被 reset。&lt;/p&gt;&#10;&lt;p&gt;换成 &lt;strong&gt;rclone&lt;/strong&gt;：自带 SSH 客户端，一行 &lt;code&gt;socks_proxy&lt;/code&gt; 就能走 clash，私钥、known_hosts 校验都支持：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# %APPDATA%\rclone\rclone.conf&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[azure]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;sftp&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;host&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;20.48.50.55&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;azureuser&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;key_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;C:/Users/&amp;lt;用户名&amp;gt;/.ssh/id_rsa&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;socks_proxy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;127.0.0.1:7890&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;known_hosts_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;C:/Users/&amp;lt;用户名&amp;gt;/.ssh/known_hosts&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;rclone&lt;/span&gt; &lt;span class="nb"&gt;mount &lt;/span&gt;&lt;span class="n"&gt;azure&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;azureuser&lt;/span&gt; &lt;span class="n"&gt;Z:&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-vfs-cache-mode&lt;/span&gt; &lt;span class="n"&gt;full&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;盘符出现，&lt;code&gt;Z:\&lt;/code&gt; 也能列目录，但&lt;strong&gt;资源管理器里没有&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;h2 id="最大的坑盘符按登录会话隔离"&gt;&lt;a href="#%e6%9c%80%e5%a4%a7%e7%9a%84%e5%9d%91%e7%9b%98%e7%ac%a6%e6%8c%89%e7%99%bb%e5%bd%95%e4%bc%9a%e8%af%9d%e9%9a%94%e7%a6%bb" class="header-anchor"&gt;&lt;/a&gt;最大的坑：盘符按登录会话隔离&#10;&lt;/h2&gt;&lt;p&gt;结论：&lt;strong&gt;Windows 的盘符按登录会话隔离。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;量一下进程令牌里的 &lt;code&gt;AuthenticationId&lt;/code&gt;（登录会话 ID）：&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="会话隔离验证" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://20.48.50.55.sslip.io/images/posts/mount-azure-vm/session-check.svg"&gt;&lt;/p&gt;&#10;&lt;p&gt;WSL 的 interop 进程也在同一个 Windows 会话里，但令牌属于&lt;strong&gt;另一个登录会话&lt;/strong&gt;——从那儿挂载的 Z:，Explorer 看不见。&lt;/p&gt;&#10;&lt;p&gt;（小坑：&lt;code&gt;GetTokenInformation&lt;/code&gt; 的 &lt;code&gt;TokenStatistics&lt;/code&gt; 类号是 &lt;strong&gt;10&lt;/strong&gt;，不是 12——12 是 &lt;code&gt;TokenSessionId&lt;/code&gt;；&lt;code&gt;AuthenticationId&lt;/code&gt; 在结构体偏移 8 字节。）&lt;/p&gt;&#10;&lt;p&gt;解法：挂载必须从&lt;strong&gt;交互会话&lt;/strong&gt;启动。两个入口：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;计划任务&lt;/strong&gt;：登录时自动跑（隐藏窗口）&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;&lt;code&gt;azure-vm-remount.cmd&lt;/code&gt;&lt;/strong&gt;：需要手动重挂时双击一下&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;至此，Z: 可见、可用、可自启。&lt;/p&gt;&#10;&lt;h2 id="另一个问题wsllocalhost-看不到-fuse-挂载"&gt;&lt;a href="#%e5%8f%a6%e4%b8%80%e4%b8%aa%e9%97%ae%e9%a2%98wsllocalhost-%e7%9c%8b%e4%b8%8d%e5%88%b0-fuse-%e6%8c%82%e8%bd%bd" class="header-anchor"&gt;&lt;/a&gt;另一个问题：&lt;code&gt;\\wsl.localhost&lt;/code&gt; 看不到 FUSE 挂载&#10;&lt;/h2&gt;&lt;p&gt;WSL 里挂好了，但从 &lt;code&gt;\\wsl.localhost\Ubuntu\...&lt;/code&gt; 访问是空的。&lt;/p&gt;&#10;&lt;p&gt;原因：这个入口由 WSL 的 &lt;strong&gt;9p 文件服务器&lt;/strong&gt;提供，只导出 ext4 根文件系统与 &lt;code&gt;/mnt/c&lt;/code&gt; 这类 drvfs；&lt;strong&gt;FUSE 挂载（sshfs / rclone / NFS / CIFS）一概不导出&lt;/strong&gt;。这是 WSL 的架构限制，没有开关。&lt;/p&gt;&#10;&lt;p&gt;所以 Windows 端要自己挂一份，不能借 WSL 的挂载。&lt;/p&gt;&#10;&lt;h2 id="日常使用"&gt;&lt;a href="#%e6%97%a5%e5%b8%b8%e4%bd%bf%e7%94%a8" class="header-anchor"&gt;&lt;/a&gt;日常使用&#10;&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl --user restart azure-proxy-vm-mount &lt;span class="c1"&gt;# WSL 挂载卡住时&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Z:\ # Windows 直接访问&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:\Users\&amp;lt;用户名&amp;gt;\bin\azure-vm-remount.cmd # 重挂&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:\Users\&amp;lt;用户名&amp;gt;\bin\azure-vm-umount.cmd # 卸载&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="小结"&gt;&lt;a href="#%e5%b0%8f%e7%bb%93" class="header-anchor"&gt;&lt;/a&gt;小结&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;直连不通就全线走代理&lt;/strong&gt;：sshfs 用 &lt;code&gt;ProxyCommand&lt;/code&gt;，rclone 用 &lt;code&gt;socks_proxy&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;挂载要有自愈&lt;/strong&gt;：systemd 的 &lt;code&gt;Restart=always&lt;/code&gt;、rclone 的 &lt;code&gt;--vfs-cache-mode&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;盘符是登录会话级的&lt;/strong&gt;：务必从交互会话启动挂载，否则 Explorer 看不见&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;&lt;code&gt;\\wsl.localhost&lt;/code&gt; 不导出 FUSE 挂载&lt;/strong&gt;：Windows 端直接另挂一份&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item></channel></rss>