标签式文件系统,构想与实现
Table of Contents
文档管理的囧境
做研究工作,需要查阅的资料通常很多:论文、电子手册、图书、设计图纸、程序源代码、数据、图表,等等。比如我的硬盘中有近百 GiB 的这类资料,这其中还不包括实验的原始数据(因为有些实验光原始数据都是数百 GiB 的量级)。当资料越来越多时,许多人会自动按项目或者属性来整理文件。通常我的项目资料会存放在用户主目录的 Projects
目录下,按项目名称建立子目录,在其中存放与该项目相关的文献、程序、数据、会议报告、通知、上报材料等等。看起来,我的资料已经很整洁了。但往往有这样的情况:有时某个 A
项目的参考文献需要与项目 B 共享,而某些文档又会同时被多个项目用到。当文献的重复很多时,按项目的方式来整理文档又不如按文献来得方便,只要标明哪些文献属于哪个项目即可。但打开某个项目目录时,又希望与之相关的所有内容都在其内。长期积累下来的文献、数据、程序等,使得资料显得很杂乱。
有什么比较优雅的方式来管理这些资料呢?至少满足我如下的需求:
- 无重复文件,即资料的重复利用率高
- 资料可按多种方式组织而无遗漏,比如按项目、按关键字、按属性(文档、数据、图片、设计图等)
- 即时发现被遗忘的文献(比如研究 A 项目时下载的文献当时没来得及读,过很久了又重新下载后才发现机器中已经有了)
- 资料的版本控制功能(比如类似 VAX VMS 系统上的版本式文件系统 Files-11 那样)
这个问题想了很久,结合一些网站(如标签式书签管理网站 Delicious)的设计,觉得如果在常规存储的资料属性上增加一个额外的标签属性,即可实现我上述的需求,或许对缓解文档管理的囧境有助。
其实,一些音乐或图书管理软件已经很好地实现了这样的标签管理功能,如 iTunes, Amarok, rhythmbox, Calibre 等。另外一些新开发的文献管理软件也可部分满足需求,如 Mendeley Desktop, Zotero, Docear 等,但这些软件尚不能将数据、专门程序、额外资料等包含在内,它们只是针对专门的文档来进行资料管理的。我希望资料的标签式管理可以与常规的文件管理器结合起来,无论是 GUI 还是 CLI, 都可以很方便地处理。
标签式文件系统的概念
我最早是从 Ubuntu 社区头脑风暴的 一个主意 中了解到了“标签式文件系统” (Tag Filesystem, 如下简写为 TagFS) 的概念。更详细的概念来自于 Adrian Sampson 的文章 Design for a Tag-Structured Filesystem.
“标签”,有时也叫“关键字”,可以是任意的字符串,用来组织一组对象。“加标签” (tagging) 通常是一种与“层次结构”(hierarchical system) 不同的组织方式。在层次结构文件系统中,文件只能位于一个特定的目录下。如果在其它目录下需要引用此文件,通常需要特别的操作,如 Unix 系统上的硬或软链接,在 NTFS 上的目录 Junction 等。而在标签式文件系统中,对象可以附加任意数量的标签;然后可用特定的标签来寻找所有带此标签的对象。在更复杂的系统中,可以将标签的集合运算结果作为查询对象的标准。(实际上,一些 Google 搜索技巧 也就是标签运算的技巧。)
在 FreeShell.org 上有一篇关于 TagFS 比较直观的简介: TagFS. 为了给出 TagFS 的直观概念,特举一个例子。
在 TagFS 上存储/管理文件时,一个文件可以加上任意的标签。比如我从 GLDT 下载了一张
Linux 操作系统随时间的演化图 gldt1210.png
. 假如我在一个 TagFS 上存储这张图片,我可以加上如下的标签: Linux
, OS
, GLDT
, 2012
, 演示
, 报告
, pics
,
Hobby
, 等等。如果要在 LFS 项目中引用这张图片,则又可以加上标签 LFS
.
如果在层次结构文件系统下,我可以把图片放置在目录 OS/Linux/2012/pics/
下:
$ mkdir -p OS/Linux/pics/2012/ $ mv gldt1210.png OS/Linux/pics/2012/
假如我现在在 TagFS 下,我可以这样加标签:
$ tagit gldt1210.png OS Linux pics 2012 Hobby svg LFS
然后这样访问:
$ cd OS/Linux/pics/2012/ [OS Linux pics 2012] $ ls gldt1210.png
其中命令 cd
后面的参数 OS/Linux/pics/2012/
可以是任意顺序,如
2012/Linux/pics/OS/
, 或者是 Linux/2012/pics/OS
, 因为标签之间是等价的,无等级关系。提示符 $
前则是当前要访问的标签。
在检索文件时,则可以按 OS/Linux/2012/png/
这样的组合方式很快找到这张图片。
这样,项目资料的组织,不过是把一组文件加上同样的标签罢了。
标签式文件系统的现状
标签式文件系统的实现目前有三种方式:
- 第一类 TagFS: 与 Fat32, NTFS, Ext3, ZFS 等实用文件系统相等价的文件系统。不过,通常在 TagFS 上,目录即标签。
- TagFS 模拟器: 实际文件保存在现有的文件系统上,用户通过一层标签式接口来访问这些文件。这个思路与 iTunes, Calibre, Mendeley Desktop 的实现类似。这种 TagFS
就是一个用户界面,用户通过相应的文件属性数据库 (如 Calibre 的
metadata.db
) 访问这些文件。 - TagFS 仿真系统: 以“用户空间文件系统”为后端实现仿真,用户体验上同第一类
TagFS.
“用户空间文件系统” (Filesystem in Userspace, 简称 FUSE) 是操作系统中的概念,指完全在用户态实现文件系统。 FUSE 在 Linux 内核中提供支持,在其它系统上也有相应的实现,如 FreeBSD, Mac OS X 以及 Windows.
第一类 TagFS
第一类 TagFS 在业界也称为“数据库文件系统” (Database File systems), 实际上将“标签”等同于“富属性元数据” (注:英文为 rich metadata, 不知道这样翻译是否可以) 即可。这样的文件系统有:
- IBM DB2 for i
- 似乎已经死掉的微软的 WinFS (Windows Future Storage)
- Linux 下的 DBFS (该项目似乎死掉了,最后可下载的文件是 2004 年的 0.302 版本,而 CVS 中最后的代码提交是 3 年前)
- 非常大型的文件系统,如 Apache Hadoop, Google File System 等,也使用了类似的概念。另外,许多网页内容管理系统 (Web-CMS) 使用关系型 DBMS 来存储和提取文件 (比如 XML, 图片等) 也使用了这样的概念。
与 Database FS 类似的,还有“语义文件系统” (Semantic File System), “逻辑文件系统” (Logic File System) 等概念,不妨把这些看作是广义的“标签式文件系统”。
第一类 TagFS 存在的问题是与现有操作系统的集成上。可以在层次文件系统上集成标签或语义的功能,也可在 TagFS 上模拟一下层次结构的文件系统。不过,这个比较复杂,目前对普通用户而言尚无可用的实现。原本 ReiserFS 未来计划中是有类似内容的,只是其创始人 Hans Reiser 因杀妻罪名成立,相关的开发停滞了。喜欢尝鲜的人倒可以在 Linux 下试一下 DBFS, 或者研究一下 Hadoop 等。
TagFS 模拟器,或基于 Tag 的文件管理系统
Oyepa
Oyepa 是用 Python 开发的一款基于标签的文件管理接口,其源代码目前托管在 BitBucket 上。它依赖于 Qt4, PyQt4, 一些额外特性需要 Linux 内核中的 inotify 和 pyinotify.
KDE 语义桌面 Nepomuk
KDE 下的 Nepomuk 也提供手动添加标签的功能,可以进行标签式搜索等,从这个意义上来说,它也算是一个标签式管理器。不过,我的使用体验不算很佳,系统响应很慢,有些限入假死的状态。
Tag2Find
tag2find 是一款 Windows 下的桌面标签系统。其开发似乎陷入停滞,最新可下载的是 2007 年的 0.10.2.5 版本。
Mac OS X Spotlight
Apple Mac OS X 下的 Finder 也可以对文件添加标签,然后通过 Spotlight 检索文件。不过,它提供的标签功能很弱,与第一类 TagFS 中所提及的概念无法相比。
小结
目前 TagFS 模拟器还没有真正顺手的。上述的软件是部分功能可用,但毕竟不算是真正意义上的 TagFS.
TagFS 仿真系统
Tagsistant
Tagsistant 的口号是: Linux 下的语义文件系统 (semantic filesystem for Linux). 它通过 FUSE 实现了对 TagFS 的仿真,用它管理的用户态文件系统实现了目录即标签的功能。参见第一节中有关 TagFS 的概念介绍。Tagsistant 仍在持续开发中,目前版本是 0.6. 它托管在 GNA 的 Subversion 上。
XTagFS
XTagFS 是 Mac OS X 下的一个 FUSE 文件系统,它使用 "Spotlight Comment" 标签来组织文件与目录。标签在 XTagFS 下是目录,而文件则是目录下的链接。它依赖于 MacFUSE, 使用 Python 开发。目前似乎已经停止,SVN 中最后一次代码提交是 2009 年九月。
TagFS (py)
由 Markus Pielmeier 使用 Python 开发的 tagfs (py) 托管在 GitHub 上。这是一个目前相对活跃的项目。
TagFS (D)
在 Google Codes 上还有一个使用 D 语言 开发的 tagfs (D) (为区别于前一个,我加上了括号内的名称),其作者是前面提到的在 FreeShell.org 上的 Jesse Phillips. 这个项目目前处于停滞状态,最后一次代码提交是在七年前。
小结
目前可用的 TagFS 仿真只有 Tagsistant 与 TagFS (py) 还可以。
应用前景及结语
我希望将来打开计算机时可以这样工作:
- 自动选择当前活动——事务安排、娱乐、通讯或工作
- 下载或接收到的工作资料随便一扔时,系统自动提示加上相应的标签
- 开始工作时,根据工作任务,加上几个关键字,相应的文档、图片或程序自动展示在面前,很方便从以前中断的任务继续下去
- 系统内的资料按照标签体系自动整理好,未整理的文件会接收到提醒
- 任何处理的文件会自动保存多个版本 (类似于 VAX VMS Files-11)
- 等等
要实现类似这样的工作愿景,底层的管理软件仍然有许多要做的事情。
无论是 WinFS 式的标签(语义)文件系统,还是 Tagsistant 式的仿真系统,还是类似于 Nepomuk 的模拟器,仍然没有一个完全实用的标签式的资料管理体系。我希望这样的局面在不久的将来能够被打破,出现许多专门用于资料管理的类似于 iTunes 那样的软件。对于用户而言,不管底层是语义式的文件系统,还是模拟的数据库,实用即可。