使用 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 |
|
接下来创建一个本地目录,用于挂载远程文件系统。例如,可以在本地的 /mnt/shared
目录下创建一个空目录:
1 |
|
然后就可以直接使用 SSHFS 命令挂载远程文件系统了。以下是 SSHFS 命令的基本用法:
1 |
|
user@
:远程主机的用户名(如果不指定,默认使用当前用户名)。host
:远程主机的 IP 地址或主机名。dir
:远程主机上要挂载的目录路径。mountpoint
:本地计算机上用于挂载远程文件系统的目录路径。options
:可选的挂载选项,例如-o username=user,password=pass
可以指定用户名和密码进行挂载。
例如,要将远程主机上的 /home/user/files
目录挂载到本地的 /mnt/shared
目录下,可以使用以下的命令:
1 |
|
输入远程主机的密码(如果使用密码进行身份验证)或提供 SSH 密钥(如果使用密钥进行身份验证)即可。
现在,你可以像访问本地文件系统一样访问远程文件系统。在本地计算机上,你可以使用 git
直接把代码推到内网仓库中了。
当你不再需要访问远程文件系统时,可以使用以下的命令卸载它:
1 |
|
例如,要卸载 /mnt/shared
目录下的远程文件系统,可以使用以下命令:
1 |
|
这就是使用 SSHFS 共享文件夹的基本步骤,特别简洁清晰。