repodata 数据库介绍
repodata 数据库中的文件主要是 XML 格式,精确描述一个 rpm 包的详细信息, 如依赖关系,包含文件,校验码信息。目前,这个格式被 apt-rpm,smartpm,red carpet 和 yum 支持。
通常有以下几个文件:
- repomd.xml (md 意思是 metadata)
repomd.xml 是描述其他 metadata 文件的文件。相当于其他文件的索引。包含 其他文件的时间戳和校验值(checksums)。这样客户端只要下载这一个文件 (通常很小,几KB),就可以知道其他文件中哪些有“更新”。这也意味只,只 要对这一个文件签名,就可以达到对其他文件签名的作用。
- primary.xml.[gz]
这个文件存储主要的 metadata 信息,这些信息包括:
- name, epoch, version, release, architecture
- file size, file location, description, summary, format, checksums header byte-ranges, etc.
- dependencies, provides, conflicts, obsoletes, suggests, recommends
- file lists for the package for CERTAIN files - specifically files matching: /etc*, bin/, /usr/lib/sendmail
- filelists.xml.[gz]
this file stores the complete file and directory listings for the packages. The package is identified by: name, epoch, version, release, architecture and package checksum id.
- other.xml.[gz]
this file currently only stores the changelog data from packages. However, this file could be used for any other additional metadata that could be useful for clients.
- groups.xml.[gz]
this file is tentatively described. The intention is for a common package-groups specification as well. There is still some sections for this format that need to be fleshed out.
createrepo 使用
createrepo 程序分析
出错
"Error Stat'ing file"
在 createrepo 较早版本(也是rhel5现在使用的版本)有可能出现下面错误:
[root@build moblin]# /usr/bin/createrepo -vd -o /data/moblin/tmpdir -i ./pkglist.test2 -u http://172.16.70.33/packages -g /data/moblin/TMS/comps.xml /data/koji/packages Error Stat'ing file /data/koji/packages Manual-Add-rpm/ooobasis3.1-en-US-3.1.0-9399.i586.rpm - Manual-Add-rpm/ooobasis3.1-en-US-3.1.0-9399.i586.rpm 2/10 - Manual-Add-rpm/ooobasis3.1-en-US-help-3.1.0-9399.i586.rpm Error Stat'ing file /data/koji/packages Manual-Add-rpm/ooobasis3.1-en-US-base-3.1.0-9399.i586.rpm - Manual-Add-rpm/ooobasis3.1-en-US-base-3.1.0-9399.i586.rpm 4/10 - Manual-Add-rpm/ooobasis3.1-en-US-impress-3.1.0-9399.i586.rpm Error Stat'ing file /data/koji/packages Manual-Add-rpm/ooobasis3.1-en-US-binfilter-3.1.0-9399.i586.rpm - Manual-Add-rpm/ooobasis3.1-en-US-binfilter-3.1.0-9399.i586.rpm 6/10 - Manual-Add-rpm/ooobasis3.1-en-US-math-3.1.0-9399.i586.rpm Error Stat'ing file /data/koji/packages Manual-Add-rpm/ooobasis3.1-en-US-calc-3.1.0-9399.i586.rpm - Manual-Add-rpm/ooobasis3.1-en-US-calc-3.1.0-9399.i586.rpm 8/10 - Manual-Add-rpm/ooobasis3.1-en-US-res-3.1.0-9399.i586.rpm
[root@build moblin]# createrepo --version 0.4.9
查看源码文件 /usr/share/createrepo/dumpMetadata.py 有:
240 class RpmMetaData:
241 """each rpm is one object, you pass it an rpm file
242 it opens the file, and pulls the information out in bite-sized chunks :)
243 """
244
245 mode_cache = {}
246
247 def __init__(self, ts, basedir, filename, options):
248 try:
249 stats = os.stat(os.path.join(basedir, filename))
250 self.size = stats[6]
251 self.mtime = stats[8]
252 del stats
253 except OSError, e:
254 raise MDError, "Error Stat'ing file %s %s" % (basedir, filename)
255 self.options = options
...
在 249 行仅仅是把 basedir 和 filename 链接起来,没有 strip 空格。这样, 如果我们指定的文件名有空格就会出错。一般情况都在命令行指定目录来操作, 这种错误不容易遇到,但是当我们指定一个文件中包含的文件名时,就可能出现 这中错误:
[root@build moblin]# /usr/bin/createrepo -vd -o /data/moblin/tmpdir -i ./pkglist.test2 -u http://172.16.70.33/packages -g /data/moblin/TMS/comps.xml /data/koji/packages
上例指定文件 ./pkglist.test2 , 这个文件内容如下:
Manual-Add-rpm/ooobasis3.1-en-US-3.1.0-9399.i586.rpm Manual-Add-rpm/ooobasis3.1-en-US-help-3.1.0-9399.i586.rpm Manual-Add-rpm/ooobasis3.1-en-US-base-3.1.0-9399.i586.rpm Manual-Add-rpm/ooobasis3.1-en-US-impress-3.1.0-9399.i586.rpm Manual-Add-rpm/ooobasis3.1-en-US-binfilter-3.1.0-9399.i586.rpm Manual-Add-rpm/ooobasis3.1-en-US-math-3.1.0-9399.i586.rpm Manual-Add-rpm/ooobasis3.1-en-US-calc-3.1.0-9399.i586.rpm Manual-Add-rpm/ooobasis3.1-en-US-res-3.1.0-9399.i586.rpm Manual-Add-rpm/ooobasis3.1-en-US-draw-3.1.0-9399.i586.rpm Manual-Add-rpm/ooobasis3.1-en-US-writer-3.1.0-9399.i586.rpm
如果上面行尾有多余空格,这个命令就会出错。新版本没有问题了。
[root@localhost ourimages]# createrepo --version createrepo 0.9.7
/usr/lib/python2.6/site-packages/createrepo/deltarpms.py 有下列内容
25 class DeltaRPMPackage:
26 """each drpm is one object, you pass it a drpm file
27 it opens the file, and pulls the information out in bite-sized chunks :)
28 """
29
30 mode_cache = {}
31
32 def __init__(self, po, basedir, filename):
33 try:
34 stats = os.stat(os.path.join(basedir, filename))
35 self.size = stats[6]
36 self.mtime = stats[8]
37 del stats
38 except OSError, e:
39 raise MDError, "Error Stat'ing file %s%s" % (basedir, filename)
40 self.csum_type = 'sha256'
41
估计是之前就对 filename 做strip了,有空再看看。
