2024-11-21 一站式 AI 平台生日大派对!2024-11-21 一站式 AI 平台生日大派对! 无问芯穹特别推出多项超值福利!立即参与
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

NOTE

安装完成后可能需要更新环境变量,否则可能仍使用 MacOS 系统默认版本。

确认远程主机上的 rsync

本文使用 rsync 传输数据到开发机,因此远程主机指开发机。

请在开发机上执行以下命令,检查是否有 rsync。

bash
rsync --version

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

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

生成示例数据文件

我们可以使用 dd 命令生成一个用于测试 rsync 数据传输的大文件:

bash
dd if=/dev/urandom of=dummyfile bs=1M count=150

这会创建一个 150MB 的随机数据文件,用于演示 rsync 的功能。

获取开发机 SSH 连接信息

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

alt text

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

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

使用 rsync 传输数据

包含 SSH 端口号的 rsync 命令

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

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

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

传输单个文件

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

bash
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/ 目录:

bash
rsync -avzP --partial-dir=.rsync-partial -e "ssh -p 33260" dummyfile root@8.140.242.203:/root/

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

传输整个目录

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

bash
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,可以使用以下命令:

bash
rsync -avzP --partial-dir=.rsync-partial -e "ssh -p 33260" ~/Desktop/very-important-folder root@8.140.242.203:/root/very-important-folder/

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

bash
(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 选项:

bash
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 选项:

bash
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: 将部分传输的文件保存在指定目录,方便断点续传

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

bash
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 仍然是一个有用且直观的工具。