同步您的生活
曾几何时,一台电脑就是您所需要的一切。您的所有文档都存放在那台电脑上,或附近的几叠软盘或 CD-ROM 中,别无他处。那些日子已经一去不复返了,就像一家一车、一家一电视和一家一 iPod 的日子一样。
今天,我有一台家用电脑,我的妻子也有一台。还有我的笔记本电脑、我女儿的笔记本电脑、我的工作电脑和我的文件服务器。任何时候我都可能发现自己坐在这些电脑中的任何一台前,无论我碰巧坐在哪里,都肯定会有一个文件位于其他电脑中的一台上,而我更希望能够随时访问。这些文件大多与我目前正在进行的项目有关。如果灵感来袭,我希望能够打开相应的文件或创建一个新文件并开始写作,而无需担心。我担心是因为在我在一天内可能坐下的各种电脑上的所有登录名之间保持这些文件同步是一个大问题。
有很多方法可以使多个计算机上的文件保持最新。最简单的方法是将所有内容都随身携带在 USB 密钥或其他可写可移动介质上。我确实将此用于某些文件,主要是那些我想保持非常安全的文件。但是,USB 密钥有时很不方便。例如,我的文件服务器卡在壁橱里,键盘、显示器和鼠标被布线到壁橱外的一张小桌子上。访问服务器背面的 USB 端口并不容易。
另一种简单的方法是使用 scp 像这样来回复制文件
scp -rP /home/me/Documents me@192.168.0.2:/home/me/
这可以工作,但是当我在家用电脑上修改了一个文件,而在笔记本电脑上修改了另一个文件时,我很快就会遇到问题。当我下次进行 scp 时,我将覆盖其中一个文件,具体取决于我从哪台计算机启动 scp。为了防止这种情况,我需要在每次编辑会话结束时始终进行 scp,但是我并不总是记得这样做。
scp 的另一个问题是它总是复制所有内容,即使目标位置存在相同的副本。这是 rsync 很好地解决的问题之一。上面的 scp 命令可以使用 rsync 像这样复制
rsync -avP /home/me/Documents me@192.168.1.2:/home/me
使用 rsync,目标位置已存在的任何文件都不会被传输。这大大加快了传输时间。但是,仍然存在在两侧都进行修改的问题。默认情况下,rsync 程序仅查看文件的大小和时间戳是否不同。它不在乎哪个文件较新,如果文件不同,则会被覆盖。您可以将“--update”标志传递给 rsync,这将导致它跳过目标位置上比源文件新的文件,但这仅限于它们是相同类型的文件。这意味着,例如,如果源文件是常规文件,而目标位置是符号链接,则无论时间戳如何,目标文件都将被覆盖。即使忽略其怪癖,“--update”标志也无法解决问题,因为它所做的只是跳过目标位置上较新的文件,而不会将这些更改下拉到源计算机。
scp 和 rsync 都存在的另一个问题是版本控制。一旦目标位置上的文件被覆盖,就无法回到以前的状态。
为了使多台机器上的文件保持同步并保留更改历史记录,显而易见的选择是使用现有的众多版本控制系统之一。Git 和 Bazaar 是两个流行的选择。它们具有陡峭的学习曲线,但是一旦您克服了这一点,它们在许多情况下都会变得非常有用。大多数软件包存储库中都可以找到两者的软件包。在 Ubuntu 上,git 和 Bazaar 的软件包分别称为 git-core 和 bzr。
要使用其中之一来使多台计算机上的文件保持同步,事件的顺序如下所示。在示例中,我使用 git,但是 Bazaar 类似。关于示例的最后一个注意事项是,计算机 1 的 IP 地址为 192.168.0.1,计算机 2 的 IP 地址为 192.168.0.2。
要开始在计算机 1 上使用 git
cd /home/me/Documents/shared git init git add * git commit -a
在上面的命令中,我切换到要置于版本控制之下的目录,并使用“git init”命令将该目录转换为 git 存储库。然后,我使用“git add *”将目录中的所有内容添加到新存储库。最后,我检入所有内容。现在在计算机 2 上,我执行以下操作
cd /home/me/Documents git clone ssh://192.168.0.1/home/me/Documents/shared
共享目录将从计算机 1 克隆到计算机 2。我现在可以在计算机 2 上编辑任何我想要的内容。完成后,我在计算机 2 上提交更改,如下所示
git commit -a
现在,当我回到计算机 1 时,我可以拉取我在计算机 2 上所做的更改,如下所示
cd /home/me/Documents/shared git pull ssh://192.168.0.2/home/me/Documents/shared
现在,计算机 1 和计算机 2 再次同步。万一计算机 1 和计算机 2 上都编辑了相同的文件,git 会让我知道存在合并冲突。这些冲突通常很容易解决,并且不会丢失任何内容,因为保留了所有更改的历史记录,我可以随时恢复到任何以前的版本。
正如您可能已经注意到的,糟糕的是,该过程是劳动密集型和内存密集型的。我说内存密集型是因为我需要记住在进行更改后进行提交,然后在我在另一台计算机上时,我需要记住从我所在的计算机上拉取更改。在上面的示例中,这不是一个大问题,因为只有两台计算机,但是对于我经常使用的所有计算机,记住我去过哪里确实是一个问题。我可以每次坐在其中一台电脑前都从其他每台电脑上拉取,但这很乏味,并且会中断我的工作流程。我真正想要的是同步在后台发生。
我应该提到另一种使用 git 或 Bazaar 管理文档的方法:使用一个存储库,然后将其 rsync 到不同的计算机。rsync 的好处仍然适用,并且由于 git 或 Bazaar,您可以获得版本控制。但是,每种方法的缺点仍然存在,包括 rsync 假定源是正确版本并且可以覆盖目标的这个问题。通过添加版本控制,此方法比单独使用 rsync 有所改进,但改进不大。
Wua.la 是我考虑过的一种选择。它允许您与 Internet 上的其他人安全地交易存储空间,并且通过内置的 nfs 服务器进行文件系统集成。我在这里写了关于 Wua.la 的文章:https://linuxjournal.cn/content/online-storage-wuala。即使当时我使用了 Wua.la 的 NFS 集成,我现在也没有这样做,因为我发现它太 Buggy 了。因此,虽然我将 Wua.la 用于备份,但它不是我信任的幕后同步工具,并且它不进行版本控制。
我想要的是一些简单、与我的文件管理器 (Nautilus) 集成并且在后台工作而无需我考虑的东西。它应该“开箱即用”。
有一个新的程序+服务,乍一看,它非常符合要求:Dropbox。
Dropbox 允许您在线存储文件,并在各种计算机之间保持同步。他们为 Windows、Macintosh 和 Linux 提供客户端,因此它是尽可能跨平台的。
在 Linux 上设置 Dropbox 涉及安装 Nautilus 的 nautilus-dropbox 插件和与 Dropbox 服务器通信的 dropboxd 守护程序。在 http://getdropbox.com 网站上提供了包含这两个程序的软件包,适用于 Fedora 9、Ubuntu 7.10 和 Ubuntu 8.04。该插件已获得 GPL 许可,因此如果您愿意,也可以手动下载并编译其源代码。源代码的依赖项包括 GTK 2.12 或更高版本、GLib 2.14 或更高版本、Nautilus 2.16 或更高版本、Libnotify 0.4.4 或更高版本以及 Wget 1.10 或更高版本。dropboxd 守护程序是闭源和专有的,不幸的是,因此如果您不在 x86 或 x86_64 平台上,则您运气不佳。
安装软件包后,要使 Dropbox 工作,您只需从终端窗口使用“killall nautilus”重新启动 Nautilus,或者您可以注销然后重新登录。
完成后,通知区域中将出现一个小图标,并且将出现配置向导。完成简单的注册过程(或连接到现有帐户)后,您的主目录中将出现一个“Dropbox”文件夹,并且会出现一个简短的教程。在 Dropbox 文件夹或子文件夹中右键单击时,还会出现 Dropbox 上下文菜单。
您放入或创建在 Dropbox 文件夹中的每个文件都会自动同步到您在 getdropbox.com 上的 Dropbox 帐户,并从那里同步到您运行 Dropbox 的每台其他计算机。此同步是自动的,并且在每次以任何方式保存、移动或更新文件时都会发生。
为了帮助您跟踪文件的状态,Dropbox 向 Nautilus 添加了几个徽章。徽章是您可以添加到其他图标的小图标,以指示文件的状态。Dropbox 会自动添加这些徽章,并在必要时更改它们。这使得一目了然地查看哪些文件已成功同步(带有复选标记的绿色圆圈)以及哪些文件正在同步过程中(带有箭头的蓝色圆圈)变得非常容易。通知区域图标也会动画显示以指示状态。
由于 Dropbox 是一项支持 Web 的技术,因此当然您的文件也有一个 Web 前端。当我在我不拥有的计算机上并且需要访问文档时,这非常方便。
Dropbox 做的另一件好事是版本控制。使用 Web 界面,您可以查看以前的版本并恢复到它们。
从表面上看,Dropbox 是我想要的一切。它可以使我正在处理的文件在我使用的所有计算机之间保持同步,它在后台执行此操作,并提供简单的版本控制,以防我想恢复到文件的先前版本。但是,Dropbox 并非没有问题。
一个问题是它不容忍文件名中的大小写更改。我的 Dropbox 目录中有一个名为“writing”的目录,由于某种原因,我想将其重命名为“Writing”。当我这样做时,Dropbox 变得疯狂,并开始创建新目录以尝试解决冲突。这些新目录不断激增,以至于我不得不停止 Dropbox 并删除所有目录,并将“Writing”目录重命名为“My Writing”。
另一个问题是,当我编辑文件时,我倾向于经常保存,有时我的文本编辑器会在我尝试保存时报告“文件已被修改”,因为我上次保存后。我不知道 Dropbox 做了什么,但是它显然做了一些事情,让我的编辑器认为文件在其控制之外以某种方式被更改了。据我所知,我没有丢失任何工作,但是这样的消息让我担心。
除了程序错误之外,我对 Dropbox 的最大问题是它不是完全开源的。nautilus 插件是,但是如果没有幕后服务,该插件是无用的。由于 dropboxd 服务守护程序不是开源的,如果 Evenflow(Dropbox 背后的公司)倒闭了怎么办?我不知道他们的财务状况如何,但是在今天的经济气候下,一切皆有可能。此外,这是我的数据,虽然他们说它是加密和受保护的,但我并不信任他们(或任何人)。有太多关于据称私密和安全的数据“丢失”或被彻底盗窃的恐怖故事。
我想我真正想做的是在我完全控制的硬件上使用我信任的加密来运行我自己的类似 Dropbox 的服务器。
因此,虽然 Dropbox 是一个非常实用的程序,但个人控制和信任问题几乎排除了它们用于同步我在各种计算机上使用的重要文件。相反,我将其用于项目文件,其中便利性超过了完全安全和控制的损失。
对于那些我不信任 Dropbox 的文件,我混合使用其他方法,具体取决于文件以及我对丢失文件的偏执程度以及我是否想要版本控制。最棒的是,有很多选择可以确保我在需要时和需要的地方拥有我想要的文件。