使用 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。
rsync --version
观察是否有输出,如果没有,需要安装 rsync。MacOS 通常预装了 rsync,但如果没有,可以借助 Homebrew 安装:
brew install rsync
确认远程主机上的 rsync
如果开发机使用平台预置镜像,可能没有 rsync。
检查:
rsync --version
如果没有,可以使用以下命令安装(以 Ubuntu 为例):
sudo apt-get update
sudo apt-get install rsync
获取开发机 SSH 连接信息
请登录智算云平台,查看开发机的 SSH 连接命令。
SSH 连接命令示例:-p 33260 root@8.140.242.203
其中包含当前开发机的 SSH 端口号、用户名、SSH 主机 IP,下一步中将会使用。root
为默认 SSH 登录用户名(部分旧版实例展示为非 root 普通用户名,请重启)。
使用 rsync 传输数据
基本 rsync 命令结构
rsync 的基本命令结构如下:
rsync [选项] 源目录 目标目录
包含 SSH 参数的命令结构
智算云平台的开发机使用非默认 SSH 端口,我们需要在 rsync 命令中指定端口。
使用 -e
选项来设置 SSH 参数后,rsync 命令结构变为如下格式:
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/
目录,可以使用以下命令:
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,可以使用以下命令:
rsync -avz -e "ssh -p 33260" ~/Desktop/very-important-folder root@8.140.242.203:/home/janedoe/very-important-folder/
传输完成后远端的文件结构:
(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 仍然是一个有用且直观的工具。