使用 SSHFS 共享文件夹

最近在做大模型开发训练的过程中碰到一个难题:

  • 我需要利用云服务器的 GPU 做训练,因此代码需要放置在云服务器上;
  • 代码开发完,我又需要 git push 到内网的仓库地址上;
  • 云服务器没办法直接访问内网代码仓库。

我最开始想到的方案是用 scp 或者 sftp 把云服务器上的代码拷贝到本地,再用本地的网络推到内网代码仓库中。但是这样会浪费掉大量的云服务器流量,特别是 .git 包含了特别多的 commit 数据,每次同步起来都很慢。

后来,我想到了用文件夹共享的方式,把云服务器上的代码仓库共享到本地的一个挂载点,然后利用本地的网络推到内网仓库。这个方案的基本思路没什么问题,关键是采用哪种文件共享方式。我最开始用的是 Samba 共享,但本地用 mount 去挂载的时候,文件和文件夹的权限继承总是出错,不知道是 mount 不能直接继承远程 Samba 共享文件夹的权限,还是需要怎么特殊配置,反正没成功。

Samba 不好用,那就用 SSHFS。SSHFS (Secure Shell File System) 是一种通过 SSH 协议在本地计算机上挂载远程文件系统的工具。它允许你像访问本地文件系统一样访问远程主机上的文件和目录。用起来很方便,原来建立好的 SSH 通信机制,都可以直接继承使用,几乎不需要额外的配置;最关键的是,我不必再头疼于文件权限了。

要使用 SSHFS,需要再本地计算机上安装 SSHFS 软件包。例如,在 Ubuntu 上,可以使用命令安装 SSHFS:

1
$ sudo apt-get install sshfs

接下来创建一个本地目录,用于挂载远程文件系统。例如,可以在本地的 /mnt/shared 目录下创建一个空目录:

1
$ mkdir /mnt/shared

然后就可以直接使用 SSHFS 命令挂载远程文件系统了。以下是 SSHFS 命令的基本用法:

1
sshfs [user@]host:[dir] [mountpoint] [options]
  • user@:远程主机的用户名(如果不指定,默认使用当前用户名)。
  • host:远程主机的 IP 地址或主机名。
  • dir:远程主机上要挂载的目录路径。
  • mountpoint:本地计算机上用于挂载远程文件系统的目录路径。
  • options:可选的挂载选项,例如 -o username=user,password=pass 可以指定用户名和密码进行挂载。

例如,要将远程主机上的 /home/user/files 目录挂载到本地的 /mnt/shared 目录下,可以使用以下的命令:

1
sshfs user@host:/home/user/files /mnt/shared

输入远程主机的密码(如果使用密码进行身份验证)或提供 SSH 密钥(如果使用密钥进行身份验证)即可。

现在,你可以像访问本地文件系统一样访问远程文件系统。在本地计算机上,你可以使用 git 直接把代码推到内网仓库中了。

当你不再需要访问远程文件系统时,可以使用以下的命令卸载它:

1
$ fusermount -u [mountpoint]

例如,要卸载 /mnt/shared 目录下的远程文件系统,可以使用以下命令:

1
$ fusermount -u /mnt/shared

这就是使用 SSHFS 共享文件夹的基本步骤,特别简洁清晰。


使用 SSHFS 共享文件夹
https://aizpy.com/2023/12/29/sshfs/
作者
aizpy
发布于
2023年12月29日
许可协议