使用 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
NOTE
安装完成后可能需要更新环境变量,否则可能仍使用 MacOS 系统默认版本。
确认远程主机上的 rsync
本文使用 rsync 传输数据到开发机,因此远程主机指开发机。
请在开发机上执行以下命令,检查是否有 rsync。
rsync --version
如果没有,可以使用以下命令安装和更新(以 Ubuntu 为例):
sudo apt-get update
sudo apt-get install rsync
生成示例数据文件
我们可以使用 dd 命令生成一个用于测试 rsync 数据传输的大文件:
dd if=/dev/urandom of=dummyfile bs=1M count=150
这会创建一个 150MB 的随机数据文件,用于演示 rsync 的功能。
获取开发机 SSH 连接信息
请登录智算云平台,查看开发机的 SSH 连接命令。
SSH 连接命令示例:-p 38526 root@8.140.242.203
其中包含当前开发机的 SSH 端口号、用户名、SSH 主机 IP,下一步中将会使用。root
为默认 SSH 登录用户名(部分旧版实例展示为非 root 普通用户名,请重启)。
使用 rsync 传输数据
包含 SSH 端口号的 rsync 命令
智算云平台的开发机使用非默认 SSH 端口,我们需要在 rsync 命令中指定端口。
使用 -e
选项来设置 SSH 参数后,rsync 命令结构变为如下格式:
rsync -e "ssh -p PORT" [其他选项] 源目录 用户名@远程主机:目标目录
传输单个文件
要传输单个文件到远程主机,使用以下命令:
rsync -avzP --partial-dir=.rsync-partial -e "ssh -p PORT" /path/to/local/file username@remote_host:/path/to/destination/
-a
: 归档模式,保留文件属性-v
: 详细输出-z
: 压缩传输数据-P
: 显示进度并支持断点续传--partial-dir=.rsync-partial
: 将部分传输的文件保存在指定目录
例如,要将生成的测试文件传输到远程主机的 /root/
目录:
rsync -avzP --partial-dir=.rsync-partial -e "ssh -p 33260" dummyfile root@8.140.242.203:/root/
如果目标位置已有该文件,rsync 会比较文件差异,只传输不同部分。
传输整个目录
要传输整个目录及其内容,使用以下命令:
rsync -avzP --partial-dir=.rsync-partial -e "ssh -p PORT" /path/to/local/directory username@remote_host:/path/to/destination/
注意源目录路径末尾没有斜杠 /
。如果加上 /
,表示要传输目录的内容而不是目录本身。
例如,要将 ~/Desktop/very-important-folder 同步到远程主机的 /root/very-important-folder,可以使用以下命令:
rsync -avzP --partial-dir=.rsync-partial -e "ssh -p 33260" ~/Desktop/very-important-folder root@8.140.242.203:/root/very-important-folder/
传输完成后远端的文件结构:
(base) root@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
使用 --exclude
选项排除特定文件或目录
如果想排除某些文件或目录,可以使用 --exclude
选项:
rsync -avzP --partial-dir=.rsync-partial --exclude='*.txt' -e "ssh -p PORT" /path/to/local/directory/ username@remote_host:/path/to/destination/
这个命令会排除所有 .txt 文件。
使用 --delete
选项同步目录
如果想让目标目录与源目录完全一致(删除目标目录中源目录没有的文件),可以使用 --delete
选项:
rsync -avzP --partial-dir=.rsync-partial --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-dir=.rsync-partial
: 将部分传输的文件保存在指定目录,方便断点续传
使用这些选项的命令示例:
rsync -avzP --partial-dir=.rsync-partial -e "ssh -p PORT" /path/to/local/directory/ username@remote_host:/path/to/destination/
如果传输中断,只需再次运行此命令,rsync 会从中断处继续传输。
NOTE
即使启用了以上选项,rsync 可能仍会从头传输。建议使源端与目标端 rsync 版本尽量一直,并且在整个传输过程不要改动源文件。
scp 是否也具有断点续传的功能?
不,scp(Secure Copy)并不具有与 rsync 相同的断点续传功能。如果使用 scp 传输文件时连接中断,再次运行相同的命令不会从中断处继续传输,而是会重新开始整个文件的传输。
scp 的主要优点是简单易用,但在处理大文件或不稳定网络环境时,rsync 通常是更好的选择。rsync 不仅支持断点续传,还能够只传输文件的变化部分,这使得它在同步和备份任务中特别有效。
如果你经常需要处理大文件传输或在不稳定的网络环境中工作,建议使用 rsync 而不是 scp。但对于简单的、小型的文件传输任务,scp 仍然是一个有用且直观的工具。