本文是原文的翻译,翻译不当之处请不要客气的指出。

rsync代表remote sync。

rsync被用来执行UNIX/Linux的备份操作。

rsync程序用一种高效的方式进行从一个地方到另一个地方文件和目录的同步。备份位置可以是本地服务器或者远程服务器。

rsync的重要特征

  • Speed:首先,rsync在源目录和目的目录复制内容。rsync然后仅仅传输被修改的块和字节到目的地址,这使得传输非常快速。
  • Security:rsync允许在传输时使用ssh协议加密数据。
  • Less bandwidth:rsync分别在发送端和数据端分别一块块地对数据块压缩和解压缩。所以rsync使用的带宽相比其他文件传输协议来说更少。
  • Privilege:不需要额外的权限来安装和运行rsync。

syntax

$ rsync options source destination

source 和 destination 均可以是本地和远程。在远程的情况下,指定登录名、远程服务器名和文件位置

Example 1.同步本机的两个目录

为了在本机上同步两个目录,使用接下来的 rsync -zvr 命令

$ rsync -zvr /var/opt/installation/inventory/ /root/temp
building file list ... done
sva.xml
svB.xml
.
sent 26385 bytes  reveived 1098 bytes  54966.00 bytes/sec
total size is 44867  speedup is 1.63
$

在上面的示例中:

  • -z 开启压缩
  • -v 代表verbose,就是把传输的文件名打印出来
  • -r 代表递归 recursive

现在让我们查看从源被复制到目的的文件的时间戳。如下所示,rsync在同步时没有保留时间戳。

$ ls -l /var/opt/installation/inventory/sva.xml /root/temp/sva.xml
-r--r--r-- 1 bin  bin  949 Jun 18  2009 /var/opt/installation/inventory/sva.xml
-r--r--r-- 1 root bin  949 Sep  2  2009 /root/temp/sva.xml

Example 2. 使用rsync -a命令在同步时保留时间戳

rsync 选项 -a 代表归档模式。-a 选项:

  • 递归模式 recursive
  • 保留符号链接
  • 保留权限
  • 保留时间戳
  • 保留owner和group

现在,执行和示例1中同样的命令但是带有 -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

Example 3. 仅仅同步一个文件

为了复制一个文件,在命令中指定文件名,如下所示:

$ 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

Example 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地址和目的目录地址。

格式是:username@machinename:path

如上所示,在同步前需要密码。

有时候你不想在本地和远程备份文件时输入密码。例如,如果你有一个在本地和远程之间备份的shell脚本,这时候你需要执行rsync而不需要输入密码的能力。

你可以在这个链接中找到答案:ssh password less login

Example 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

Example 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

Example 7. 在目的处不要overwrite被修改的文件

在一个典型的rsync的使用场景中:如果一个文件在目的处被修改,我们可能并不想用源地址处的老文件重写这个文件。

使用rsync -u 选项来阻止重写目的处的新文件。在下面的示例中,被叫做Basenames的文件已经被在目的处修改了。所以,它将不会被重写。

$ 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

Example 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

Example 9. 在传输过程中查看rsync进程

但你使用rsync备份文件时,你可能想要知道备份的进程是多少,即复制了多少文件了,复制问价的速度是多少等

rsync -progress 选项展示详细的文件传输过程,如下所示:

$ 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 程序来备份本地linux服务器或者备份远程linux服务器:

backup local linux server

backup remote linux server

Example 10. 删除在目的处创建的文件

如果文件没有出现在源地址,但是出现在了目的地址,你可能想要在传输过程中删除在目的地址处的文件。

在这种情况下,使用 -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 选项同步 source 时,它将会删除这个文件。

Example 11. 不要在目的处创建新文件

如果你喜欢,你可以仅仅更新在目的处存在的文件。在源地址处存在新文件而目的地址没有的情况下,你可以避免在目的地址处创建新文件。如果你喜欢这个feature,使用 --existing 选项。

首先,在源地址处增加一个新文件:

[/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

如果你看到了上面的输出,目的地没有接收到新文件。

Example 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

在上面的例子中,在源地址和目的地址中有两个改变。首先,文件 Direname 的owner和group不用,其次,文件Basenames的大小不同。

现在让我们看看rsync怎么展示这种差异。-i 选项展示 items 的改变。

$ 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

在输出中,他使用了九个字母来展示文件或目录的改变。

在我们的例子中,在 Basenames(Dirnames) 文件前的字母代表:

> 代表文件正在被传输到本机
f 代表这是一个文件
s 代表文件大小的不同
t 代表了时间戳的改变
o 代表 owner 的改变
g 代表 group 的改变

Example 13. 在文件传输过程中包含 exclude pattern

rsync允许你使用 pattern 在传输过程中包含或者排除你想要的文件或者目录。

$ 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’ 的文件或者目录并排除了所有其他文件。

Example 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来指定大小。

Example 15. 传输整个文件

rsync的一个主要特征就是他可以仅仅传输被改变的块到目的地址,而不是传输整个文件。

如果网络带宽对你来说不是一个问题,你可以使用 rsync -W 选项传输整个文件。这将会加速 rsync 过程,因为它不需要在目的和远处执行checksum:

#  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