一、引言
rsync 代表远程同步。rsync 用于在UNIX/Linux中执行备份操作。rsync 实用程序用于以有效的方式将文件和目录从一个位置同步到另一个位置。备份位置可以是本地服务器,也可以是远程服务器。
rsync 的重要特性
- 速度:第一次,rsync 会在源目录和目标目录之间复制全部内容。下一次,rsync 只会将更改的块或字节传输到目标位置,这使得传输速度非常快。
- 安全性:rsync 允许在传输过程中使用 ssh 协议加密数据。
- 更少的带宽:rsync 在发送端和接收端分别使用逐块压缩和解压缩数据。因此,与其他文件传输协议相比,rsync 使用的带宽总是较少。
- 权限:安装和执行 rsync 不需要特殊权限
句法格式
$ rsync 选项 源 目标
源和目标可以是本地的,也可以是远程的。如果是远程的,请指定登录名、远程服务器名称和位置。
二、15个备份操作命令
1. 同步本地服务器中的两个目录
要同步本地计算机中的两个目录,请使用以下 rsync -zvr 命令。
$ rsync -zvr /var/opt/installation/inventory/ /root/temp
building file list ... done
sva.xml
svB.xml
.
sent 26385 bytes received 1098 bytes 54966.00 bytes/sec
total size is 44867 speedup is 1.63
$
在上面的 rsync 示例中:
- -z 是启用压缩
- -v 详细
- -r 表示递归
现在让我们看看从源复制到目标的其中一个文件的时间戳。如下所示,rsync 在同步期间没有保留时间戳。
$ ls -l /var/opt/installation/inventory/sva.xml /root/temp/sva.xml
-r--r--r-- 1 bin bin 949 2009 年 6 月 18 日 /var/opt/installation/inventory/sva.xml
-r--r--r-- 1 root bin 949 2009 年 9 月 2 日 /root/temp/sva.xml
2. 使用 rsync -a 在同步期间保留时间戳
rsync 选项 -a 表示存档模式。-a 选项执行以下操作,
- 递归模式
- 保留符号链接
- 保留权限
- 保留时间戳
- 保留所有者和群组
现在,执行示例 1 中提供的相同命令(但使用 rsync 选项 -a),如下所示:
$ rsync -azv /var/opt/installation/inventory/ /root/temp/
building file list ... done
./
sva.xml
svB.xml
.
sent 26499 bytes received 1104 bytes 55206.00 bytes/sec
total size is 44867 speedup is 1.63
$
正如您在下面看到的,rsync 在同步期间保留了时间戳。
$ ls -l /var/opt/installation/inventory/sva.xml /root/temp/sva.xml
-r--r--r-- 1 root bin 949 Jun 18 2009 /var/opt/installation/inventory/sva.xml
-r--r--r-- 1 root bin 949 Jun 18 2009 /root/temp/sva.xml
3. 仅同步一个文件
要仅复制一个文件,请将文件名指定给 rsync 命令,如下所示。
$ rsync -v /var/lib/rpm/Pubkeys /root/temp/
Pubkeys
sent 42 bytes received 12380 bytes 3549.14 bytes/sec
total size is 12288 speedup is 0.99
4. 将文件从本地同步到远程
rsync 允许您在本地和远程系统之间同步文件/目录。
$ rsync -avz /root/temp/ thegeekstuff@192.168.200.10:/home/thegeekstuff/temp/
Password:
building file list ... done
./
rpm/
rpm/Basenames
rpm/Conflictname
sent 15810261 bytes received 412 bytes 2432411.23 bytes/sec
total size is 45305958 speedup is 2.87
与远程服务器同步时,需要指定远程服务器的用户名和 IP 地址。还应指定远程服务器上的目标目录。格式为用户名@机器名:路径
如上所示,从本地到远程服务器执行 rsync 时会要求输入密码。
有时您不想在将文件从本地备份到远程服务器时输入密码。例如,如果您有一个备份 shell 脚本,使用 rsync 将文件从本地复制到远程服务器,您需要能够在不输入密码的情况下进行 rsync。为此,需要设置无密码登录。
5. 将文件从远程同步到本地
当您想要将文件从远程同步到本地时,请在源中指定远程路径,在目标中指定本地路径,如下所示。
$ rsync -avz thegeekstuff@192.168.200.10:/var/lib/rpm /root/temp
Password:
receiving file list ... done
rpm/
rpm/Basenames
.
sent 406 bytes received 15810230 bytes 2432405.54 bytes/sec
total size is 45305958 speedup is 2.87
6. 用于同步的远程 shell
rsync 允许您指定要使用的远程 shell。您可以使用 rsync ssh 来启用安全的远程连接。使用 rsync -e ssh 指定要使用的远程 shell。在本例中,rsync 将使用 ssh。
$ rsync -avz -e ssh thegeekstuff@192.168.200.10:/var/lib/rpm /root/temp
Password:
receiving file list ... done
rpm/
rpm/Basenames
sent 406 bytes received 15810230 bytes 2432405.54 bytes/sec
total size is 45305958 speedup is 2.87
7. 不要覆盖目标位置的已修改文件
在典型的同步情况下,如果在目标位置修改了文件,我们可能不想用源中的旧文件覆盖该文件。使用 rsync -u 选项即可实现这一点。(即,如果文件已修改,则不要覆盖目标位置的文件)。在以下示例中,名为 Basenames 的文件已在目标位置被修改。因此,它不会被 rsync -u 覆盖。
$ ls -l /root/temp/Basenames
total 39088
-rwxr-xr-x 1 root root 4096 Sep 2 11:35 Basenames
$ rsync -avzu thegeekstuff@192.168.200.10:/var/lib/rpm /root/temp
Password:
receiving file list ... done
rpm/
sent 122 bytes received 505 bytes 114.00 bytes/sec
total size is 45305958 speedup is 72258.31
$ ls -lrt
total 39088
-rwxr-xr-x 1 root root 4096 Sep 2 11:35 Basenames
8. 仅同步目录树结构(不同步文件)
使用 rsync -d 选项仅将目录树从源同步到目标。以下示例以递归方式仅同步目录树,而不同步目录中的文件。
$ rsync -v -d thegeekstuff@192.168.200.10:/var/lib/ .
Password:
receiving file list ... done
logrotate.status
CAM/
YaST2/
acpi/
sent 240 bytes received 1830 bytes 318.46 bytes/sec
total size is 956 speedup is 0.46
9. 查看传输过程中的 rsync 进度
当您使用 rsync 进行备份时,您可能想知道备份的进度。例如,复制了多少个文件,复制文件的速率是多少,等等。
rsync –progress 选项显示 rsync 执行的详细进度,如下所示。
$ rsync -avz --progress thegeekstuff@192.168.200.10:/var/lib/rpm/ /root/temp/
Password:
receiving file list ...
19 files to consider
./
Basenames
5357568 100% 14.98MB/s 0:00:00 (xfer#1, to-check=17/19)
Conflictname
12288 100% 35.09kB/s 0:00:00 (xfer#2, to-check=16/19)
.
.
.
sent 406 bytes received 15810211 bytes 2108082.27 bytes/sec
total size is 45305958 speedup is 2.87
您还可以使用 rsnapshot 实用程序(使用 rsync)来备份本地 Linux 服务器,或者备份远程 Linux 服务器。
10. 删除目标上创建的文件
如果文件不在源处,但在目标处存在,您可能需要在 rsync 期间删除目标处的该文件。
在这种情况下,使用 –delete 选项,如下所示。rsync delete 选项会删除源目录中不存在的文件。
# Source and target are in sync. Now creating new file at the target.
$ > new-file.txt
$ rsync -avz --delete thegeekstuff@192.168.200.10:/var/lib/rpm/ .
Password:
receiving file list ... done
deleting new-file.txt
./
sent 26 bytes received 390 bytes 48.94 bytes/sec
total size is 45305958 speedup is 108908.55
目标有一个名为 new-file.txt 的新文件,当使用 –delete 选项与源同步时,它删除了文件 new-file.txt
11. 不要在目标上创建新文件
如果您愿意,您可以仅更新(同步)目标上的现有文件。如果源有新文件,而目标上没有,您可以避免在目标上创建这些新文件。如果您想要此功能,请在 rsync 命令中使用 –existing 选项。
首先,在源处添加一个new-file.txt。
[/var/lib/rpm ]$ > new-file.txt
接下来,从目标执行 rsync。
$ rsync -avz --existing root@192.168.1.2:/var/lib/rpm/ .
root@192.168.1.2's password:
receiving file list ... done
./
sent 26 bytes received 419 bytes 46.84 bytes/sec
total size is 88551424 speedup is 198991.96
如果你看到上面的输出,则表示它没有收到新文件 new-file.txt
12. 查看源和目标之间的变化
此选项对于查看源和目标之间的文件或目录的差异很有用。
来源:
$ ls -l /var/lib/rpm
-rw-r--r-- 1 root root 5357568 2010-06-24 08:57 Basenames
-rw-r--r-- 1 root root 12288 2008-05-28 22:03 Conflictname
-rw-r--r-- 1 root root 1179648 2010-06-24 08:57 Dirnames
到达目的地:
$ ls -l /root/temp
-rw-r--r-- 1 root root 12288 May 28 2008 Conflictname
-rw-r--r-- 1 bin bin 1179648 Jun 24 05:27 Dirnames
-rw-r--r-- 1 root root 0 Sep 3 06:39 Basenames
在上面的例子中,源和目标之间存在两个差异。首先,文件 Dirname 的所有者和组不同。其次,文件 Basename 的大小不同。
现在让我们看看 rsync 如何显示这种差异。-i 选项显示项目变化。
$ rsync -avzi thegeekstuff@192.168.200.10:/var/lib/rpm/ /root/temp/
Password:
receiving file list ... done
>f.st.... Basenames
.f....og. Dirnames
sent 48 bytes received 2182544 bytes 291012.27 bytes/sec
total size is 45305958 speedup is 20.76
在输出中,它会在文件名或目录名前面显示大约 9 个字母,表示更改。
在我们的示例中,Basenames(和 Dirnames)前面的字母表示以下内容:
> specifies that a file is being transferred to the local host.
f represents that it is a file.
s represents size changes are there.
t represents timestamp changes are there.
o owner changed
g group changed.
13. 文件传输期间包含和排除模式
rsync 允许您在进行同步时给出想要包含和排除的文件或目录的模式。
$ rsync -avz --include 'P*' --exclude '*' thegeekstuff@192.168.200.10:/var/lib/rpm/ /root/temp/
Password:
receiving file list ... done
./
Packages
Providename
Provideversion
Pubkeys
sent 129 bytes received 10286798 bytes 2285983.78 bytes/sec
total size is 32768000 speedup is 3.19
在上面的例子中,它仅包含以“P”开头的文件或目录(使用 rsync include)并排除所有其他文件。(使用 rsync exclude '*' )
14. 不要传输大文件
您可以使用 rsync –max-size 选项告诉 rsync 不要传输大于特定大小的文件。
$ rsync -avz --max-size='100K' thegeekstuff@192.168.200.10:/var/lib/rpm/ /root/temp/
Password:
receiving file list ... done
./
Conflictname
Group
Installtid
Name
Sha1header
Sigmd5
Triggername
sent 252 bytes received 123081 bytes 18974.31 bytes/sec
total size is 45305958 speedup is 367.35
max-size=100K 使 rsync 仅传输小于或等于 100K 的文件。您可以用 M 表示兆字节,用 G 表示千兆字节。
15. 传输整个文件
rsync 的主要特性之一是它只将更改的块传输到目的地,而不是发送整个文件。
如果网络带宽不是问题(但 CPU 是问题),您可以使用 rsync -W 选项传输整个文件。这将加快 rsync 进程,因为它不必在源和目标处执行校验和。
# rsync -avzW thegeekstuff@192.168.200.10:/var/lib/rpm/ /root/temp
Password:
receiving file list ... done
./
Basenames
Conflictname
Dirnames
Filemd5s
Group
Installtid
Name
sent 406 bytes received 15810211 bytes 2874657.64 bytes/sec
total size is 45305958 speedup is 2.87