我执行
createrepo -v --update epel-dir/
在包号 14173 处,该过程失败,Python 堆栈跟踪抱怨:
headerRead failed: Header sanity check: OK
所以,我想好吧,我下载了一个错误的 RPM 文件:
mv epel/borked-1.2.3.x86_64.rpm Bad
将其移动到临时目录并重新运行后createrepo
:
createrepo -v --update epel-dir
下一个文件也会出现同样的错误。还有下一个,下一个……
所以,我想可能是存储库中的文件太多了(大约 23k - 这并没有让我印象深刻,但我从未构建过本地存储库)。我将大约一半的文件移动到另一个目录:
mkdir epel2
mv epel-dir/[n-z]* epel2
然后我createrepo
在 epel2 上运行,没有任何问题。所以,我想也许 repodata 缓存是坏的?
rm -rf epel-dir/repodata epel2/repodata
并在 epel-dir 和 epel2 上重新运行 createrepo —— epel2 上成功,有约 10k 个文件,但在 epel-dir 目录上的文件 7745 处失败,该目录有大约 12k 个文件。
然后,因为我想确保文件本身不是问题:
createrepo -v --update Bad/
在六个左右的文件上成功且没有任何错误。我不确定问题是什么,也不知道去哪里查找——我不知道 RHEL/rpm,所以任何帮助/建议都会很棒。
更新:
我试图在这里总结Python堆栈跟踪:
error: rpmts_HdrFromFdno: headerRead failed: Header sanity check: OK
Trace....
file dumpMetaData.py line 97 in returnHdr
hdr = hdrFromFdno(fdno)
SystemError: error return without exception set
答案1
因此,我将 22k 文件的范围缩小到一个专门用于堆栈转储的文件。
我可能可以更快地发现这一点,只是直到我只有一个单例文件时我才意识到——createrepo 在完成标头检查信息之前不会输出任何处理信息。由于失败了,错误上方列出的 rpm 文件不是失败的文件,而是之前的文件,失败的文件名从未输出。我只是注意到它,直到我(乏味地)将其缩小到单个文件,然后在堆栈跟踪之前没有看到文件信息输出。我会将其标记为错误!以及我的问题中的错误处理。
因此,问题文件是 libmicrohttp-doc-0.4.6-1.el5.x86_64.rpm。
我不确定它来自哪个镜子 - 它很旧,当时其他人正在拉回购;然而,与从以下版本下拉的版本相比,该版本失败了软呢帽有不同的 MD5 值...所以我的版本似乎有问题。我将结果标记为已回答,因为如果不修复 Python,我就无法学到任何其他东西。
感谢@Bratchley(根据我的评论,我将尝试获取堆栈跟踪)。