rsync 是一种免费使用的命令行工具,可让您在本地和远程同步文件。 使用它,您可以传输文件和目录。
这使得它对于迁移数据、执行备份和镜像非常有用,非常适合网站管理员和管理员执行重复的数据传输任务。
本文将向我们介绍 Rysnc 的工作原理,并提供一些有用的示例。
rsync 是如何工作的?
rsync 是用于类 Unix 系统的远程同步命令行实用程序。 它使用户能够在机器或两台主机之间无缝传输/同步文件。
在底层,rsync 使用增量传输算法。 该算法涉及跨两个主机(源和目标)复制两个文件之间的差异。 源和目标可以是本地的或远程的。 rsync 命令可以通过两种方式执行复制/同步数据任务。 这些都是:
- 使用 ssh, rsh 在两台主机之间复制/同步。
- 使用 TCP rsync 守护进程 用于复制/同步。
由于它设计用于类 Unix 系统,因此它也适用于Linux.
rsync 使用的分步过程如下:
- Rsync 使用 SSH 连接到远程主机并要求输入密码。
- 连接后,远程主机的 rsync 与源通信。
- 然后这些程序将确定需要同步的文件和目录。 它使用增量传输算法来检查文件之间的差异。
如果 rsync 命令在远程但在主机上找不到文件,它将复制并将其传输到主机系统。 同样,对于已经存在的文件(在主机和远程),它会复制它们之间的差异(即更改的部分)。 最后,它将忽略两个系统上的现有文件而不进行任何修改。
rsync 命令通过在将差异推送到目的地之前将差异存储在临时文件中来实现增量更新。
在你开始之前:
- 你需要有 root 或 sudo 权限
- 可以访问终端/命令行
- 用于安全运行 rsync 命令的 SSH 访问
- 您还需要两台机器来制作 rsync。
对于本教程,我们将使用 Linux Mint 21.1 维拉. 使用任何其他 Linux 发行版,您可以轻松地按照指南进行操作而不会出现问题。
为什么使用 rsync 而不是 scp?
Scp(安全复制)是一种流行的命令行协议,允许用户复制文件。 它遵循线性复制方法。 这意味着它只是将文件从源复制到目标。 为了安全地这样做,它使用 SSH.
scp 命令语法如下:
scp option SOURCE DESTINATION
然而,问题仍然存在,为什么使用 rsync 而不是 scp?
好吧,使用 rsync 有很多好处。 这些好处包括:
- 更快的执行: rsync 比 scp 快,因为它使用远程更新协议。 这允许它只传输差异而不是整个文件。 因此,如果您设置定期同步,您只需在第一次进行完整复制。 从下一次开始,它仅在增量传输算法的帮助下复制更新的部分。
- 更少的带宽消耗: 由于 rsync 不必再次复制整个文件,因此可以减少带宽消耗。 此外,它还使用压缩/解压缩算法来最小化传输过程中的文件大小。
- 更多命令行选项: rsync 在命令行选项的数量上也胜过 scp。 这意味着您可以比 scp 更精细地调整 rsync。
总之,rsync 是一个优秀的增量同步工具。 scp 工具也有助于安全地传输/同步文件。 在现实场景中,如果您正在寻找更直接的方法,scp 适合日常任务。 但是,对于重复性任务,请使用 rsync。
rsync 命令语法
rsync命令如下:
- 本地到本地: rsync 选项 SOURCE DEST
- 本地到远程: rsync 选项 SOURCE USER@HOST:DEST
- 远程到本地: rsync 选项 USER@HOST:SRC DEST
此处,术语定义如下:
- 选项 – 这些是 rsync 选项
- 来源 – 源目录
- 目标 – 目标目录
- 用户 – 远程用户名
- 主机名 – 远程主机名或 IP 地址
选项是为命令提供附加功能的参数。 例如,您可以使用递归方式同步数据 -r 选项. 但是,那 -r 选项 不同步组和用户的所有权、时间戳、权限或符号链接。 相反,您可以使用 -一个选项它以存档模式运行命令,确保在复制时保留所有文件的所有权、权限和符号链接。
其他 rsync 选项包括:
- -z:压缩数据以节省空间
- -H: 提供人类可读的格式输出
- -b:在数据同步过程中进行备份
- -e: 使用 SSH 协议进行远程数据传输
- -progress: 显示数据同步进度
- -v:要求 rsync 显示详细输出
- -n: 进行试运行以测试数据同步的设置和设置
- -q: 抑制 rsync 命令输出和选项
安装 rsync
大多数 Unix 和 Linux 系统都安装了 rsync。 如果您的系统没有 rsync,您可以使用以下命令安装它。
对于 Debian/Ubuntu 和 Mint
sudo apt-get install rsync
对于 Arch Linux
pacman -S rsync
在 Gentoo 上
emerge sys-apps/rsync
在 CentOS/Fedora/REHL 上
sudo yum install rsync
在 openSUSE 上
sudo zypper install rsync
由于我们有 Linux Mint,因此预装了 rsync。 所以可以在终端运行rsync命令查看是否安装。 如果存在,它将解释其功能、选项和其他重要信息。
nitt ~
$ rsync
rsync version 3.2.3 protocol version 31
Copyright (C) 1996-2020 by Andrew Tridgell, Wayne Davison, and others.
Web site:https://rsync.samba.org/
Capabilities:
64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints,
socketpairs, hardlinks, hardlink-specials, symlinks, IPv6, atimes,
batchfiles, inplace, append, ACLs, xattrs, optional protect-args, iconv,
symtimes, prealloc, stop-at, no crtimes
Optimizations:
SIMD, no asm, openssl-crypto
Checksum list:
xxh128 xxh3 xxh64 (xxhash) md5 md4 none
Compress list:
zstd lz4 zlibx zlib none
rsync comes with ABSOLUTELY NO WARRANTY. This is free software, and you
are welcome to redistribute it under certain conditions. See the GNU
General Public Licence for details.
rsync is a file transfer program capable of efficient remote update
via a fast differencing algorithm.
现在让我们看看 rsync 在不同用例中的实际应用。
对于本教程,我们将创建两个目录。
- 源目录
- 目标目录
为此,您需要键入以下命令。
mkdir source-directory
mkdir dest-directory
此外,我们需要生成文件以使 rsync 工作。 因此,让我们使用以下命令创建一些测试文件。
touch source-directory/file{1..100}
这会在源目录中创建 100 个空文件。 您可以通过输入以下命令来确认它。
ls source-directory
Output:
nitt rsync-tutorial
$ ls
dest-directory source-directory
nitt rsync-tutorial
$ touch source-directory/file{1..100}
nitt rsync-tutorial
$ ls source-directory
file1 file18 file27 file36 file45 file54 file63 file72 file81 file90
file10 file19 file28 file37 file46 file55 file64 file73 file82 file91
file100 file2 file29 file38 file47 file56 file65 file74 file83 file92
file11 file20 file3 file39 file48 file57 file66 file75 file84 file93
file12 file21 file30 file4 file49 file58 file67 file76 file85 file94
file13 file22 file31 file40 file5 file59 file68 file77 file86 file95
file14 file23 file32 file41 file50 file6 file69 file78 file87 file96
file15 file24 file33 file42 file51 file60 file7 file79 file88 file97
file16 file25 file34 file43 file52 file61 file70 file8 file89 file98
file17 file26 file35 file44 file53 file62 file71 file80 file9 file99
笔记: 我们将 dest-directory 保持为空。
递归地在本地复制目录
尽管 rsync 的主要目的是在本地和远程服务器之间复制文件,但它同样有助于在本地复制文件。
在这种情况下,我们将使用以下 rsync 语法。
rsync 选项 SOURCE DESTINATION
将文件复制到我们的 源目录 到 目标目录 通过运行以下命令。
rsync -r source-directory/ dest-directory
在这里,命令“递归地”从 源目录 到 目标目录。
nitt rsync-tutorial
$ ls
dest-directory source-directory
nitt rsync-tutorial
$ ls dest-directory
nitt rsync-tutorial
$ ls source-directory
file1 file18 file27 file36 file45 file54 file63 file72 file81 file90
file10 file19 file28 file37 file46 file55 file64 file73 file82 file91
file100 file2 file29 file38 file47 file56 file65 file74 file83 file92
file11 file20 file3 file39 file48 file57 file66 file75 file84 file93
file12 file21 file30 file4 file49 file58 file67 file76 file85 file94
file13 file22 file31 file40 file5 file59 file68 file77 file86 file95
file14 file23 file32 file41 file50 file6 file69 file78 file87 file96
file15 file24 file33 file42 file51 file60 file7 file79 file88 file97
file16 file25 file34 file43 file52 file61 file70 file8 file89 file98
file17 file26 file35 file44 file53 file62 file71 file80 file9 file99
nitt rsync-tutorial
$ rsync -r source-directory/ dest-directory
nitt rsync-tutorial
$ ls dest-directory
file1 file18 file27 file36 file45 file54 file63 file72 file81 file90
file10 file19 file28 file37 file46 file55 file64 file73 file82 file91
file100 file2 file29 file38 file47 file56 file65 file74 file83 file92
file11 file20 file3 file39 file48 file57 file66 file75 file84 file93
file12 file21 file30 file4 file49 file58 file67 file76 file85 file94
file13 file22 file31 file40 file5 file59 file68 file77 file86 file95
file14 file23 file32 file41 file50 file6 file69 file78 file87 file96
file15 file24 file33 file42 file51 file60 file7 file79 file88 file97
file16 file25 file34 file43 file52 file61 file70 file8 file89 file98
file17 file26 file35 file44 file53 file62 file71 file80 file9 file99
这将复制目录中的每个文件 源目录 到 目标目录.
本地复制单个文件
现在我们已经学习了如何同步两个目录,我们将学习如何复制单个文件。
为此,我们将编辑空文件 文件1 在里面 源目录 然后将其与存在于 目标目录。
要编辑文件,请键入以下命令。
nano source-directory/file1
现在将以下文本复制粘贴到 nano 编辑器中。
We're updating file1 in the source-directory.
Once we update, we'll push the new update to the dest-directory.
rsync doesn't need to re-copy the file using the delta-transfer algorithm.
This algorithm checks the differences and then updates destination files
accordingly.
So, once you save file1 in the source-directory, open file1 in
the dest-directory. It'll be empty.
However, if we check it after running rsync, you'll see that file1 in dest-directory
is updated.
向文件添加内容
现在,关闭并保存文件。
现在让我们使用 rsync 复制文件。
sudo rsync -v --existing source-directory/file1 /dest-directory
#Output
nitt rsync-tutorial
$ sudo rsync -v --existing source-directory/file1 dest-directory
file1
sent 557 bytes received 35 bytes 1,184.00 bytes/sec
total size is 474 speedup is 0.80
nitt rsync-tutorial
$
您可能已经注意到,我们使用了 -现存的 选项。 这将更新现有文件。 如果你不运行命令 -现存的,它不会更新,即使它运行成功。
如果目标文件夹中不存在您要复制的单个文件,则需要运行以下命令。
rsync -v source-directory/newfile dest-directory
#Output
nitt rsync-tutorial
$ rsync -v source-directory/newfile dest-directory
newfile
sent 82 bytes received 35 bytes 234.00 bytes/sec
total size is 0 speedup is 0.00
复制多个文件
如果您打算复制多个文件,则必须提及两个文件的源路径,然后是目标目录。
为此,我们将创建两个新文件: 新文件2 和 新文件3, 在里面 源目录. 运行以下命令来执行此操作。
touch source-directory/newfile{2..3}
现在,使用以下命令同步多个文件。
rsync -v source-directory/newfile2 source-directory/newfile3 dest-directory
#Output
nitt rsync-tutorial
$ rsync -v source-directory/newfile2 source-directory/newfile3 dest-directory
newfile2
newfile3
sent 135 bytes received 54 bytes 378.00 bytes/sec
total size is 0 speedup is 0.00
nitt rsync-tutorial
$
将文件或目录从本地复制到远程
本地到远程传输的 rsync 语法如下。
rsync option SOURCE USER@HOST:DEST
如您所见,您需要知道 IP地址 远程机器使这项工作。 此外,您需要在源文件后添加 IP 地址。
rsync -av /Projects/rsync-tutorial/source-directory 192.168.192.200:/Projects/rsync-tutorial/dest-directory
在开始传输之前,它会要求输入密码。 输入它继续。 另外,如果用户在远程机器上不同,那么你需要在 IP 地址之前提到它,然后是 @.
rsync -av /Projects/rsync-tutorial/source-directory nithya@192.168.192.200:/Projects/rsync-tutorial/dest-directory
如果您打算复制多个文件或目录,则需要列出文件或目录路径。 它的语法如下。
rsync -av /Projects/rsync-tutorial/source-directory/newfile1 /Projects/rsync-tutorial/source-directory/newfile2 192.168.192.200:/Projects/rsync-tutorial/dest-directory
远程传输特定协议
rsync 允许您指定特定的文件传输协议。 为此,您需要使用 -e 选项其次是协议。
例如,如果你想使用ssh协议,你必须追加 -e ssh 到 rsync 命令。
rsync -e ssh /Projects/rsync-tutorial/source-directory 192.168.192.200:/Projects/rsync-tutorial/dest-directory
将文件或目录从远程复制到本地
本地到远程传输的 rsync 语法如下。
sync option USER@HOST:SRC DEST
这充当拉取请求。 因此,要从远程服务器获取所需的文件/目录到本地计算机,您需要运行以下命令。
rsync -av 192.168.192.200:/Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory
该命令将文件拉到远程机器的 目标目录 到本地机器的 源目录。
同样,您可以通过完整路径提及来提取特定文件。
rsync -av 192.168.192.200:/Projects/rsync-tutorial/dest-directory/newfile4 /Projects/rsync-tutorial/source-directory
要将多个文件或目录从本地复制到远程,您需要在服务器 IP 地址后的大括号(以逗号分隔)内指定路径。
rsync -av 192.168.192.200:{/Projects/rsync-tutorial/dest-directory/, /home/music/2023-music} /Projects/rsync-tutorial/source-directory
同样,您也可以提及文件。
在传输过程中显示实时进度
看到更大的实时进度是个好主意 数据备份. 为此,您需要使用 -进步 旗帜。 将其附加到 rsync 命令,您可以看到传输速度、剩余时间和传输的数据量。
rsync -av --progress 192.168.192.200:/Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory
传输完成后删除源文件
您可以使用 -删除源文件 完成传输后删除源文件的标志。 这可以在许多情况下为您提供帮助,尤其是在不留下任何痕迹的情况下保护您的文件或仅使用它们来释放空间时。
rsync -av --remove-source-files 192.168.192.200:/Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory
rsync 空运行
Rysnc 还允许您在实际运行之前进行评估。 试运行让您看看您是否在做正确的事情。 毕竟,您不想错误地更新文件甚至删除它们。
你需要使用 –试运行 选择进行试运行。 将它添加到命令中,然后是源和目标。
sudo rsync -v --dry-run source-directory/file1 dest-directory
nitt rsync-tutorial
$ sudo rsync -v --dry-run source-directory/file1 dest-directory
file1
sent 43 bytes received 19 bytes 124.00 bytes/sec
total size is 474 speedup is 7.65 (DRY RUN)
nitt rsync-tutorial
输出类似于我们之前运行它的方式。 但是,您会注意到提到 (试运行) 在输出的末尾。
设置最小和最大文件大小
Rysnc 还允许您在传输过程中设置最小或最大文件大小。
所以,如果你想传输最小大小为 15KB 的文件,你需要使用 –最小尺寸=15K.
rsync -av --min-size=15k 192.168.192.200:/Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory
该命令只会复制最小文件大小为 15KB 的文件。 如果文件大小低于它,它将忽略它。
同样,您可以使用 –最大尺寸标志 设置最大文件大小。
rsync -av --max-size=450k 192.168.192.200:/Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory
在这里,rsync 将忽略大小超过 450K 的文件。
设置带宽限制
如果您正在执行其他带宽密集型任务,则可以设置 rysnc 来设置传输的带宽限制。 为此,请使用 –bullimit=KB/s.
rsync -av --bwlimit=100 --progress 192.168.192.200:/Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory
在这里,我们将带宽设置为 100Kb/s 在转移过程中。
最后的话
这使我们结束了 rsync 命令指南。 我们学习了如何使用 rysnc 并有效地涵盖了大量命令。
然而,rysnc 提供的方式远不止我们所涵盖的。 这就是为什么您可能还想通过 rsync 手册页,其中涵盖了 rsync 的各个方面。
您也可以联系文章作者本人进行修改,若内容侵权或非法,可以联系我们进行处理。
任何个人或组织,转载、发布本站文章到任何网站、书籍等各类媒体平台,必须在文末署名文章出处并链接到本站相应文章的URL地址。
本站文章如转载自其他网站,会在文末署名原文出处及原文URL的跳转链接,如有遗漏,烦请告知修正。
如若本站文章侵犯了原著者的合法权益,亦可联系我们进行处理。
hi5个月前0
请问有详细一点的自己搭建的教程吗你好6个月前0
你好,可以再帮我看看吗? 我已经按照你的方法设定了,还是一样,wordpress后台的 Purge Varnish Cache 插件还是清除不到cache,依旧显示 the varnish control terminal is not responding at。谢谢https://mjj.today/i/Srk2Tz https://mjj.today/i/Srkcoi你好6个月前0
对,你说的没错,我配置的时候改了一些东西,现在我按照你的教学,可以启动了,网页可以缓存了,不过wordpress 清除cache 那个插件没用的,我输入本地回环地址127.0.0.1 :6082 ,再输入API key ,插件显示the varnish control terminal is not responding at 127.0.0.1:6082,就你图片那样,然后试一下点击清除cache 那里,他显示error,研究了一天,还是没有不行。你好6个月前1
你好,为啥我按照你的方法,到第三部分,去到真正后源的服务器设定Varnish 部分,我填了真正后源的IP跟端口跟域名,然后重启 Varnish ,就出现这样了? 这是怎么回事? 谢谢[Linux] AMH 7.1 https://amh.sh[varnish-6.6 start] ================================================== =========== [OK] varnish-6.6 is already installed. Could not delete 'vcl_boot.1713549650.959259/vgc.sym': No such file or directory Error: Message from VCC-compiler: VCL version declaration missing Update your VCL to Version 4 syntax, and add vcl 4.1; on the first line of the VCL files. ('/home/usrdata/varnish/default.conf' Line 1 Pos 1) ...#---Running VCC-compiler failed, exited with 2 VCL compilation failedchu6个月前0
很完善的教程‘hu6个月前0
我用gmail EMAIL_SERVER="smtp://********@gmail.com:bpyfv*********chry@smtp.gmail.com:587"叽喳6个月前0
MAIL_SERVER="smtp://no-reply@vort.me:password123@wednesday.mxrouting.net:587"大佬 这个使用outlook 或者gmail 是什么样子的格式? 邮寄已经开启smtp了hu6个月前0
输入框的问题解决了,我没有设置反代,NEXTAUTH_URL改为域名+端口就好了