目录
需求的提出
开源软件开发和嵌入式软件开发会经常需要使用Linux内核源码。你是否经常会从The Linux Kernel Archives 上下载源码,时间久了,不同版本的源码在本地堆得到处都是,是不是很烦?并且由于大天朝局域网接近断流的出国带宽,经常需要使用内核源码时拽不下来急死人有没有?这个时候总是会想能不能在本地做一个内核镜像,利用空闲时候的带宽同步内核代码,需要时直接从本地checkout需要的版本,方便多了。所幸这个需求并不小众,git的威力就在于它是一个分布式的版本管理系统,所以做个镜像是很轻松的事。
但是。。。
这里有两个问题,内核的git仓库是个“集群”,这意味着:
- 几个内核仓库之间可能存在引用关系(通过objects/info/alternates可以查看),例如,待会儿我选择进行同步的arm-soc.git和linux-stable.git就通过objects/info/alternates指向其他仓库。那么同步的时候实际上没有必要同步重复的objects造成带宽和存储空间的浪费。
- 当内核的git仓库“集群”中增加了新的仓库时,我们希望能够察觉到这个变化并自动镜像这些新添加的仓库。
以上这两条,也是Grokmirror的作者所指出的,为什么不用Linux的“计划任务”crond定时执行git pull去同步内核仓库的主要原因。更详细的解释戳这里。
什么是Grokmirror? grok|korg – grokmirror is mirror of korg :)
啰嗦这么多,那什么是Grokmirror呢?它是一个用Python开发的Linux内核源码仓库“集群”的同步工具,使用GitPython作为与Git的接口。Grokmirror使用一个manifest (清单)文件登记源码仓库“集群”中需要镜像的仓库,镜像仓库群(以下简称Mirror)根据用户配置定期地去poll被镜像仓库群(以下简称Master)的manifest文件,并对比本地manifest文件的记录数和各条记录的时间戳,如果Master有新加仓库记录,或者Master的manifest文件中有更新时间更迟的记录,那么Mirror就会自动更新本地的manifest,使其与Master保持同步,并且根据更新后的manifest,自动同步各个仓库。
工作流程
一图胜千言,下面来个时序图描述下大致的工作流程