rsync

rsync

安装3.1.0版本的rsync

为了显示进度条,我需要把我的路径下的rsync更新到3.1.0的版本

1
wget https://download.samba.org/pub/rsync/src/rsync-3.1.2.tar.gz

如果上述链接失效,则需要到https://rsync.samba.org

我的使用方法

1
2
rsync -a --progress -h -e 'ssh -p 55555' --partial zye@202.118.250.16:/data/ltp/ltp-models backup/
rsync -a --progress -h -e 'ssh -p 55555' --partial backup rsync@180.168.92.130:/volume1/hpc_data

如果在源地址后面加上斜杠的话,就只是表示拷贝下面的内容

介绍

rsync是一个快速的、多用途的文件拷贝工具。它可以实现本地的、远程的。两种远程方式,一个是通过rsync服务,一个是通过ssh服务。它提供了很多的选项来控制它的每一种行为和定义需要拷贝的文件。它因为它的增量拷贝算法而著名。广泛用于备份和镜像,并且作为一个改进的拷贝命令作为日常使用。

rsync可以找得到需要传输的文件,这是基于一个快速的检查算法(默认),它检查那些大小和最后修改时间有变化的文件。其他有变化的被保留的属性也会作用到目标文件上,如果快速检查表明文件的数据并不需要更新。

一些特点

  • 支持拷贝链接、设备、所有者、所有组和权限
  • 排除机制
  • 一个版本控制可以忽略的机制
  • 可以使用shell来传输,比如ssh rsh
  • 不需要超级用户权限
  • 管道传输,减少延迟消耗
  • 支持匿名或者验证的rsync守护进程

总体

rsync可以把文件拷到或从远程主机拷贝,或者只在本地拷贝。(它无法在两个远程主机之间拷贝文件)。

rsync有两种方法和远程系统通讯:使用一个远程shell程序作为传输的工具(比如ssh或rsh)或者通过TCP协议直接和rsync守护进程连接。远程shell传输在主机名后面使用单个(:)的时候,远程shell传输会被使用。当使用(::)的时候或者用rsync:// URL的时候才会直接使用rsync守护进程来通讯。

如果没有目的地址的话,文件只会被列出来,像ls -l一样。

同样的,如果源地址和目的地址都不是远程主机上的话,那么拷贝的行为只会发生在本地。

rsync的本地是作为客户端的,远程端是作为服务器端。不要将服务器和一个rsync守护进程搞混了。一个守护进程肯定是一个服务,但是一个服务可以是一个守护进程也可以是一个远程shell生成的一个进程。

设置

一旦安装好了之后,你就可以对任意你能够通过远程shell登陆的主机使用rsync(包括那些你能用rsync守护进程模式协议登陆的主机)。对于远程传输,一个现代的rsync使用ssh来进行通讯,但是它可以被配置去使用一个别的远程shell,比如rsh或remsh

你能指定任何你喜欢的远程shell,可以通过使用-e这个命令行选项或者设置RSYNC_RSH环境变量。

注意,rsync必须在源主机和目的主机上都安装好。

使用

你可以按照rcp的方法来使用rsync,指定一个源地址和目的地址

1
rsync -t *.c foo:src/

这个会把同模式*.c匹配的文件都拷贝到机器foo去。如果有个文件已经有了,那么rsync远程更新的协议就会涌来更新这个文件。

1
rsync -avz foo:src/bar /data/tmp

这个命令可以将src/bar这个文件夹下的所有内容都传输到/data/tmp/bar文件夹中。这些文件是在archive模式下传输的,这个会保证软链接、设备、属性、权限和所属等都被保留下来。另外,压缩也会在传输中被使用。

1
rsync -avz foo:src/bar/ /data/tmp

相比于上面多出现的一个斜杠可以避免拷贝的时候在目的地多出现一层文件结构。你可以这样来认为,多加一个斜杠在源地址表明了拷贝这个目录的内容,而不是按照名字拷贝目录,但是无论哪种,这些文件夹的属性都会用相同的方式传输过去。下面两个命令做的事情是一样的

1
2
rsync -av /src/foo /dest
rsync -av /src/foo/ /dest/foo

但是对于指向主机或者模块的地址,并不要求一个斜杠来拷贝默认文件夹的内容,比如,下面两个例子就都是把文件的内容拷贝到/dest中:

1
2
rsync -av host: /dest
rsync -av host::module /dest

你可以使用本地模式的rsync,就是其中的两个地址都不带有:。就像一个改进过的拷贝命令。

1
rsync somehost.mydomain.com::

这个可以列出所有可用的模块。

高级用法

可以给出多个源地址,和前面host相同的可以忽略

1
2
3
rsync -av host:file1 :file2 host:file{3,4} /dest/
rsync -av host::modname/file{1,2} host::modname/file3 /dest/
rsync -av host::modname/file1 ::modname/file{3,4}

老版本的rsync要求对于源地址加上单引号

如果需要传输一个带有空格的文件名,你可以使用--protect-args(-s)选项或者你可以加\。比如

1
rsync -av host:`file\ name\ with\ spaces` /dest

连接一个rsync守护进程

这个时候使用的是一个监听873的TCP接口,这个当然需要守护进程在远程服务器上运行着。

  • 你可以试使用双冒号来代替但冒号来分割主机名和路径,或者使用rsync://URL
  • path的第一个词是一个模块名字
  • 远程守护进程能够打印一个当天的信息,当你连接的时候
  • 如果没有指定路径名字,那么就会列出能够访问的路径
  • 如果没有指定目的地址,那么就会列出匹配的文件
  • 不能指定--rsh(-e)选项

一个拷贝远程主机中模块src中的所有文件的例子

1
rsync -av host::src /dets

如果需要认证的话,你会被要求输入密码。你可以设置一个RSYNC_PASSWD的环境变量来避免这个过程。或者使用--password-file,这个方法对于在脚本中使用rsync有用。

在某些系统中,环境变量对所有用户都是可见的,在这种系统中,推荐使用--password-file

设置环境变量RSYNC_PROXY来进行代理,格式为hostname:port。这个代理必须能够支持对端口873的连接。

可以通过设置环境变量RSYNC_CONNECT_PROG为代理命令。

通过远程shell连接使用rsync-daemon功能

rsync支持使用一个远程shell连接,然后启动一个守护服务,这个服务会读取在home地址下的配置文件。这个主要是可以加密那些daemon-style的传输数据。另一种加密一个守护传输的,可以考虑使用ssh来加密一个本地借口到远程机器,然后配置一个rsync服务,只允许来自localhost的连接。

需要明确地设置远程shell程序,用--rsh==COMMAND选项。在环境变量中设置RSYNC_RSH并不会打开这个功能。例如

1
rsync -av --rsh=ssh host::module /dest

可以指定ssh的用户

1
rsync -av -e "ssh -l ssh-user" rsync-user@host::module /dest

ssh-user会被用于ssh的登陆,而rsync-user会被用于模块的登陆

可以对传输顺序排序

rsync会把指定的文件名放入它内部的传输列表中,并排序。这个可以快速地筛除同名文件,会跟用户给出的文件顺序不同。

选项

  • --msgs2stderr 这个选项会把所有信息输到stderr,如果没有--remote-option 比如-M--msgs2stderr
  • -I --ignore-times 同样大小的,但是时间不同的也会被略去
  • --no-motd会影响使用rsync host::来列出所有模块,未理解
  • --size-only只看文件大小来确定文件是否需要传输
  • -@,--modify-window默认是0,是看两个时间戳之间的差值,小于这个选项所给的值则认为相等。如果是正数则表示的单位是秒,如果是负数,表示的单位是纳秒。对于MS Windows FAT文件系统,需要设置为1.

  • -c --checksum 确保文件是被修改过的,而不是采用快速检查修改时间和大小。

  • -a --archive 是一个快速模式,告诉rsync基本上你什么都想保留,除了硬连接。
  • --no-OPTION用来关闭前面已经生效的选项,只可以是那些被整合进别的选项的选项,或者实在不同时候有不同默认值的选项。可以用长或短的格式,比如--no-R--no-relative是一样的。这个选项的顺序是非常重要的。比如要关闭-a中带来的-r,就得把--no-r放在-a的后面,否则无法关闭。
  • -r --recursive 可以递归地传输目录,在3.0.0版本会使用一个增量的扫描方法,这个方法减少了非常多的在传输前所需要的内存空间。并且传输在扫描了一些文件夹之后就开始了。这个增量扫描只影响了递归算法,对于非递归的不影响。如果想要使用的话必需保证传输的两端的rsync版本是3.0.0
  • -R --relative 可以保留路径的信息,比如rsync -av /foo/bar/baz.c remote:/tmp/会在/tmp/下新建一个叫做baz.c的文件,但是rsync -avR /foo/bar/baz.c remote:/tmp/则会在/tm//foo/bar建立一个新的baz.c
  • --no-implied-dirs 会影响-R的默认行为。当这个被打开的时候,前面被提到的目录的属性不会被传输过去。如果有新的目录被创建,那么就会是默认的属性,已有的目录的属性不变。
  • -b,--backup这个选项之前已经存在的目标文件会被转移走或者被删除。
  • --backup-dir=DIR它告诉--backup选项把备份存在哪里,这可以用于增量备份,但是这个不可以跑到模块外面去。
  • --suffix=SUFFIX用来表示--backup的前缀
  • -u,--update这个会跳过所有已经存在的并且修改时间更新的。
  • --inplace 可以将数据直接写到文件的位置上,但它有几个影像,一个是硬连接会被保留,二是在使用的二进制包不能被改写,三是文件容易出现不一致。一个rsync无法写的文件将不会被更新。
  • --append 这个会用追加的方式来更新文件,但是对于那些可能不是从尾部更新的文件,这个会导致错误。
  • --append-verity会校验一下追加更新的文件,如果校验失败,则回退。
    *
  • --chmod可以用来修改文件的读写权限。
  • --owner这个选项可以用来保证传过去的文件的所有者和源文件是一样的
  • --super这个选项会告诉接收端尝试使用超级用户权限。
  • --existing,--ignore-non-existing是告诉rsync跳过需要创建的文件
  • --ignore-existing用来告诉rsync跳过那些已经存在的文件
  • --temp-dir=DIR 可以设置一个临时的文件夹来存储正在拷贝的文件,有利于在磁盘空间不够的时候,将临时文件设置在另一个磁盘上。
  • --partial-dir=DIR 设置一个临时文件夹用于断点续传,但是它并不开启断点续传
  • --partial开启断点续传
  • --delay-updates当文件全部传完了之后再把文件放到目的位置,这样可以使操作显得原子。这个选项与--partial冲突。
  • --info=FLAGS可以显示特定的信息,比如--info=progress2可以显示整体传输的进度。
分享到