为什么不将Ubuntu One与家外的文件夹同步呢?

用了一段时间我才发现,使用Ubuntu One只能同步家目录中的文件夹。在其他文件夹中,虽然在首选项中有Ubuntu One选项,但实际操作是灰色的。 Ubuntu One FAQ对此非常明确:
“不,目前您只能选择同步家目录内的文件夹。”
但我真的很好奇为什么会这样,是否会改变,以及是否有其他方法绕过这个限制(除了将我的主目录设置为/)?
我个人在家目录中没有任何重要数据,只有程序配置文件。所有文档、图片和音乐都存放在一个名为/data的文件夹中,该文件夹实际上位于另一个分区上。这样做在重新安装Ubuntu时更加方便。

我不相信“你不想同步特殊分区”的说法。我认为这不是一个不同步家目录之外的东西的有效理由。有一些文件夹/目录是U1绝对不应该同步的。例如,在Linux上是/etc、/home、/boot;在Windows上是\windows、\program files。我正好也遇到了同样的情况。我在我的Windows笔记本电脑上,家目录和文档目录里什么都不保存。如果我保存了东西,那里面可能会有几个GB的内容。我更喜欢使用其他几个位置来保存文件。 - user38450
5个回答

至少在可预见的未来内(而且我可以预见未来几年),这不会改变。允许用户选择与Ubuntu One同步的任意文件夹,这些文件夹可能在多台不同的计算机之间进行同步,会引发大量的可用性问题,而实际上,这种情况并不常见。

我记得其中一个问题是,如果您尝试同步可移动设备的挂载点(很多人都尝试过这样做),当您移除设备时,同步守护程序将删除所有内容;为了使其正常工作,同步守护程序必须了解设备,检测其移除等等。这需要相当大的努力,并且有很多潜在的可用性问题。

另一个问题是,如果您尝试同步具有特殊权限、所有权或文件类型的文件夹:想象一下/etc/、/tmp/或/dev/等最糟糕的情况。或者任何您不拥有的文件夹。我们可以简单地禁止同步您不拥有的文件夹,但事实上,我们知道有些人正在以root身份运行同步守护程序(尽管我们已经警告过他们)。

一个解决方法是通过挂载(通过/etc/fstab文件,这样你可以合理地确保每次都会挂载分区,否则可能会丢失同步的数据)将/data文件夹挂载到你的主目录下。你可以简单地将/data移动到~/data,或者如果有一些已经硬编码了/data路径的东西(很可能),或者如果你自己已经习惯了使用/data(也很可能),可以创建符号链接或绑定挂载将/data挂载到你主目录下的挂载点。如果你不想在主目录中看到它,只需将其命名为~/.data。

我认为这个使用案例现在并不常见,因为没有一个好用的界面可以同步任意文件夹。我同意这不是一项容易的任务,但一旦工程和可用性问题得到解决,并且有一个漂亮直观的界面可用,我相信很多人会使用它,因为很多人都有多台电脑。 - Aras
SpiderOak、Wuala和Bitcasa都支持在Linux上同步外部驱动器,因此这个问题并不是无法克服的。您提到syncdaemon会在移除驱动器时删除所有内容 - 难道你们不是syncdaemon作者吗?难道你们不能编写程序让它不要在外部驱动器上执行这个操作吗? - BlueRaja - Danny Pflughoeft
当然可以。我们还没有这样做。 - Chipaca
在具有管理员权限的Windows系统上,禁止更改此设置只是不明智的做法。公司和合理的家庭设置通常将系统驱动器与数据驱动器分开。 例如,我从不将任何东西保存在c:\users\<myusername>中,而是将所有个人和其他数据保存在独立分区的独立硬盘上。但是在Windows中,挂载和链接并不像在Linux中那样容易,在所有版本中都不是这样,因此不能简单地将这些驱动器或文件夹挂载或链接到用户文件夹中。我觉得不允许更改此位置完全是荒谬的。即使Dropbox也允许这样做。 - n611x007
1@naxa的高级用户可以将其主目录的位置更改为另一个驱动器(如果您实际上已经将所有个人数据保存在那里),因此这一点并不重要。 - Chipaca
@Chipaca,你说得对。然而,在公司环境中,你并不总是想要分离用户文件夹,但仍然需要分离其他工作数据。此外,我将实际的主文件夹保留在系统驱动器上,因为它是一个固态硬盘,这有助于处理大量配置文件,但将包含人工处理数据的文档、下载等文件夹移动到另一个驱动器上。(我也喜欢将机器处理和人工处理的数据分开。)同时,我还为上一条评论中的糟糕风格向你道歉。在Windows中,没有类似于/dev的文件夹,如果用户想要共享权限,则可以设置相应的权限。 - n611x007
这是关于此功能的错误愿望清单错误的链接: https://bugs.launchpad.net/ubuntuone-client/+bug/854143 - elopio

我通过使用绑定挂载成功让它工作了。在/etc/fstab文件中的那一行看起来是这样的:
/mnt/s1/Audio   /home/daniel/Music      bind    defaults,bind   0       0

显然,您需要对所讨论的文件夹拥有写入权限。可能还需要拥有这些文件的所有权,我不确定。

我怀疑原因是权限。你会注意到,你也不能轻易地编辑家目录之外的任何文件,这是Linux的一个通用安全特性,我认为Ubuntu One的开发人员(完全正确地)认为普通用户会将所有文件保存在家目录中,守护进程可以在没有提升权限的情况下轻松运行。
顺便说一下你的配置,这完全是个人喜好的问题,但我将我的完整/home/保存在一个单独的磁盘/分区上。这意味着在重新安装之间,你需要删除所有隐藏的文件夹/文件以进行清洁安装,但这将给你带来完全本机的家目录,具有Ubuntu One的权限等等 - 只是一个想法。

2哦,我刚刚尝试了一种比较明显的解决办法(符号链接),但Ubuntu One并不支持。 - thomasmichaelwallace

简单来说就是:使用Dropbox。
虽然@Chipaca列举的原因可能难以克服,但Dropbox已经设法解决了这些困难。确实,这个解决方案并不是开源的,但在Ubuntu One解决一些重大的可用性问题之前(其中之一就是此问题),许多用户将无法使用Ubuntu One。

我在Ubuntu 12.04下有一个非常类似的设置。我有一个NTFS分区,上面有我的音乐库,可以在Windows 7和Ubuntu中都看到。我想要能够将这个目录同步到Ubuntu One,而不必显式地将整个目录移动到我的主目录(这似乎是一个合理的要求,对吧?)。
我的解决方案很简单,就是每次启动Ubuntu时,在我的主目录中挂载共享分区。这只需要两个相当简单的步骤。
安装并使用`pysdm`确保分区在启动时正确挂载(不一定在您的主目录中,只需在文件系统的某个地方)。另外,如果你有足够的信心,也可以自己修改`/etc/fstab`文件。作为一个相对新的用户,我觉得使用`pysdm`更直接简单。
无论哪种方式,确保在执行此步骤之前备份好您的`/etc/fstab`文件!以防万一!
例如: ``` sudo cp /etc/fstab /etc/fstab.old ```
如果出现问题,您可以随时恢复旧文件,回到原点: ``` sudo cp /etc/fstab.old /etc/fstab ```
在`pysdm`的图形界面中,选择目标分区,点击“助手”按钮。确保选中“设备的拥有者可以挂载它”的选项。这将确保您可以在您的主目录中使用Upstart重新挂载。在我的情况下,我设置了`sda4`分区在`/media/sda4/`挂载。
总的来说,Upstart的行为由`/etc/init/`目录中的文件定义。为了在我的主目录中挂载新分区(对我而言是`/media/sda4`),我定义了一个`/etc/init/mount-mydirs.conf`文件,其内容如下:
```bash start on runlevel [2345] task exec /bin/mount-mydirs ```
第一行告诉Upstart在正常启动时执行这个任务。第二行告诉Upstart这个作业只执行一次(而不是一个无限期或重复的作业),最后一行告诉它以root权限执行脚本`/bin/mount-mydirs`。
脚本`/bin/mount-mydirs`的内容如下:
```bash mount --bind /media/sda4/ / ```
(`--bind`选项允许从原始挂载点和新挂载点访问文件)。
我在写这篇文章的时候,正在听着我完全同步、新装的音乐库!