sshfs

sshfs教程

在linux或mac上,加载远程Linux服务器上的文件目录

[TOC]

安装

需依次安装以下三软件

macfuse

功能:使mac可用读取linux、windows的文件系统,应用于:

  • mac读写它们的U盘/移动硬盘
  • mac加载服务器上文件目录

官网 下载

sshfs

功能:从Mac加载Linux服务器上的文件目录

  • 依赖于macfuse
  • 只有命令行

官网 下载

macfusion

功能:sshfs的图形界面

官网已不再维护该软件,其版本不支持OSX Serria及以上系统

可用的fork版本: 我已验证,其Sierra Pre-release 3版本,OSX Serria和OSX Hgih Serria可用

更新

升级Mojave后使用sshfs要求升级FUSE

编辑文章

升级Mojave后,使用sshfs挂载远程目录失败,弹出对话框显示报错

Unsupported macOS Version FuseThe installed version of FUSE is too old for the operating system. Please upgrade your FUSE installation to one that is compatible with the currently running version of macOS.

尝试在系统偏好设置中升级FUSE

打开系统偏好设置,点FUSE

1

2

提示无可用更新,更新失败。

前往osxfuse.github.io下载

前往https://osxfuse.github.io,下载Stable Releases中的FUSE for macOS 3.8.2,安装之

而后sshfs可用使用了。

使用

ui用法

sshfs命令行用法

优点:使用此方法挂载后,从一处把笔记本带到另一处,连到另一个网后,挂载依然不断

挂载

sshfs <user>@<host>:<path> <mount_path> -o volname=<volume_name> -C -o reconnect -o transform_symlinks -o follow_symlinks #  -o local

-C:压缩,即-o compression=yes
-o reconnect:自动重连
-o transform_symlinks:表示转换绝对链接符号为相对链接符号
-o follow_symlinks:沿用服务器上的链接符号

-o local:视为本地磁盘,会在Finder/侧栏/设备 和 桌面 下出现图标名为volume_name

  • <user>@<host> 可以用~/.ssh/config中的服务器别名
  • 需先创建空文件夹<mount_path>
    • 若无此文件夹,则不会自动创建,mount失败
    • 若非空,mount期间,文件夹中原有的东西看不见了,但umount后又能看见
  • <mount_path><volume_name>可以同名

卸挂(二者等效)

法一 用图像界面推出

在Finder中,戳到<mount_path>/..MacBook Air下,右键<mount_path>,点“推出”

若设了-o local,还可

  • 或在Finder/侧栏/设备/<volume_name> 的右侧有个向上箭头,是推出按钮,按之即推出(推荐)

  • 或从桌面/<volume_name>,右键<mount_path>,点“推出”

法二 命令推出
umount <mount_path>
# 等效于
fusermount -u <mount_path>
  • 在mac是<fusermount>命令找不到,但umount可以用
  • 在服务器上,umount需要sudo,但fusermount -u可以用
  • 注意不是unmount

免密

这样子每次挂载的时候,都需要输入密码,可以设置成免密码登录:
将公钥追加到远程服务器:

cat .ssh/id_rsa.pub | ssh username@server "cat - >>.ssh/authorized_keys"

登录:

sshfs username@server:path local_path
umount mount_path

sshfs的bug处理

参考

服务器断连 – “保存路径不存在” / 无法ls (Input/output error) /无法 rm (Operation not permitted)

症状 当 mac 休眠、重启、换了个网络环境,可能与服务器断连(也可能保持连接)

  • 在软件(如sublime)里,之前打开的所mount目录下的文件,此时保存文件,会显示“保存路径不存在”
  • ls mac上用于mount的文件夹(如/Users/$USER/Desktop/mount/mounted_server)会报错
ls /Users/$USER/Desktop/mount
# 或
ls /Users/$USER/Desktop/mount/mounted_server
# 返回 ls: cannot access '/Users/$USER/Desktop/mount/mounted_server': Input/output error
  • rm mac上用于mount的文件夹,会报错
rm /Users/$USER/Desktop/mount/mounted_server -rf
# 返回 rm: cannot remove '/Users/$USER/Desktop/mount/mounted_server': Operation not permitted

以上症状出现任意一个,说明已经与远处服务器断开连接,但本地未umount

对策 依次做如下操作

  • 检查mac的网络连接
  • 关掉所有在用mount目录下文件的软件
  • umount <mount_path>
  • 再重新sshfs <user>@<host>:<path> <mount_path>

有文件在用 – 无法umount (Resource busy)

若显示

umount <mount_path>
或
fusemount -u <mount_path>
# 返回 umount(<mount_path>): Resource busy -- try 'diskutil unmount'

则说明此时mac上仍有软件在打开了所mount的文件夹下的文件

  • 法一:关闭软件再安全卸载

    • 实时监测哪些进程占用了<mount_path>

      watch -n 0.1 lsof <mount_path>   # 按 ctrl+c 结束
    • 需在那个软件中,在使用mount的文件夹下的文件的窗口内,⌘+W关闭窗口,再

      umount <mount_path>
      或
      fusemount -u <mount_path>

      可成功

    • 若还不行,⌘+Q退出整个软件,再umont <mount_path>fusemount -u <mount_path>

  • 法二:强制卸载

    sudo umount -l <mount_path>

    umount -h:

    -l, --lazy detach the filesystem now, clean up things later

此路径没挂载 – 无法umount (not currently mounted)

umount <mount_path> # 返回 umount: local_dir: not currently mounted

说明没有sshfs进程从<mount_path> 挂载。要想在<mount_path> 挂载,直接sshfs <user>@<host>:<path> <mount_path> 即可

此路径已挂载 – 无法mount(is itself on a OSXFUSE volume)

sshfs <user>@<host>:<path> <mount_path>
# 返回 mount_osxfuse: mount point <mount_path> is itself on a OSXFUSE volume

说明此时已有mount进程使用了<mount_path> ,<mount_path> 成为了挂载磁盘

可列出所有在sshfs进程

pgrep -lf sshfs

ls/rm 挂空了的路径 – (Device not configured)

若先前执行了

sshfs <mount_path> :.

然后ctrl-c或进程自动结束,则此时<mount_path>依旧sshfs被占用,称<mount_path>“挂空”

此时ls(或rm) <mount_path>(及其下的路径),会返回

ls(或rm): cannot open directory '/Users/$USER/Desktop/mount/': Device not configured

需要umount <mount_path>,解除sshfs对<mount_path>的占用

而后ls(或rm) <mount_path>正常返回

需手动杀进程

以上操作均解决不了,则需手动杀sshfs进程

pgrep -lf sshfs
# 会显示你sshfs时的命令,如
# 38371 sshfs -o transform_symlinks -o follow_symlinks <hostname>:/ /Users/$USER/Desktop/mount/mounted_server -o volname=<hostname> -o reconnect -o local

然后杀掉相应的挂载进程

kill -9 <相应的pid >

之后重新挂载响应的目录即可

Macfusion的bug处理

Macfusion显示Failed to Mount

  • 检测本机已经联网
  • 检查本机mount路径,知否有与所mount盘同名的文件夹(可能是mount该盘,从mac打开其中文件,断开连接后,又保存该文件,从而创建同名文件夹),请将此文件夹改名,再次mount即可成功
  • 如仍不行,或见所mount的磁盘图标变成蓝+灰色,而非绿色,则关闭sshfs程序mount此服务器的进程
ps aux | grep <该服务器在Macfision工具栏中的名字>(如cpu4) 或 <usr@server_address>(如someone@some.place.com)

返回

mac   24715   0.6  0.0  4267752    876 s004  S+    9:08下午   0:00.01 grep --color cpu4
mac   24093   0.0  0.0   729280   1516   ??  S     8:54下午   0:00.08 /Applications/Macfusion.app/Contents/PlugIns/sshfs.mfplugin/Contents/Resources/sshfs-static someone@some.place.com: /Users/$USER/Desktop/mount/cpu4 -p4514 -oNumberOfPasswordPrompts=1 -ocompression=yes -ofollow_symlinks -odefer_permissions -oauto_cache -f -ovolname=cpu4 -ovolicon=/Applications/Macfusion.app/Contents/PlugIns/sshfs.mfplugin/Contents/Resources/sshfs_icon.icns

输入

kill -9 24093

在Macfusion中重新mount该服务器

Macfusion列表全白

需要重启Macfusion——command+Q 只能关闭Macfusiion的前台,无法关闭其后台。重启后台需如下操作:

  • 法一 (等效于法二)
killall macfusionAgent
  • 法二
ps aux | grep macfusion

返回

USER PID     %CPU %MEM     VSZ    RSS   TT  STAT  STARTED      TIME COMMAND
mac  24105   0.0  0.0  4277992    916 s004  S+    8:54下午   0:00.01 grep --color macfusion
mac  24090   0.0  0.4  4345112  14996   ??  S     8:54下午   0:00.21 /Applications/Macfusion.app/Contents/Resources/macfusionAgent.app/Contents/MacOS/macfusionAgent

输入

kill -9 24105

重新点开Macfusion的图标

若再次进入目录仍报错、或卸挂失败,需杀掉sshfs之进程:

pgrep -lf sshfs # 列出
pkill -9 sshfs  # 杀死
pgrep -lf sshfs # 再列出,若空则杀尽

再重新挂载。

如仍不行

重启mac

为解决的bug

  • 显示

    Mount后,弹出对话框显示

    Could not mount filesystem: Mount process has terminated unexpectedly.

    Macfusion主界面显示

    gpu7 (Failed to Mount) Edit Mount

    自检:

    本机原来gpu7处,没有名为gpu7/的(可见或隐藏)文件夹或磁盘图标

    ps aux | grep gpu7 ps aux | grep <server_url> 都显示空

    killall macfusionAgent 后,从图标重启macfusionAgent.app,然后再mount gpu7,依然上述报错