Linux 文件同步rsync

与传统的cp、tar备份方式相比,rsync具有安全性高、备份迅速、支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,例如定期的备份文件服务器数据到远端服务器,对本地磁盘定期做数据镜像等。

安装rsync

我们使用wget进行下载,安装包下载完毕后,我们开始解压并安装

wget https://download.samba.org/pub/rsync/src/rsync-3.1.3.tar.gz
tar -xf rsync-3.1.3.tar.gz
./configure
make &&make install

rsync源码安装会把rsync默认安装到/usr/local/目录下,我们可以通过相关帮助进行查看到。如下:

./configure --help

Installation directories:
  --prefix=PREFIX         install architecture-independent files in PREFIX
                          [/usr/local]
  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
                          [PREFIX]

源码方式安装的rsync,要使其开机启动的话。我们可以直接把启动命令放入到rc.local文件中。如下:

echo "/usr/local/bin/rsync --daemon --config=/etc/rsyncd.conf">>/etc/rc.local

rsync命令参数详解

rsync安装完毕后,我们来查看下rsync命令的帮助,如下:

rsync --help

rsync  version 3.1.3  protocol version 31
Copyright (C) 1996-2018 by Andrew Tridgell, Wayne Davison, and others.
Web site: http://rsync.samba.org/
Capabilities:
    64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints,
    socketpairs, hardlinks, symlinks, IPv6, batchfiles, inplace,
    append, no ACLs, xattrs, iconv, symtimes, prealloc

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.

Usage: rsync [OPTION]... SRC [SRC]... DEST
  or   rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST
  or   rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST
  or   rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST
  or   rsync [OPTION]... [USER@]HOST:SRC [DEST]
  or   rsync [OPTION]... [USER@]HOST::SRC [DEST]
  or   rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
The ':' usages connect via remote shell, while '::' & 'rsync://' usages connect
to an rsync daemon, and require SRC or DEST to start with a module name.

Options
 -v, --verbose               increase verbosity
     --info=FLAGS            fine-grained informational verbosity
     --debug=FLAGS           fine-grained debug verbosity
     --msgs2stderr           special output handling for debugging
 -q, --quiet                 suppress non-error messages
     --no-motd               suppress daemon-mode MOTD (see manpage caveat)
 -c, --checksum              skip based on checksum, not mod-time & size
 -a, --archive               archive mode; equals -rlptgoD (no -H,-A,-X)
     --no-OPTION             turn off an implied OPTION (e.g. --no-D)
 -r, --recursive             recurse into directories
 -R, --relative              use relative path names
     --no-implied-dirs       don't send implied dirs with --relative
 -b, --backup                make backups (see --suffix & --backup-dir)
     --backup-dir=DIR        make backups into hierarchy based in DIR
     --suffix=SUFFIX         set backup suffix (default ~ w/o --backup-dir)
 -u, --update                skip files that are newer on the receiver
     --inplace               update destination files in-place (SEE MAN PAGE)
     --append                append data onto shorter files
     --append-verify         like --append, but with old data in file checksum
 -d, --dirs                  transfer directories without recursing
 -l, --links                 copy symlinks as symlinks
 -L, --copy-links            transform symlink into referent file/dir
     --copy-unsafe-links     only "unsafe" symlinks are transformed
     --safe-links            ignore symlinks that point outside the source tree
     --munge-links           munge symlinks to make them safer (but unusable)
 -k, --copy-dirlinks         transform symlink to a dir into referent dir
 -K, --keep-dirlinks         treat symlinked dir on receiver as dir
 -H, --hard-links            preserve hard links
 -p, --perms                 preserve permissions
 -E, --executability         preserve the file's executability
     --chmod=CHMOD           affect file and/or directory permissions
 -X, --xattrs                preserve extended attributes
 -o, --owner                 preserve owner (super-user only)
 -g, --group                 preserve group
     --devices               preserve device files (super-user only)
     --specials              preserve special files
 -D                          same as --devices --specials
 -t, --times                 preserve modification times
 -O, --omit-dir-times        omit directories from --times
 -J, --omit-link-times       omit symlinks from --times
     --super                 receiver attempts super-user activities
     --fake-super            store/recover privileged attrs using xattrs
 -S, --sparse                turn sequences of nulls into sparse blocks
     --preallocate           allocate dest files before writing them
 -n, --dry-run               perform a trial run with no changes made
 -W, --whole-file            copy files whole (without delta-xfer algorithm)
     --checksum-choice=STR   choose the checksum algorithms
 -x, --one-file-system       don't cross filesystem boundaries
 -B, --block-size=SIZE       force a fixed checksum block-size
 -e, --rsh=COMMAND           specify the remote shell to use
     --rsync-path=PROGRAM    specify the rsync to run on the remote machine
     --existing              skip creating new files on receiver
     --ignore-existing       skip updating files that already exist on receiver
     --remove-source-files   sender removes synchronized files (non-dirs)
     --del                   an alias for --delete-during
     --delete                delete extraneous files from destination dirs
     --delete-before         receiver deletes before transfer, not during
     --delete-during         receiver deletes during the transfer
     --delete-delay          find deletions during, delete after
     --delete-after          receiver deletes after transfer, not during
     --delete-excluded       also delete excluded files from destination dirs
     --ignore-missing-args   ignore missing source args without error
     --delete-missing-args   delete missing source args from destination
     --ignore-errors         delete even if there are I/O errors
     --force                 force deletion of directories even if not empty
     --max-delete=NUM        don't delete more than NUM files
     --max-size=SIZE         don't transfer any file larger than SIZE
     --min-size=SIZE         don't transfer any file smaller than SIZE
     --partial               keep partially transferred files
     --partial-dir=DIR       put a partially transferred file into DIR
     --delay-updates         put all updated files into place at transfer's end
 -m, --prune-empty-dirs      prune empty directory chains from the file-list
     --numeric-ids           don't map uid/gid values by user/group name
     --usermap=STRING        custom username mapping
     --groupmap=STRING       custom groupname mapping
     --chown=USER:GROUP      simple username/groupname mapping
     --timeout=SECONDS       set I/O timeout in seconds
     --contimeout=SECONDS    set daemon connection timeout in seconds
 -I, --ignore-times          don't skip files that match in size and mod-time
 -M, --remote-option=OPTION  send OPTION to the remote side only
     --size-only             skip files that match in size
 -@, --modify-window=NUM     set the accuracy for mod-time comparisons
 -T, --temp-dir=DIR          create temporary files in directory DIR
 -y, --fuzzy                 find similar file for basis if no dest file
     --compare-dest=DIR      also compare destination files relative to DIR
     --copy-dest=DIR         ... and include copies of unchanged files
     --link-dest=DIR         hardlink to files in DIR when unchanged
 -z, --compress              compress file data during the transfer
     --compress-level=NUM    explicitly set compression level
     --skip-compress=LIST    skip compressing files with a suffix in LIST
 -C, --cvs-exclude           auto-ignore files the same way CVS does
 -f, --filter=RULE           add a file-filtering RULE
 -F                          same as --filter='dir-merge /.rsync-filter'
                             repeated: --filter='- .rsync-filter'
     --exclude=PATTERN       exclude files matching PATTERN
     --exclude-from=FILE     read exclude patterns from FILE
     --include=PATTERN       don't exclude files matching PATTERN
     --include-from=FILE     read include patterns from FILE
     --files-from=FILE       read list of source-file names from FILE
 -0, --from0                 all *-from/filter files are delimited by 0s
 -s, --protect-args          no space-splitting; only wildcard special-chars
     --address=ADDRESS       bind address for outgoing socket to daemon
     --port=PORT             specify double-colon alternate port number
     --sockopts=OPTIONS      specify custom TCP options
     --blocking-io           use blocking I/O for the remote shell
     --stats                 give some file-transfer stats
 -8, --8-bit-output          leave high-bit chars unescaped in output
 -h, --human-readable        output numbers in a human-readable format
     --progress              show progress during transfer
 -P                          same as --partial --progress
 -i, --itemize-changes       output a change-summary for all updates
     --out-format=FORMAT     output updates using the specified FORMAT
     --log-file=FILE         log what we're doing to the specified FILE
     --log-file-format=FMT   log updates using the specified FMT
     --password-file=FILE    read daemon-access password from FILE
     --list-only             list the files instead of copying them
     --bwlimit=RATE          limit socket I/O bandwidth
     --outbuf=N|L|B          set output buffering to None, Line, or Block
     --write-batch=FILE      write a batched update to FILE
     --only-write-batch=FILE like --write-batch but w/o updating destination
     --read-batch=FILE       read a batched update from FILE
     --protocol=NUM          force an older protocol version to be used
     --iconv=CONVERT_SPEC    request charset conversion of filenames
     --checksum-seed=NUM     set block/file checksum seed (advanced)
 -4, --ipv4                  prefer IPv4
 -6, --ipv6                  prefer IPv6
     --version               print version number
(-h) --help                  show this help (-h is --help only if used alone)

rsync几个重要参数

我们先在此大致介绍下经常使用的几个参数:-v,-a,-z

  • -v, --verbose详细模式输出。
  • -a, --archive归档模式,表示以递归方式传输文件,并保持所有文件属性不变。
  • -z, --compress对备份的文件在传输时进行压缩处理。
  • --delete:删除那些DST中存在而在SRC中没有的文件。

rsync六种工作模式

除此上述几个参数之外,我们还注意到上图中rsync的七个命令格式:如下:

1)rsync [OPTION]... SRC [SRC]... DEST

2)rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST

3)rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST

4)rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST

5)rsync [OPTION]... [USER@]HOST:SRC [DEST]

6)rsync [OPTION]... [USER@]HOST::SRC [DEST]

7)rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]

这七个命令格式就是代表rsync六种不同的工作模式,其中第四种和第七种模式没有多大的区别。在这几种模式中第三种和第六种模式是我们经常使用的,特别是第三种模式

这六种模式总体上可以用两个词进行区分:推送、拉取

推送就是在客户端上执行rsync命令,目的是把客户端需要同步的文件推送到服务器上。

拉取也是在客户端上执行rsync命令,目的是把服务器上的文件拉取到本地。

注意:无论是推送和拉取,rsync命令都是在客户端执行,只是命令的格式不同而已

1) rsync [OPTION]... SRC [SRC]... DEST

同步本地文件,从一个目录同步到另外一个目录。

rsync -avz /data  /backup

表示把本地/data目录下的文件同步到本地/backup目录下。

2) rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST

使用一个远程shell程序(如rsh、ssh)来实现把本地的文件同步到远程机器上。此种方式属于推送方式。

rsync -avz /data [email protected]:/backup

表示把本地/data目录下的文件同步到服务器192.168.199.247的/backup目录下。

3) rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST

把本地的文件同步到远程服务器上,其中DEST表示的是rsync服务器的认证模块名。此种方式属于推送方式。

rsync -avz /data [email protected]::backup --password-file=/etc/rsyncd.password

表示把本地/data目录下的文件同步到服务器192.168.199.247的backup模块下path路径下。

4) rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST

列出远程机器的文件列表。这类似于ls命令,不过只要在命令中省略掉本地机信息即可。

rsync -v rsync://[email protected]/backup

表示在本机列出服务器192.168.199.247的/backup目录下的内容,

5) rsync [OPTION]... [USER@]HOST:SRC [DEST]

把远程机器的文件同步到本地,此种方式属于拉取方式。

rsync -avz [email protected]:/backup /data

表示把192.168.199.247的/backup目录下文件同步到本地/data目录下。

6) rsync [OPTION]... [USER@]HOST::SRC [DEST]

把远程机器的文件同步到本地,此种方式属于拉取方式。

rsync -avz [email protected]::backup --password-file=/etc/rsyncd.password /data

表示把192.168.199.247的backup模块path路径下的文件同步到本地/data目录下。

配置rsync

rsync安装完毕后,我们就需要配置rsync。而对于rsync服务器来说,最重要和最复杂的就是它的配置了。

rsync的配置分为服务器端和客户端,下面我们分开一一讲解。

rsync服务器端配置

rsync服务器端需要两个配置文件:rsyncd.conf、rsyncd.password

其中rsyncd.conf默认存放在/etc/目录下,同时它也是rsync服务器的主配置文件。该文件配置了rsync服务器的控制认证、访问、日志记录等等。而rsyncd.password主要用于存储rsync用户名和密码。

但是在rsync安装完毕后后是不会生成以上这两个配置文件的,需要我们手工进行创建

rsyncd.conf配置文件内容如下:

uid = root

gid = root

user chroot = no

max connections = 200

timeout = 600

pid file = /var/run/rsyncd.pid

lock file = /var/run/rsyncd.lock

log file = /var/run/rsyncd.log

[backup]

path = /backup/

ignore errors

read only = no

list = no

hosts allow = 192.168.199.0/255.255.255.0

auth users = test

secrets file = /etc/rsyncd.password

[www]

path = /www/

ignore errors

read only = no

list = no

hosts allow = 192.168.199.0/255.255.255.0

auth users = apache

secrets file = /etc/rsyncd.password

rsync默认是在nobody用户下运行的,但是我们为了以后同步时不为各种权限的事情烦恼,就让其在root用户下运行

配置文件创建完毕后,我们来创建密码文件。如下:

echo "test:test">>/etc/rsyncd.password

echo "apache:apache">>/etc/rsyncd.password

cat /etc/rsyncd.password

注意:该密码文件中的用户和密码可以进行自定义,同时该用户不一定要在服务器中的系统用户存在。

密码文件创建完毕后,要把其权限要设置为600,否则会在以后同步时提示验证出错。如下:

chmod 600 /etc/rsyncd.password

一个rsync配置文件中可以包含多个认证模块,同时一个密码文件中也可以存放多个用户和其对应的密码。其中每一个认证模块可以对应不同的客户端。

以上两个文件创建完毕后,我们来创建其对应的目录并授权,如下:

mkdir /{backup,www}
chown root:root –R /backup/
chown root:root –R /www/

以上就是rsync服务器端的配置。

rsync客户端配置

rsync客户端配置与服务器端相比差别还是比较大的。

在客户端安装完毕rsync服务后,是不需要启动rsync服务的。我们只需要在客户端创建连接rsync服务器时,验证码用户所需要的密码文件即可。

该密码文件中的密码要与rsync服务器上的密码文件中的密码对应,并且也要与rsync服务器rsyncd.conf配置文件中的认证模块中的用户匹配。

当然该密码文件不创建也是可以的,不创建的话。我们在执行rsync操作时,就需要输入rsync的对应用户的密码。如下:

echo "test">>/etc/rsyncd.password
echo "apache">>/etc/rsyncd.password
chmod 600 /etc/rsyncd.password

注意:该密码文件中只能存放一个用户的密码,并且该文件与rsync服务器端的密码文件一样也需要把其权限设置为600

以上就是rsync客户端的配置。

rsync的启动与关闭

rsync服务器端与客户端都配置完毕后,我们就可以来启动rsync服务器,并且也可以关闭rsync服务。

启动rsync服务

在前面我们讲过rsync-daemon认证方式,需要服务器和客户端都安装rsync服务,并且只需要rsync服务器端启动rsync,同时配置rsync配置文件,客户端启动不启动rsync服务

在此我们只讲解rsync-daemon认证方式的启动。如果是源码方式安装的rsync,我们可以使用rsync –daemon来启动rsync。如下:

echo PATH=$PATH:/usr/local/bin/>>/etc/profile
source /etc/profile
rsync --daemon
ps aux |grep rsync
netstat -tunlp |grep 873

注意:上述命令行中,只有rsync --daemon才是启动rsync的命令。并且该命令启动时,会默认加载/etc/rsyncd.conf文件。

所以如果rsync的配置文件不在/etc目录下或者rsync配置文件名不为rsyncd.conf,那么我们在启动rsync服务时,就要手工加上该配置文件的完整路径。方法如下:

rsync --daemon --config=/etc/rsyncd.conf

关闭rsync服务

要关闭rsync服务,如果是源码方式安装的,我们可以直接通过pkill rsync命令进行关闭。如下:

pkill rsync

rsync同步实例

rsync服务正常启动后,我们就要切换到客户端来实际同步一个文件。

现在rsync服务器是192.168.199.247,rsync客户端为192.168.199.248。

首先在rsync服务器192.168.199.247的www模块下/www/目录下新建一个文件247.log,内容如下:

vi /www/247.log

this is server 247 www.

然后在rsync客户端192.168.199.248的/root下新建一个www目录,并在此目录下创建一个文件248.log,内容如下:

mkdir www

vi /www/248.log

this is client 248 www.

把248文件推送到247上

要把rsync客户端192.168.199.248文件推送到rsync服务器192.168.199.247上,我们需要使用到rsync帮助命令中的第三种命令,如下:

rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST

有关这个命令的作用,我们在前面已经介绍过了,就是把本地的文件同步到远程服务器上

具体使用方法,如下:

rsync -avz /root/www/* [email protected]::www --password-file=/etc/rsyncd.password

把247文件拉取到248上

要把rsync服务器192.168.199.247的文件拉取到rsync客户端192.168.199.248上,我们需要使用到rsync帮助命令中的第六个命令,如下:

rsync [OPTION]... [USER@]HOST::SRC [DEST]

有关这个命令的作用,我们在前面已经介绍过了,就是把远程机器的文件同步到本地。

具体使用方法,如下:

rsync -avz [email protected]::www --password-file=/etc/rsyncd.password /root/www/

 

你可能感兴趣的:(Linux)