Chinaunix首页 | 论坛 | 博客
  • 博客访问: 761940
  • 博文数量: 131
  • 博客积分: 13237
  • 博客等级: 上将
  • 技术积分: 1347
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-07 15:40
个人简介

哥已经隐退,不问江湖之事

文章分类

全部博文(131)

文章存档

2015年(1)

2014年(3)

2013年(11)

2012年(12)

2011年(9)

2010年(27)

2009年(8)

2008年(14)

2007年(7)

2006年(39)

分类: Python/Ruby

2006-06-22 10:08:42

  • 起源
    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.serverweb.server.apache。他们之间用逗号分割,当然可以具有更多分类。由于这个源所具有这2个分类,ASlinks的维护程序会在一个“家目录”(即/share)中建立出相应的2个符号连接。当然家目录中必须有windows/serverweb/server/apache这两个目录,这是靠另外一个目录Index来维护的,两个数据库互相关联。
    这样文件服务器的管理员就会得到一个非常清晰的目录结构,并且他们跟物理储存位置隔离开来,每个文件可以在多个地方出现,便于用户分类寻找
       当然除了文件服务器,这个结构也可以在其他地方使用到,比如现在linux下的rpm包都把文件装在很多不同的目录中,当你希望对某一个包里的所有文件进行快速检索的时候,你也可以建立这样一个索引,比如 bind9/ 的目录里面就是所有 bind9.xx.rpm 里面的所有文件的连接(当然还可能包括你自己的bind配置文件)
    几个基本概念:
    1. Tree
      Tree就是上图中左边的那棵树,就是一个用于共享的虚拟目录结构,其中的每个分支称为Leaf。Tree目前的储存方法是用点 . 来代替目录分隔符 /
      就如上图中,
      windows/server = windows.server
    2. Link
      Link就是符号链接,Link包含Link源和Link目的
      由于链接源是唯一的,因此Link源本身也作为索引字段
      而Link目的是多个存在的,并且存在于上面的Tree结构中
      Link源是一个绝对路径;Link目的就是该文件/目录的名字,在程序里面用变量lastname表示
      link =
      /store/a/ap/apache2_w64
      lastname =
      apache2_w64
    3. Linktree
      一个Link源对应多个Link目的,那么决定这些Link目的所存在于Tree中的具体哪些Leaf中的,是一个包含若干Leaf的列表。这个列表即表示Link源在Tree中的那些目录中有链接,同时也是一种分类的表示方法,即一个Link可以有多个分类。比如上图中的
      windows.server,web.server.apache
    4. DB
      存放Tree和Link以及其对应关系的物理实体。
      Tree DB中存放所有的Tree中的Leaf,包含各级父子目录,它只是一个简单的列表。
      windows
      windows.server
      web
      web.server
      web.server.apache
      ......
      Link DB中存放Link源,以及所属的Linktree,这是一个字典结构的对照表:
       Linkname : linktree(leaf,leaf,leaf..)
      linktree的列表以一个逗号分割的字符串来表示
      当然,程序会强行检查linktree中的项目一定是要事先在Tree DB中存在的,否则将给予删除。用SQL语言表述的话,linktree中的每一项都是TreeDB的外键
      目前版本中这两个DB都用gdbm的方式实现
    5. 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中运行。
阅读(1888) | 评论(0) | 转发(0) |
0

上一篇:Sourceforge感触

下一篇:ASlinks0.1发布

给主人留下些什么吧!~~