Table of Contents

配置 rsync 服务

配置一个简单的rsync服务并不复杂,你需要修改或建立一些配置文件。

  1. rsyncd.conf

    rsyncd.conf 是 rsync 服务的主要配置文件,它控制 rsync 服务的各种属性,下面给出一个 rsyncd.conf 文件的例子:

    # 先定义整体变量
    secrets file = /etc/rsyncd.secrets
    motd file = /etc/rsyncd.motd
    read only = yes
    list = yes
    uid = nobody
    gid = nobody
    hosts allow = 192.168.100.90 # 哪些电脑可以访问rsync服务
    hosts deny = 192.168.100.0/24 # 哪些电脑不可以访问rsync服务
    max connections = 2
    log file = /var/log/rsyncd.log
    pid file = /var/run/rsyncd.pid
    lock file = /var/run/rsync.lock
    # 再定义要rsync目录
    [oxnz]
    comment = oxnz's directory from 192.168.100.21
    path = /home/oxnz
    auth users = oxnz,rsync
    [test]
    comment = test rsync
    path = /home/test
    

    在上面的配置文件中,限定了 192.168.100.0/24 这个子网中,只有 192.168.100.90 的机器可以来访问这台 rsync 服务器的 rsync 服务。 配置文件的后面部分定义了两个 rsync 的目录,oxnz 目录是只有知道 oxnz、rsync 两个账号的人才能使用的,而 test 目录是无需账号就可以访问的。 rsync 在定义目录时还提供了一些其它选项,可以作更严格的控制。

  2. rsyncd.secrets

    # vi /etc/rsyncd.secrets
    

    rsyncd.secrets 是存储 rsync 服务的用户名和密码的,它是一个明文的文本文件,下面给出一个 rsyncd.secrets 文件的例子:

    oxnz:12345
    rsync:abcde
    

    因为 rsyncd.secrets 存储了 rsync 服务的用户名和密码,所以非常重要,因此文件的属性必须设为 600,只有所有者可以读写:

    # chmod 600 /etc/rsyncd.secrets
    
  3. rsyncd.motd

    # vi /etc/rsyncd.motd
    

    rsyncd.motd 记录了 rsync 服务的欢迎信息,你可以在其中输入任何文本信息,如:

    Welcome to use the rsync services!
    
  4. services

    # vi /etc/services
    

    services 并不是 rsync 的配置文件,这一步也可以不做。而修改了 services 文件的好处就在于系统知道 873 端口对就的服务名为 rsync。修改 services 的方法就是确保 services 中有如下两行,没有的话就自行加入:

    rsync  873/tcp  # rsync
    rsync  873/udp  # rsync
    
  5. /etc/xinetd.d/rsync

    xinetd (eXtended InterNET services daemon) 已经取代了 inetd,并且提供了访问控制、加强的日志和资源管理功能,已经成了 Red Hat 7 的 Internet 标准超级守护进程。

    建立一个名为 /etc/xinetd.d/rsync 文件,输入以下内容:

    service rsync
    {
    disable = no
    socket_type  = stream
    wait      = no
    user      = root
    server     = /usr/local/rsync/bin/rsync
    server_args  = --daemon
    log_on_failure += USERID
    }
    

    保存后,就可以运行 rsync 服务了。输入以下命令:

    # /etc/rc.d/init.d/xinetd reload
    

    这样 rsync 服务就在这台机器上 (192.168.100.21) 运行起来了,接下来就是如何来使用它了。

rsync 命令的用法

在配置完 rsync 服务器后,就可以从客户端发出 rsync 命令来实现各种同步的操作。rsync 有很多功能选项,下面就对介绍一下常用的选项:

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.

rsync 有六种不同的工作模式:

  1. 拷贝本地文件;当SRC和DES路径信息都不包含有单个冒号”:”分隔符时就启动这种工作模式。
  2. 使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当 DST 路径地址包含单个冒号”:”分隔符时启动该模式。
  3. 使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当 SRC 地址路径包含单个冒号”:”分隔符时启动该模式。
  4. 从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含”::”分隔符时启动该模式。
  5. 从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含”::”分隔符时启动该模式。
  6. 列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。

下面以实例来说明:

# rsync -vazu -progress oxnz@192.168.100.21:/oxnz/ /home
  • v 详细提示
  • a 以 archive 模式操作,复制目录、符号连接
  • z 压缩
  • u 只进行更新,防止本地新文件被重写,注意两者机器的时钟的同时
  • -progress 指显示

以上命令是保持客户机 192.168.100.90 上的 /home/oxnz 目录和 rsync 服务器上的 oxnz 目录同步。 该命令执行同步之前会要求你输入 oxnz 账号的密码,这个账号是我们前面在 rsyncd.secrets 文件中定义的。 如果想将这条命令写到一个脚本中,然后定时执行它的话,可以使用 –password-file 选项,具体命令如下:

# rsync -vazu -progress --password-file=/etc/rsync.secret
oxnz@192.168.100.21:/oxnz/ /home

要使用 –password-file 选项,就得先建立一个存放密码的文件,这里指定为 /etc/rsync.secret。 其内容很简单,如下:

oxnz:12345

同样要修改文件属性如下:

# chmod 600 /etc/rsyncd.secrets

利用 rsync 保持 Linux 服务器间的文件同步

现在假设有两台 Linux 服务器 A(192.168.100.21) 和 B(192.168.100.90),服务器 A 中的 /home/oxnz 和服务器 B 中的 /home/oxnz 这两个目录需要保持同步,也就是当服务器 A 中文件发生改变后,服务器 B 中的文件也要对应去改变。

我们按上面的方法,在服务器 A 上安装 rsync,并将其配置为一台 rsync 服务器,并将 /home/oxnz 目录配置成 rsync 共享出的目录。然后在服务器 B 上安装 rsync,因为 B 只做客户端,所以无需配置。

然后在服务器 B,建立以下脚本:

#!/bin/bash
/usr/loca/rsync/bin/rsync -vazu --bwlimit=1000 -progress --delete
	--password-file=/etc/rsync.secret oxnz@192.168.100.21:/oxnz/ /home

将这个脚本保存为 AtoB.sh,并加上可执行属性:

# chmod 755 /root/AtoB.sh

然后,通过 crontab 设定,让这个脚本每 30 分钟运行一次。执行命令:

# crontab -e
0,30 * * * * /root/AtoB.sh

保存退出,这样服务器 B 每个小时的 0 分和 30 分时都会自动运行一次 AtoB.sh,AtoB.sh 是负责保持服务器B和服务器A同步的。 这样就保证了服务器 A 的所有更新在 30 钟后,服务器 B 也一样取得了和服务器 A 一样的最新的资料。

其它应用

rsync 除了同步文件及目录之外,还可以利用它来实现对远程网站的远程备份。 如果再结合脚本和 crontab 就能实现定时自动远程备份。

rsync 修正下载错误

文件镜像下载出错之后可以使用 rsync 同步解决:

用rsync工具同步解决映像不完整问题

大家都知道 rsync 最主要的功能就是同步备份和镜像功能,前提是得有 rsync 服务器 (因为 rsync 并不能同步 ftp 和 web 服务器上的映像文件)。 目前大多数 Linux 发行版都有 rsync 服务器,我们就可以利用 rsync 服务器上的源来同步不完整的光盘映像。 当然也能用 rsync 下载 rsync 服务器上的文件。

寻找Linux发行版的rsync服务器,我们得找有类似下面的地址: rsync://mirrors.kernel.org

rsync 进入服务器的方法:

比如我下载的 FC-18-i386-DVD.iso 有问题,想用 rsync 来同步解决。 首先就要找拥有 FC-18-i386-DVD.iso 的 rsync 服务器 于是到 Fedora.redhat.com 的下载列表中寻找,发现 rsync://mirrors.kernel.org 上有这个文件 所以先要进入这台服务器 (请不要把地址后面的/省略,这样不会列出服务器或服务器目录中的文件)

[root@localhost xinyi]# rsync rsync://mirrors.kernel.org/
MOTD:
MOTD: Welcome to the Linux Kernel Archive.
MOTD:
mirrors All mirror sites
LDP Linux Documentation Project
debian Debian Linux distribution mirror
debian-cd Debian CD image mirror
redhat RedHat mirror
fedora Fedora - RedHat community project
fedora-enchilada Fedora - RedHat community project
fedora-epel Fedora - RedHat community project
fedora.us fedora.us - Additional stuff for Fedora
centos CentOS - An Enterprise-class Linux distribution (complete)
sourceware sourceware.org (formerly sources.redhat.com) mirror
CPAN CPAN mirror
suse Novell SUSE mirror
opensuse OpenSUSE - Novell's community project
archlinux Archlinux - A simple, lightweight linux distribution
ubuntu ubuntu mirror
ubuntu-releases ubuntu-releases mirror
gentoo Gentoo
slackware slackware mirror

发现在这个服务器上有fedora的镜像 我们一级一级的进去;执行下面的命令:

MOTD:
MOTD:   Welcome to the Linux Kernel Archive.
MOTD:

drwxr-xr-x            101 2016/05/17 06:56:09 .
drwxr-xr-x          4,096 2006/10/17 20:46:37 core
drwxr-xr-x             41 2016/07/28 09:45:56 development
drwxrwxr-x             27 2013/04/25 16:55:49 extras
drwxr-xr-x          4,096 2016/06/17 09:14:13 releases
drwxrwsr-x          4,096 2016/08/05 06:49:33 updates
[root@F8SG: xinyi]$ rsync rsync://mirrors.kernel.org/fedora/releases/18/Fedora/i386/iso/
drwxr-sr-x 4096 2012/05/25 13:30:02 .
-rw-r--r-- 1121 2012/05/25 13:30:02 Fedora-18-i386-CHECKSUM
-rw-r--r-- 3912237056 2012/05/23 05:00:47 Fedora-18-i386-DVD.iso
-rw-r--r-- 208666624 2012/05/23 04:58:41 Fedora-18-i386-netinst.iso

我们发现了 FC-18-i386-DVD.iso,这时我们要进行下一个过程,同步文件

用rsync 同步文件的语法:

rsync -vzP <映像文件的 rsync 地址> <你以前下载下来的文件>
[root@localhost fc5]# rsync -vzP \
rsync://mirrors.kernel.org/fedora/releases/18/i386/iso/Fedora-18-i386-DVD.iso \
FC-5-i386-DVD.iso

稍等片刻便会出现下载提示之类的。

rsync 的原理是先从本地已存的文件中下载,然后对照服务器的文件,如果已经下载的文件不完整,就从服务器上下载;如果有错误的,就修正;会先产生一个临时文件,也就类似下面的

[root@localhost fc5]# ls -la
-rw-rw-r-- 1 a2di a2di 1.2G Dec 11 18:00 Fedora-18-i386-DVD.iso
-rw-rw-r-- 1 a2di a2di 1.0G Dec 11 18:00 Fedora-18-i386-DVD.iso.NF3D2U

等完成后,会有类似下面这样的提示,然后 rsync 会自动删除临时文件,更新原 iso 文件。

Fedora-18-i386-DVD.iso 3253669888 100% 164.78kB/s 5:21:22 (1, 100.0% of 1)
wrote 381831 bytes read 953051797 bytes 48730.35 bytes/sec total size is 3253669888 speedup is 3.41

经过这个简单的过程,我们就把有问题的文件同步更新了。然后我们再来检测文件的完整性;这样就可以修正存在问题的文件

注意: 同步文件时,要有大一点的空间;因为同步的过程中,rsync 会创建一个和你下载文件同等大小的临时文件。