我正在使用多台Linux笔记本电脑/台式机,并希望它们“共享”主目录。
很遗憾,NFS不是一种选择。因此我试图使用rsync创建一个bash脚本,但我无法弄清楚如何做到这一点。
这是我现在的例子
`#`!/bin/bash
sync() {
rsync -azvR --exclude-from=/home/ME/.rsync_excludes --delete -e 'ssh -ax' $1 $2
}
sync /home/ME server.domain:/home/ME
`#`sync server.domain:/home/ME /home/ME
我认为如果我只使用一台更新服务器文件的客户端机器,这将会很有效。正确的吗?
如果我在一个客户端删除文件怎么办?该文件想要在另一个客户端上删除(在同步原因之后)?
我可以将rsync用于此目的吗?我应该寻找其他计划吗?希望不是......
编辑:由于这个解决方案不仅仅适合我,如果解决方案有点自动,我将不胜感激。
Edit2:也许必须有一个包含回购的解决方案。 Subversion,Git,Mercurial或其他。
答案 0 :(得分:9)
rsync
可以保持一个位置与主节点同步。或者换句话说,镜像A到B.但这不是你正在做的事情。你必须rsync
A到B和B到A.这带来了一系列全新的问题。如果文件消失,您是否需要在另一侧删除或rsync回来?也许它在另一边被修改了;你不能检查。
反正;这个问题的解决方案以unison的形式出现。这是一个工具(适用于Linux,OS X,Windows,BSD,...)(具有CLI工具,GUI工具,并且可以在cron
中很好地安排),这将很好地保留您的主目录或任何其他目录同步,并使其能够处理几乎任何类型的冲突或问题。那些人认为这比我们在这里做得更好。
或者,有SCM。许多人使用SCM来管理他们的主目录。 Subversion很受欢迎,但我根本不推荐它。它不仅会占用大量空间,还会使所有内容变得非常缓慢,并根据与主存储库的活动连接强制保持同步。有其他选择,比如GIT和其他,但它们都有其缺点。
无论哪种方式,任何基于SCM的解决方案都违反了一个非常重要的SCM规则:你永远不应该在那里保留大的二进制数据。 SCM不是为此而制造的。您不会在SCM中保留您的照片集,电影,文档,下载和类似内容,即使您可能希望保持它们的同步或保留它们的历史记录(特别是对于图片/文档)。
了解保持备份和保持同步之间存在差异非常重要。您的备份应保存在远程/分离位置,并且可以包含您拥有的所有内容的历史记录。我个人推荐rdiff-backup。它保存了所有内容的历史,使用了rsync
算法来最小化流量并访问备份位置看起来像备份的最新状态:您可以像浏览普通文件一样浏览它。
总而言之,我建议您将unison和rdiff-backup结合使用,以获得全面的解决方案,确保您的数据安全可靠地同步。
答案 1 :(得分:2)
为什么不使用Subversion执行此操作?链接的文章详细说明了作者如何使用源代码控制同步和存储历史记录(您不必使用Subversion,显然 - 还有替代方案)
答案 2 :(得分:1)
看看你做了什么,这应该工作......你只需要确保每个客户端在你完成它之后同步到服务器。我使用以下内容,我在每个目录的基础上手动调用:
function syncDown() {
f=${1/\\/$/}/;
rsync -acuvz --exclude 'CVS' --exclude '*.class' --exclude '.classpath' server:projects/$f $f;
}
function syncUp() {
f=${1/\\/$/}/;
rsync -acuvz --exclude 'CVS' --exclude '*.class' $f server:projects/$f;
}
如果您正在寻找无人值守的自动同步,那么您将无法获得它:您将始终拥有在一个客户端上工作的竞争条件,但该工作会被另一个客户端的同步覆盖。
答案 3 :(得分:0)
看起来您可能已经知道这一点,但是,只是为了强调那些可能会在未来看到这个问题的人:
rsync
仅进行单向同步。如果您想要双向同步,则需要使用其他内容。 (cvs
/ svn
/ git
/ etc。适合“别的”,但如果您不需要更新历史记录,则修订控制系统可能不是最佳选择。)
实际上,这意味着如果您{A}从A到B,那么每次同步都会使B上的目录看起来与A上的目录完全一样 - 自上次同步以来对B所做的任何更改将丢失(除非排除,并且警告rsync
只会在指定rsync
时删除文件。这种具有权威主版本的安排在很多情况下都适用于其他位置,但任何类型的协作工作都不在其中。