repodata 数据库介绍
createrepo 使用
createrepo 程序分析
出错
"Error Stat'ing file"
参考

repodata 数据库介绍

repodata 数据库中的文件主要是 XML 格式,精确描述一个 rpm 包的详细信息, 如依赖关系,包含文件,校验码信息。目前,这个格式被 apt-rpm,smartpm,red carpet 和 yum 支持。

通常有以下几个文件:

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了,有空再看看。

参考

  1. createrepo 主页