序
本文是我进行翻译的,以下为翻译的文章,文章来源为:
https://blog.packagecloud.io/yum-repository-internals/
摘要
这篇文章通过针对yum仓库中的元数据(metadata<一些索引文件>)测试的方式,深入去了解下yum仓库的内部结构,我会介绍每个索引文件,并看下用户如何去检查元数据。
什么是yum仓库
yum仓库就是很多的rpm包和元数据的集合,元数据可以被yum命令行读取。有了yum仓库,你就可以让你针对一个安装包(package)或者一组安装包进行安装,卸载,升级和一些其他操作。yum仓库针对软件的存储,管理,交付来说都是必不可少的。
用createrepo创建yum仓库
在更进一步了解仓库的元数据之前,我们先来展示下如何用开源的命令行工具createrepo来设置一个仓库。你可以使用命令行工具createrepo创建yum仓库,createrepo通过运行一下命令在CentOS或者Red Hat上安装:
$ sudo yum install createrepo
createrepo最简单的用就是使用一个参数,这个参数就是yum仓库的输出目录。
假设你在当前目录有几个rpm包,你就可以运行这个命令生成一个yum仓库
$ createrepo .
这样就创建了一个名为’repodata’的文件夹,包含了下面我们会细讲的元数据文件。
译者注:列下译者本地生成仓库后的结构
$ tree . └── packages ├── kernel-5.16.12-100.fc34.x86_64.rpm └── kernel-core-5.16.12-100.fc34.x86_64.rpm $ createrepo . Directory walk started Directory walk done - 2 packages Temporary output repo path: ./.repodata/ Preparing sqlite DBs Pool started (with 5 workers) Pool finished $ tree . . ├── packages │ ├── kernel-5.16.12-100.fc34.x86_64.rpm │ └── kernel-core-5.16.12-100.fc34.x86_64.rpm └── repodata ├── 47e2ab97092b91278fbac5f8dce24ea45224cb64a7a25986bc5af70b52775878-primary.xml.gz ├── 59fd4217fb82d5b775dcb87a12cddfe886378471eedc8ac65237fe3f24724326-primary.sqlite.bz2 ├── 71d725cef5607f7e572716bf26703c8f34d2f4b42d269e7c0fa6fa9beb955404-filelists.xml.gz ├── 7223cc42ffbdc229f9c3f540d57662c8e88d8b3c0dcd989e394af344ef48ba2c-filelists.sqlite.bz2 ├── 75f75cca763ed7988c4307a71a9f309318866b77927df5baa77f374315182c8a-other.xml.gz ├── d68d8e69fc4f554a71086fc9ab9edde61b689b1704825d942c0b057486f1ca18-other.sqlite.bz2 └── repomd.xml
你可以使用GPG来签名仓库的元数据文件,能够对用户保证这些元数据是你生成的。GPG与使用rpm或者rpmsign不同
$ gpg --detach-sign --armor myrepo/repodata/repomd.xml
关于rpm包使用GPG和yum仓库可以在这里找到HOWTO: GPG sign and verify RPM packages and yum repositories。如果你希望其他人也访问你的yum仓库,就需要搭建Apache,nginx或者其他的web服务器,并指向仓库的基础目录。推荐你使用SSL证书以便于包的数据能够安全传输。
译者注:这里仓库的基础目录,就是在/etc/yum.repos.d/xxx.repo中的baseurl,也即yum仓库url的位置。在这里在基础目录下有repodata这个目录。
当然,使用packagecloud是一个更加快而且简单的方案。SSL,GPG,身份验证,合作及其他你需要的都准备好了。
yum仓库的元数据
yum仓库的元数据由一系列XML文件构成,包含了其他文件的校验(checksums)及所引用的包。
yum仓库中通常的元数据文件包括:
- repomd.xml:本质上是一个索引,包含了下边要将的其他xml元数据文件的位置,校验,时间戳等等。
- repomd.xml.asc:这个文件只有当使用GPG签署repomd.xml文件时才会生成,签署的例子上边有讲到
- primary.xml.gz:包括了在仓库中每个包的详细信息,可以看到诸如名称,版本,许可证,依赖性信息,时间戳,大小或者更多信息。
- filelists.xml.gz:包含了仓库中每个包中的各个文件或者文件夹相关信息
- other.xml.gz:包含了仓库中包的在rpm spec文件的修改记录(changelogs)
还有一些其他的文件,不过其他文件不被广泛使用,上边讲述的这些文件就足够了
译者注:实际上目前的yum仓库的元数据除了xml文件这种组织形式,还有sqlite.bz2的形式
通常情况下,仓库的元数据在yum仓库url的repodata的命名空间下,或者说是放在仓库服务器的repodata目录下。
组织yum仓库将相同架构的的包存储在一起是常见的作法,这样做使得你的仓库按照架构类型分段,能够减少提供给客户端及当更新时重新生成元数据的数量。
来自packagecloud一组典型的x86_64和i386架构下的repomd.xml文件的url:
- https://packagecloud.io/computology/packagecloud-cookbook-test-public/el/7/i386/repodata/repomd.xml
- https://packagecloud.io/computology/packagecloud-cookbook-test-public/el/7/x86_64/repodata/repomd.xml
大多数可公开访问的yum仓库都基本上是类似的方案,比如说官方的Centos7 repomd.xml文件:
- http://mirror.centos.org/centos/7/os/i386/repodata/repomd.xml
- http://mirror.centos.org/centos/7/os/x86_64/repodata/repomd.xml
译者注:这里Centos7的文件可能不能访问了,可以直接使用Centos8-stream
http://mirror.centos.org/centos/8-stream/BaseOS/aarch64/os/repodata/repomd.xml
http://mirror.centos.org/centos/8-stream/BaseOS/x86_64/os/repodata/repomd.xml
检查及验证yum仓库元数据
你可以使用一系列命令行工具来检查(examine )yum仓库的元数据,计算校验(checksums)以及核实GPG的签名
我们使用CentOS7仓库位于:https://packagecloud.io/computology/packagecloud-cookbook-test-public/el/7.
首先从检查repomd.xml文件
用curl来检验repomd.xml文件。其他的索引文件及他们的校验都可以在这个路径的文件找到:
$ curl -Ls https://packagecloud.io/computology/packagecloud-cookbook-test-public/el/7/x86_64/repodata/repomd.xml
(TIP: 如果你想要看的更细致或者要debug,使用curl的-Lv(list only and verbose )参数试试)
核实repomd.xml的GPG签名
yum会自动去验证仓库的GPG签名(如果yum的配置中repo_gpgcheck置为1,更多用法可以查看这里),不过你也可以收取去验证这个签名。
如果这个仓库被GPG签名并且你也导入了这个GPG共有key,你就可以通过下载下来的repomd.xml文件和repomd.xml.asc来验证了,使用gpg --verify指令:
$ curl -Ls https://packagecloud.io/computology/packagecloud-cookbook-test-public/el/7/x86_64/repodata/repomd.xml > repomd.xml
$ curl -Ls https://packagecloud.io/computology/packagecloud-cookbook-test-public/el/7/x86_64/repodata/repomd.xml.asc > repomd.xml.asc
$ gpg --verify repomd.xml.asc repomd.xml
gpg: Signature made Sun Oct 12 11:07:54 2014 PDT using RSA key ID 7AD95B3F
gpg: Good signature from "packagecloud ops (production key)
<ops@packagecloud.io>"
检查primary.xml.gz元数据
然后,我们来检查primary.xml.gz元数据。正如上边所说的,这个文件包含的是仓库中每个包的信息
repomd.xml中提到了这个文件的位置:
<data type="primary">
<location href="repodata/primary.xml.gz"/>
<checksum type="sha">6eb7ecc041f69a5ffeabdebcb466c443aa5e8028</checksum>
<timestamp>1413137274</timestamp>
<open-checksum type="sha">0b08c81e46081059cbe56d2f0871017ef8073d93</open-checksum>
</data>
注:这个位置不是那么简单,因为有的仓库primary.xml.gz文件的URL会包含文件的的SHA和MD5总和。*
这个位置是相对于仓库的基础目录来说的。*
我们先来检查下SHA校验值(checksum)是否和repomd.xml所写的一致,repomd.xml所写的checksum就是这个文件SHA校验值。open-checksum表示的是这个文件被解压后的SHA校验值。
$ curl -Ls https://packagecloud.io/computology/packagecloud-cookbook-test-public/el/7/x86_64/repodata/primary.xml.gz | shasuma
6eb7ecc041f69a5ffeabdebcb466c443aa5e8028 -
好消息,这个校验值是匹配的,我们使用zless查看解压后的文件,并逐页浏览:
$ curl -Ls https://packagecloud.io/computology/packagecloud-cookbook-test-public/el/7/x86_64/repodata/primary.xml.gz | zless
primary.xml.gz文件中简单示例:
<package type="rpm">
<name>jake</name>
<arch>x86_64</arch>
<version epoch="87" rel="3.el6" ver="1.0"/>
<checksum pkgid="YES" type="sha">ea721867eb0389e28bcd32e2deef7d4472c6ced8</checksum>
<summary>jake douglas is a very nice young man.</summary>
<description>as it so happens, jake douglas is a very nice young man.</description>
<packager></packager>
<url>https://twitter.com/jakedouglas</url>
<time build="1401650103" file="1413137269"/>
<size archive="4536" installed="4280" package="3740"/>
<location href="jake-1.0-3.el6.x86_64.rpm"/>
<format>
<rpm:license>GPL</rpm:license>
filelists.xml.gz 和 other.xml.gz
对这两个文件重复上边对primary.xml.gz文件的操作:
- 从repomd.xml中获取元数据文件的位置及校验值(checksum)
- 使用
curl -Ls <url> | shasum
来验证文件校验值是否匹配 - 使用
curl -Ls <url> | zless
来检查这个文件
总结
yum仓库元数据是由一系列的xml文件,校验值以及某些情况下的GPG签名组成,元数据描述了哪一个包在仓库里,每个包大量的属性,文件及目录,以及修改记录(changelog)信息
yum仓库元数据可以通过手动去检查及验证,使用了一些命令行工具curl, less/zless, gpg及shasum
。如果你想要debug你的yum仓库中一些问题(包缺失,依赖缺失,不正确的版本等等)或者你对你的操作系统中一些重要部分的工作方式感兴趣,这都非常有用。