Mac OS X:升级rsync和同步应用实例
最后更新于:2022-04-01 10:54:27
# Mac OS X:升级rsync到最新版本
Tech Level 3
History:
July 17, 2009: 若干处修辞的修改. 添加了和TimeMachine的比较部分.
### rsync简介
rsync是开放许可GPL开放源码的增量数据传输/同步命令行工具。它采用快速算法,只把远程文件和本地文件不同的部分传输,从而得到本地和远程数据同步。作为系统管理员的一个难以置信好用的工具,它已经被接受和使用了好长时间了。
[![](image/56a5a6ac6fb84.jpg)](http://docs.google.com/File?id=dfm3jbw9_186d87gv7gw_b)
它的特点是:可以传输文件/文件夹/目录树/甚至是整个系统;可以保留符号连接/权限/硬连接/文件属性/设备等;可以是用ssh/rsh等用于传导;支持用于镜象操作的匿名传输等等。
它在类Unix系统中广泛存在和应用,这里引用当前最新版本3.0.6的安装使用,因为它的更新很快,所以请持续关注/更新。了解更多的详细信息,到它的官方网站http://samba.org/rsync/。
### 在Mac系统上的rsync
我目前的Mac OS XLeopard是10.5.7版本,它本身所带的rsync版本是2.6.9,在3.0.5之前的版本耗费更多的内存处理文件,并且对没有修改的resource forks也会传输,更致命的是有可能在处理极多数量文件(不是大文件)的时候造成内存溢出的错误,所以如果你没有更新,那么应该按照下面的方法更新。
### rsync的版本更新
这里涉及很多命令行,所以适合于熟悉Terminal的技术人员.
### 1. 下载最新版本:
你可以使用浏览器到rsync的官方下载网站下载源程序:[http://samba.org/ftp/rsync/](http://samba.org/ftp/rsync/ "http://samba.org/ftp/rsync/"). 也可以使用下面的命令行来下载, 其中主要有两个gz文件:
<table id="cor." style="width: 100%;" border="1" cellspacing="0" cellpadding="3" bordercolor="#000000"><tbody><tr><td width="100%">$ mkdir -p /Users/Shared/rsync<br/>$ cd /Users/Shared/rsync<br/>$ curl -O http://http://samba.org/ftp/rsync/<a href="http://samba.org/ftp/rsync/rsync-3.0.6.tar.gz">rsync-3.0.6.tar.gz</a><br/>$ curl -O http://http://samba.org/ftp/rsync/<a href="http://samba.org/ftp/rsync/rsync-patches-3.0.6.tar.gz">rsync-patches-3.0.6.tar.gz</a></td></tr></tbody></table>
假设这些下载的文件保存在/Users/Shared/rsync/目录中, 后面我们也将工作在这个目录中.
### 2. 展开tar.gz文件:
使用下面命令解压缩,或者是用Archive Utility.app来解压缩:
<table id="um5b" style="width: 100%;" border="1" cellspacing="0" cellpadding="3" bordercolor="#000000"><tbody><tr><td width="100%">$ tar -xzvf rsync-3.0.6.tar.gz<br/>$ tar -xzvf rsync-patches-3.0.6.tar.gz</td></tr></tbody></table>
在/Users/Shared/目录中将出现rsync-3.0.6的文件夹。
### 3. 编译安装:
用下面的命令来打补丁保留Mac OS X的元数据
<table id="on3g" style="width: 100%;" border="1" cellspacing="0" cellpadding="3" bordercolor="#000000"><tbody><tr><td width="100%"><span style="font-family: Courier New;">$ patch -p1 <patches/fileflags.diff<br/>$ patch -p1 <patches/crtimes.diff</span></td></tr></tbody></table>
配置编译并安装
<table id="jqke" style="width: 100%;" border="1" cellspacing="0" cellpadding="3" bordercolor="#000000"><tbody><tr><td width="100%"><span style="font-family: Courier New;">$ ./prepare-source<br/>$ ./configure<br/>$ make<br/>$ sudo make install</span></td></tr></tbody></table>
### 4. 版本验证
<table id="guor" style="width: 100%;" border="1" cellspacing="0" cellpadding="3" bordercolor="#000000"><tbody><tr><td width="100%"><span style="font-family: Courier New;"><span style="font-family: Courier New; color: #660000;">$ /usr/local/bin/rsync --version</span><br/></span></td></tr></tbody></table>
应该输出如下:
<table id="pz8g" style="width: 100%;" border="1" cellspacing="0" cellpadding="3" bordercolor="#000000"><tbody><tr><td width="100%">rsync version <strong>3.0.6</strong> protocol version 30<br/>Copyright (C) 1996-2009 by Andrew Tridgell, Wayne Davison, and others.<br/>Web site: http://rsync.samba.org/<br/>Capabilities:<br/> 64-bit files, 32-bit inums, 32-bit timestamps, 64-bit long ints,<br/> socketpairs, hardlinks, symlinks, IPv6, batchfiles, inplace,<br/> append, ACLs, xattrs, iconv, symtimes, file-flags<br/><br/>rsync comes with ABSOLUTELY NO WARRANTY. This is free software, and you<br/>are welcome to redistribute it under certain conditions. See the GNU<br/>General Public Licence for details.</td></tr></tbody></table>
注意, rsync自动安装到/usr/local/bin/目录中, 而Mac OS X自带的rsync版本在/usr/bin/目录中,你可以添加路径或者将新版本的移动到/usr/bin/目录中.
### 5. 清理
这时候已经用不着保存这些下载文件和源程序了,删除他们:
<table id="zv_o" style="width: 100%;" border="1" cellspacing="0" cellpadding="3" bordercolor="#000000"><tbody><tr><td width="100%"><span style="font-family: Courier New; color: #660000;">$ rm -fr /Users/Shared/rsync</span><br/><span style="font-family: Courier New; color: #660000;">$ sudo rm /usr/share/man/man1/rsync.1.gz</span><br/></td></tr></tbody></table>
因为最后的安装脚本没有考虑到需要删除原来Mac OS X自带的rsync.1 man文件,所以上面脚本的最后一行删除了旧版本的man文件。
### 命令解释
### 1. 基本形式
它的命令行的基本形式是:
rsync [OPTIONS] SRC [SRC]... DEST
其中
[OPTIONS]是参数
SRC [SRC]... 可以指定多个文件源
DEST 最后一个参数指定目的地
当然文件源SRC和目的地DEST可以是本地,可以是其它主机,可以是rsync服务程序地址等.
### 2. 常用参数:
-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: 不分析文件名,直接拷贝他们
### 3. 应用场景参数
下面根据不同的应用场景做解释
- 对于更新大文件可以使用--inplace选项,默认的是复制新文件,在确认复制完毕后,在删除原来旧的已经存在的文件,这样对于大文件,基于空间的考虑,可能造成备份的错误。
- 有的情况是只需要更新已经存在的文件,那么使用--existing, --ignore-non-existing选项
- 如果是移动而不是备份,可以是用--remove-source-files删除源文件
- 有的时候可能需要备份制定的文件,指定的文件在一个文件列表中,那么可以是用参数:--files-from=FILE
- 增量复制的时候,可以指定完全备份和其它增量备份的路径,这样本次的增量备份,只备份以前以来改变的文件,选项参数为:--compare-dest=DIR
- 压缩传输,这样数据被压缩后传输,适用于低速网络,-z, --compress
- 测试使用:
-n, --dry-run:这个参数只是模拟备份过程,而不是实际传输数据
-v,--vverbose:显示备份过程
-i, --itemize-changes:输出一个文件变化汇总。
--progress: 显示备份字节数,百分比,传输速度等信息
更多的参数和使用细则可以参考:
1. 使用rsync -h或者man rsync查看帮助信息。
1. rsync命令的网上帮助:http://samba.org/ftp/rsync/rsync.html
1. rsync作为伺服程序的在线帮助:http://samba.org/ftp/rsync/rsyncd.conf.html
### 应用实例:
1. 简单的在一个主机上的数据备份:
比如将/Users/Shared目录复制到/Users/Shared.Backup
<table id="g56i" style="width: 100%;" border="1" cellspacing="0" cellpadding="3" bordercolor="#000000"><tbody><tr><td width="100%"><span style="font-family: Courier New;">$ </span><span style="font-family: Courier New;">/usr/local/bin/rsync -aANHXxs --progress </span><span style="font-family: Courier New; color: #660000;">/Users/Shared/ /Users/Shared.Backup/</span><br style="font-family: Courier New; color: #660000;"/></td></tr></tbody></table>
2. 复制整个Mac OS X系统到另外一台机器的目录中:
假设远程机器和目录是:remote_address:/Volumes/Backup/, 用户使用root
<table id="y8hl" style="width: 100%;" border="1" cellspacing="0" cellpadding="3" bordercolor="#000000"><tbody><tr><td width="100%"><span style="color: #000000;">$ </span>/usr/local/bin/rsync -aNHAXx --protect-args --fileflags--force-change --rsync-path="/usr/local/bin/rsync" /root@remote_address:/Volumes/Backup/<br/></td></tr></tbody></table>
3. 使用ssh避免在远程机上的认证过程:
下面假设使用root用户作为远程复制的用户.
首先检查当前是否已经存在认证钥匙对:
| $ 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来实现自动备份<待后续>
### 比较: rsync和Apple的Time Machine
大家不免要想到好多其它的备份软件,其中对于普通Mac OS X Leopard用户来说,当然要说是苹果开发随Mac OS X Leopard发布的"时间机器"(Time Machine)了.
有了时间机器还用rsync类似的第三方的备份/同步软件吗?
我说,对于普通用户,时间机器提供了功能强大稳定的用户数据备份功能,而且是在最少的用户干预情况下(用户到SystemPreferences里面,拨动那个开关就可以打开或者关闭它,然后就让它自己工作了),这对于普通用户的使用感受来说,简直是美妙极了。相比较上面的一大堆"非人性化的恶梦般的"参数,我很佩服时间机器的开发人员对于用户需求的高度概括抽象能力和人性化的表达能力以及付诸实施的执行力,这方面微软的备份和恢复功能,对于用户来说多少有点复杂和不够人性化了。
但是对于企业用户,或者说企业的系统管理员来说,那简直像一个玩具,无法达到企业备份需求.
当然了,时间机器并不是不可能在企业应用中使用,它作为一种用户个人辅助备份选择,同样可以发挥自己的桌面备份作用,至少是一个选项。
而rsync不仅提供了强大的功能,而且用户可以进行再次开发,或者给于GUI的包装,改进用户的使用体验,它很好地支持网络用户的需求,也给于了管理员很多自由度以及对于细节的控制。结合其它的技术,可以实现完全/增量备份,定时备份,远程备份恢复,用户数据同步,可以利用rsyncservice而对远程数据操作等等操作.
### 注释:
这里的命令行都以$为开始,用来标示后面是用户输入的命令的内容,用户输入命令的时候只输入后面的命令部分;有可能因为排版问题,命令会自动换行。