ASlnks简介


               
               
               
               
               
               
               
               
               
               
               
               
               
  • 起源
    ASlinks这个东西最初源于我们公司的文件服务器的管理员的需求。由于我们的部门主要是做软件的测试工作,因此有一个很大的文件服务器,需要很多的应用、开发软件。并且很多软件都需要非常多的平台和版本,比如DB2就有5大平台,每个平台十多个版本,这样的文件服务器可想而知之非常混乱的,因此急需一种管理办法。
    基于BSD系统ports目录的启发,我提出了基于目录建立符号连接来分类的方案,之后寻找了一下网络上没发现能够实现此功能的软件,想了一下需求也不复杂,于是就决定自己做了。(但是做起来以后,新的想法越来越多,东西也就越来越复杂了


  • 工作原理
    这个东西的主要原理就是使用了*nix系统的“符号连接”,真是的源文件存放于一处位置,而在要共享出来的目录中,全部都是符号连接,这些连接按照应用分类存放于不同的子目录中,同时一个源可以有多个连接,这样就相当于多个分类了。总体来说类似于BSD系统的ports树。下面是一个简要图示
    目录树结构                                            Index数据库
    /share/windows/server/apache2_w32                    连接源                    所属分类(即目录)
          |              /apache2_w64      -------+
          |                                       |
          |                                       +-->   /store/a/ap/apache2_w64   windows.server,web.server.apache
          +/web/server/apache/apache2_w32         |
                             /apache2_w64  -------+
    apache2_w64这个文件(或者也可以是目录)实际位于/store/a/ap/apache2_w64。在一个Index数据库中,它具有两个分类:windows.server和web.server.apache。他们之间用逗号分割,当然可以具有更多分类。由于这个源所具有这2个分类,ASlinks的维护程序会在一个“家目录”(即/share)中建立出相应的2个符号连接。当然家目录中必须有windows/server和web/server/apache这两个目录,这是靠另外一个目录Index来维护的,两个数据库互相关联。
    这样文件服务器的管理员就会得到一个非常清晰的目录结构,并且他们跟物理储存位置隔离开来,每个文件可以在多个地方出现,便于用户分类寻找
       当然除了文件服务器,这个结构也可以在其他地方使用到,比如现在linux下的rpm包都把文件装在很多不同的目录中,当你希望对某一个包里的所有文件进行快速检索的时候,你也可以建立这样一个索引,比如 bind9/ 的目录里面就是所有 bind9.xx.rpm 里面的所有文件的连接(当然还可能包括你自己的bind配置文件)
    几个基本概念:
  • Tree
    Tree就是上图中左边的那棵树,就是一个用于共享的虚拟目录结构,其中的每个分支称为Leaf。Tree目前的储存方法是用点 . 来代替目录分隔符 /
    就如上图中,windows/server = windows.server
  • Link
    Link就是符号链接,Link包含Link源和Link目的
    由于链接源是唯一的,因此Link源本身也作为索引字段
    而Link目的是多个存在的,并且存在于上面的Tree结构中
    Link源是一个绝对路径;Link目的就是该文件/目录的名字,在程序里面用变量lastname表示
    link = /store/a/ap/apache2_w64
    lastname = apache2_w64
  • Linktree
    一个Link源对应多个Link目的,那么决定这些Link目的所存在于Tree中的具体哪些Leaf中的,是一个包含若干Leaf的列表。这个列表即表示Link源在Tree中的那些目录中有链接,同时也是一种分类的表示方法,即一个Link可以有多个分类。比如上图中的 windows.server,web.server.apache
  • DB
    存放Tree和Link以及其对应关系的物理实体。
    Tree DB中存放所有的Tree中的Leaf,包含各级父子目录,它只是一个简单的列表。
    windowswindows.serverwebweb.serverweb.server.apache......
    Link DB中存放Link源,以及所属的Linktree,这是一个字典结构的对照表:
    Linkname : linktree(leaf,leaf,leaf..)
    linktree的列表以一个逗号分割的字符串来表示
    当然,程序会强行检查linktree中的项目一定是要事先在Tree DB中存在的,否则将给予删除。用SQL语言表述的话,linktree中的每一项都是TreeDB的外键
    目前版本中这两个DB都用gdbm的方式实现
  • ASHOME
    ASHOME是存放Tree的父目录,就是上面图中的/share。依靠指定不同的ASHOME和2个DB,可以实现多个ASlink实例共存
    实现方法
    ASlink完全使用Python实现,主要分成两个部分:管理工具和维护脚本
    管理工具目前包含两个程序:mktree和mklink
    mktree用于管理TreeDB而mklink用于管理LinkDB,他们用于添加、修改和删除DB中的条目,同时他们会自动建立DB如果不存在的话。
    维护脚本目前包含两个程序:updatetree和updatelink
    顾名思义,就不用多解释了。updatetree脚本主要负责创建Tree中的每个leaf,删除不再有效的leaf,删除非link文件。updatelink脚本主要负责在Tree中创建所有的link目的,删除不再有效的和实效的链接。总之就是维护实际Tree中的东西跟DB同步,一般这两个脚本置于crontab中运行。