GenStudio 全新上架 ComfyUI 工作流托管服务GenStudio 全新上架 ComfyUI 工作流托管服务 ,已适配主流 ckpt 模型与节点了解更多
Skip to content
回到全部文章

使用 rsync 传输数据到开发机

在向智算云平台的主机传输数据时,scp / sftp 是常用的命令行工具。但是如果对断点续传有比较高的要求,rsync 可能是更好的选择。

一个典型场景是文件夹包含大量小文件和几个大文件,并且网络带宽有限,那么 rsync 的增量传输和断点续传功能能够有效地减少带宽使用和传输时间。

Windows 和 macOS 对 rsync 的支持

  • Linux/macOS 基于 Unix,默认支持 rsync,一般可以直接在终端使用。
  • Windows 默认不支持 rsync,需要借助第三方工具,或者使用 Windows Subsystem for Linux (WSL),通过在 Windows 上运行 Linux 发行版,直接使用 rsync。
新手提示

Windows 端操作难度较高,如果不熟悉 Windows 开发,建议选择其他数据传输方式。

准备工作

本地安装 rsync

首先,我们需要确保本地机器上安装了 rsync。

bash
rsync --version

观察是否有输出,如果没有,需要安装 rsync。MacOS 通常预装了 rsync,但如果没有,可以借助 Homebrew 安装:

bash
brew install rsync

确认远程主机上的 rsync

如果开发机使用平台预置镜像,可能没有 rsync。

检查:

bash
rsync --version

如果没有,可以使用以下命令安装(以 Ubuntu 为例):

bash
sudo apt-get update
sudo apt-get install rsync

获取开发机 SSH 连接信息

请登录智算云平台,查看开发机的 SSH 连接命令。

alt text

SSH 连接命令示例:-p 33260 root@8.140.242.203

其中包含当前开发机的 SSH 端口号、用户名、SSH 主机 IP,下一步中将会使用。root 为默认 SSH 登录用户名(部分旧版实例展示为非 root 普通用户名,请重启)。

使用 rsync 传输数据

基本 rsync 命令结构

rsync 的基本命令结构如下:

bash
rsync [选项] 源目录 目标目录

包含 SSH 参数的命令结构

智算云平台的开发机使用非默认 SSH 端口,我们需要在 rsync 命令中指定端口。

使用 -e 选项来设置 SSH 参数后,rsync 命令结构变为如下格式:

bash
rsync -e "ssh -p PORT" [其他选项] 源目录 用户名@远程主机:目标目录

传输单个文件

要传输单个文件到远程主机,使用以下命令:

rsync -avz -e "ssh -p PORT" /path/to/local/file username@remote_host:/path/to/destination/
  • -a: 归档模式,保留文件属性
  • -v: 详细输出
  • -z: 压缩传输数据

例如,要将 ~/Desktop/very-important-image.png 传输到远程主机的 /home/janedoe/ 目录,可以使用以下命令:

bash
rsync -avz -e "ssh -p 33260" ~/Desktop/very-important-image.png root@8.140.242.203:/home/janedoe/

如果目标位置已有该文件,rsync 会比较文件差异,只传输不同部分。

传输整个目录

要传输整个目录及其内容,使用以下命令:

rsync -avz -e "ssh -p PORT" /path/to/local/directory username@remote_host:/path/to/destination/

注意源目录路径末尾没有斜杠 /。如果加上 /,表示要传输目录的内容而不是目录本身。

例如,要将 ~/Desktop/very-important-folder 同步到远程主机的 /home/janedoe/very-important-folder,可以使用以下命令:

bash
rsync -avz -e "ssh -p 33260" ~/Desktop/very-important-folder root@8.140.242.203:/home/janedoe/very-important-folder/

传输完成后远端的文件结构:

bash
(base) janedoe@is-c7wqsja2wznj73pe-devmachine-0:~$ tree -L 2
.
└── very-important-folder
    ├── ssh.jpeg
    ├── ssh-port-forwarding-copilot.png
    ├── ssh-port-forwarding-http.jpeg
    └── ssh-port-forwarding-via-aicoder.png

1 directory, 4 files

使用 --progress 选项显示传输进度

如果要查看传输进度,可以添加 --progress 选项:

rsync -avz --progress -e "ssh -p PORT" /path/to/local/directory/ username@remote_host:/path/to/destination/

使用 --exclude 选项排除特定文件或目录

如果想排除某些文件或目录,可以使用 --exclude 选项:

rsync -avz --progress --exclude='*.txt' -e "ssh -p PORT" /path/to/local/directory/ username@remote_host:/path/to/destination/

这个命令会排除所有 .txt 文件。

使用 --delete 选项同步目录

如果想让目标目录与源目录完全一致(删除目标目录中源目录没有的文件),可以使用 --delete 选项:

rsync -avz --progress --delete -e "ssh -p PORT" /path/to/local/directory/ username@remote_host:/path/to/destination/

请谨慎使用此选项,因为它会删除目标目录中的文件。

总结

以上就是使用 rsync 从本地器传输数据到远程 Linux 主机的基本步骤。rsync 是一个强大的工具,有很多高级选项可以根据具体需求进行调整。在使用 --delete 等可能造成数据丢失的选项时,建议先使用 --dry-run 选项进行测试,以确保操作的正确性。

常见问题解答

如何进行断点续传?

rsync 默认支持断点续传功能。如果传输过程中断,只需再次运行相同的 rsync 命令,它会自动从中断处继续传输。为了确保最佳的断点续传效果,可以使用以下选项:

  • -P: 这个选项结合了 --partial--progress--partial 保留部分传输的文件,便于断点续传。
  • --append-verify: 这个选项会在续传时验证已传输的数据,确保数据完整性。

使用这些选项的命令示例:

rsync -avzP --append-verify -e "ssh -p PORT" /path/to/local/directory/ username@remote_host:/path/to/destination/

如果传输中断,只需再次运行此命令,rsync 会从中断处继续传输。

scp 是否也具有断点续传的功能?

不,scp(Secure Copy)并不具有与 rsync 相同的断点续传功能。如果使用 scp 传输文件时连接中断,再次运行相同的命令不会从中断处继续传输,而是会重新开始整个文件的传输。

scp 的主要优点是简单易用,但在处理大文件或不稳定网络环境时,rsync 通常是更好的选择。rsync 不仅支持断点续传,还能够只传输文件的变化部分,这使得它在同步和备份任务中特别有效。

如果你经常需要处理大文件传输或在不稳定的网络环境中工作,建议使用 rsync 而不是 scp。但对于简单的、小型的文件传输任务,scp 仍然是一个有用且直观的工具。