rsync是开放许可GPL开放源码的增量数据传输/同步命令行工具。它采用快速算法,只把远程文件和本地文件不同的部分传输,从而得到本地和远程数据同步。作为系统管理员的一个难以置信好用的工具,它已经被接受和使用了好长时间了。
它的特点是:可以传输文件/文件夹/目录树/甚至是整个系统;可以保留符号连接/权限/硬连接/文件属性/设备等;可以是用ssh/rsh等用于传导;支持用于镜象操作的匿名传输等等。
它在类Unix系统中广泛存在和应用,这里引用当前最新版本3.0.6的安装使用,因为它的更新很快,所以请持续关注/更新。了解更多的详细信息,到它的官方网站http://samba.org/rsync/。
我目前的Mac OS X Leopard是10.5.7版本,它本身所带的rsync版本是2.6.9,在3.0.5之前的版本耗费更多的内存处理文件,并且对没有修改的 resource forks也会传输,更致命的是有可能在处理极多数量文件(不是大文件)的时候造成内存溢出的错误, 所以如果你没有更新,那么应该按照下面的方法更新。
这里涉及很多命令行,所以适合于熟悉Terminal的技术人员.
你可以使用浏览器到rsync的官方下载网站下载源程序:http://samba.org/ftp/rsync/ . 也可以使用下面的命令行来下载, 其中主要有两个gz文件:
$ mkdir -p /Users/Shared/rsync $ cd /Users/Shared/rsync $ curl -O http://http://samba.org/ftp/rsync/rsync-3.0.6.tar.gz $ curl -O http://http://samba.org/ftp/rsync/rsync-patches-3.0.6.tar.gz |
假设这些下载的文件保存在/Users/Shared/rsync/目录中, 后面我们也将工作在这个目录中.
使用下面命令解压缩,或者是用Archive Utility.app来解压缩:
$ tar -xzvf rsync-3.0.6.tar.gz $ tar -xzvf rsync-patches-3.0.6.tar.gz |
在/Users/Shared/目录中将出现rsync-3.0.6的文件夹。
用下面的命令来打补丁保留Mac OS X的元数据
$ patch -p1 <patches/fileflags.diff $ patch -p1 <patches/crtimes.diff |
配置编译并安装
$ ./prepare-source $ ./configure $ make $ sudo make install |
$ /usr/local/bin/rsync --version |
应该输出如下:
rsync version 3.0.6 protocol version 30 Copyright (C) 1996-2009 by Andrew Tridgell, Wayne Davison, and others. Web site: http://rsync.samba.org/ Capabilities: 64-bit files, 32-bit inums, 32-bit timestamps, 64-bit long ints, socketpairs, hardlinks, symlinks, IPv6, batchfiles, inplace, append, ACLs, xattrs, iconv, symtimes, file-flags 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自动安装到/usr/local/bin/目录中, 而Mac OS X自带的rsync版本在/usr/bin/目录中,你可以添加路径或者将新版本的移动到/usr/bin/目录中.
这时候已经用不着保存这些下载文件和源程序了,删除他们:
$ rm -fr /Users/Shared/rsync $ sudo rm /usr/share/man/man1/rsync.1.gz |
因为最后的安装脚本没有考虑到需要删除原来Mac OS X自带的rsync.1 man文件,所以上面脚本的最后一行删除了旧版本的man文件。
它的命令行的基本形式是:
rsync [OPTIONS] SRC [SRC]... DEST
其中
[OPTIONS]是参数
SRC [SRC]... 可以指定多个文件源
DEST 最后一个参数指定目的地
当然文件源SRC和目的地DEST可以是本地,可以是其它主机,可以是rsync服务程序地址等.
-a:这个参数基本上包括了多数情况需要的复制选项,它等于选项-rlptgoD,
-r 所有子目录,
-l 复制符号连接
-t 保留文件修改日期
-g 保留group属性
-o 保留拥有者属性
-D 复制设备和特殊文件
-p 保留权限属性
-A, --acls:复制文件的ACLs
-N, --crtimes :保留生成日期属性
-X, --xattrs: 保留扩展属性(extended attributes)
--fileflags:复制文件的状态标志(Mac OS X使用)
--force-change: 取消目的地的文件和目录的系统和用户的immutable标志
{上面这些尤其对Mac OS X文件系统重要}
-H, --hard-links:复制硬连接
-q, --quiet:安静模式,不输出信息
-x, --one-file-system: 禁止复制跨文件系统的文件
-s, --protect-args: 不分析文件名,直接拷贝他们
下面根据不同的应用场景做解释
更多的参数和使用细则可以参考:
1. 简单的在一个主机上的数据备份:
比如将/Users/Shared目录复制到/Users/Shared.Backup
$ /usr/local/bin/rsync -aANHXxs --progress /Users/Shared/ /Users/Shared.Backup/ |
2. 复制整个Mac OS X系统到另外一台机器的目录中:
假设远程机器和目录是:remote_address:/Volumes/Backup/, 用户使用root
$ /usr/local/bin/rsync -aNHAXx --protect-args --fileflags --force-change --rsync-path="/usr/local/bin/rsync" / root@remote_address:/Volumes/Backup/ |
$ sudo ls -la /var/root/.ssh |
如果有两个文件存在:id_dsa和id_dsa.pub, 如果不存在则运行下面的命令来生成
$ sudo ssh-keygen -t dsa -f /private/var/root/.ssh/id_dsa -C "this is for rsync over ssh" |
而id_dsa是私有钥匙,id_dsa.pub是公开钥匙.
现在就把id_dsa.pub公开钥匙添加到远程目标机上的"/var/root/.ssh/authorized_keys"中, 也可以用下面的命令添加:
$ sudo cat /private/var/root/.ssh/id_dsa.pub | ssh root@remote_address 'cat - >> ~/.ssh/authorized_keys' |
完成上面的步骤两个机器就可以使用root用户互相信任了。
4. 使用Launchd来实现自动备份<待后续>
大家不免要想到好多其它的备份软件,其中对于普通Mac OS X Leopard用户来说,当然要说是苹果开发随Mac OS X Leopard发布的"时间机器"(Time Machine)了.
有了时间机器还用rsync类似的第三方的备份/同步软件吗?
我说,对于普通用户,时间机器提供了功能强大稳定的用户数据备份功能,而且是在最少的用户干预情况下(用户到System Preferences里面,拨动那个开关就可以打开或者关闭它,然后就让它自己工作了),这对于普通用户的使用感受来说,简直是美妙极了。相比较上面的 一大堆"非人性化的恶梦般的"参数,我很佩服时间机器的开发人员对于用户需求的高度概括抽象能力和人性化的表达能力以及付诸实施的执行力,这方面微软的备 份和恢复功能,对于用户来说多少有点复杂和不够人性化了。
但是对于企业用户,或者说企业的系统管理员来说,那简直像一个玩具,无法达到企业备份需求.
当然了,时间机器并不是不可能在企业应用中使用,它作为一种用户个人辅助备份选择,同样可以发挥自己的桌面备份作用,至少是一个选项。
而rsync不仅提供了强大的功能,而且用户可以进行再次开发,或者给于GUI的包装,改进用户的使用体验,它很好地支持网络用户的需求,也给于了管理员 很多自由度以及对于细节的控制。结合其它的技术,可以实现完全/增量备份,定时备份,远程备份恢复,用户数据同步,可以利用rsync service而对远程数据操作等等操作.
这里的命令行都以$为开始,用来标示后面是用户输入的命令的内容,用户输入命令的时候只输入后面的命令部分;有可能因为排版问题,命令会自动换行。