在M1 Macbook上使用SSHFS挂载SFTP协议文件系统

Mounting SFTP Filesystem on M1 MacBook

# 无中生有的需求

- 其实我并不怎么看电影。

- ……好吧,我承认,偶尔想看……又或许只是喜欢拥有的感觉罢了。

欲望,总是在无边无际地扩张。“不得已”买了Raspberry Pi,向辣爸讨了块3TB机械,也算入了NAS的门。

过去用着Manjaro+Windows,可以直接在Gnome Nautilus中挂载树莓派的SFTP服务器,双击视频就可以通过Celluloid播放。然而这在macOS上似乎没有完美的解决方案,试用了CyberduckTansmitElecterm,却发现统统不能做到Manjaro上那样丝滑的体验。最好的方案也只能用FileZilla右键获取sftp://地址后粘贴到VLC播放。

于是,目光转向歪门邪道——尝试挂载服务器到Finder。

# 百无一用的折腾

SSHFS似乎是我能找到的唯一挂载方案。

# 安装macFUSE

从官网下载macFUSE 4.0.5,直接打开.dmg文件安装。安装完成后不出意外需要重启macOS。

# 安装编译依赖

老规矩,用homebrew安装依赖最为简便快捷。

# Install Apple Development Tools
xcode-select --install
# Install Homebrew
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

然后安装必须的依赖,包括python与glib。

brew install python@3.9
brew install glib

# 下载并修改SSHFS源码

由于最新版的SSHFS 3.7.1并不支持macOS,因此需要从GitHubRepo下载2.10版本的源码

解压后,根据Pull Request #58的提示,找到#1724行,修改sshfs.sync_read为0。

// Force async even if kernel claims its doing async.
// MacOS, see https://github.com/osxfuse/sshfs/issues/57
sshfs.sync_read = 0;

然后,修改#18行的# include <fuse_darwin.h>#include <fuse.h>

# 编译

参照SSHFS编译指南进行编译。首先cd进入解压得到的sshfs-2.10文件夹,然后依次运行如下指令进行编译。

./configure
make
sudo make install

# 运行

sshfs [user@]host:[dir] mountpoint [options]
# sshfs [用户名@]服务器地址:[服务器路径] 本地挂载路径 [选项]

初次挂载不成功,因为macFUSE需要向系统添加内核插件。macFUSE提示,要进入系统设置->安全与隐私System Preferences -> Security and Privicy)关闭系统安全机制,才能够正确加载挂载所需的内核插件。

Prompt To Enable System Extentions

依照Apple官方指南进入恢复模式进行修改。

  1. 在搭载 Apple 芯片的 Mac 上,选取苹果菜单->关机

  2. 按住电源按钮直至看到正在载入启动选项

  3. 点按选项,然后点按继续

    如有要求,请输入管理员帐户的密码。

    Mac 将以恢复模式(Recovery Mode)打开。

  4. macOS 恢复中,选取实用工具->启动安全性实用工具(Startup Security Utilities)。

  5. 选择要用于设定安全策略的启动磁盘。

    如果磁盘已使用文件保险箱加密,请点按解锁,输入密码,然后点按解锁

  6. 点按安全策略(Security Policy)。

  7. 检查以下安全性选项:

    • 完整安全性:确保只有当前的操作系统或者当前 Apple 信任的签名操作系统软件才能运行。此模式要求在安装软件时接入网络。
    • 降低安全性:允许运行 Apple 信任过的任何版本的签名操作系统软件。
  8. 我们需要选择降低安全性来启用macFUSE,输入管理员用户名和密码:

    • 选择“允许用户管理来自被认可开发者的内核扩展”复选框以允许使用旧版内核扩展的软件进行安装。
  9. 点按,重新启动 Mac 以使更改生效。

此时再进入系统设置->安全与隐私,发现下方已经多出了一个选项,选择后,可以运行任何来源的系统软件。再次运行sshfs命令,已经可以挂载。

# 乏善可陈的疗效

然而,在我花了几个小时安装、挂载成功之后,竟觉食之无味,弃之可惜。

使用FileZilla可以达到30MB/s内网的传输速度,而挂载的SSHFS文件系统仅仅能达到数十KB/s,完全无法流畅串流视频。

不总是止步,不总是成功;不总是成功,不总是止步。