yum 仓库内部结构

本文是我进行翻译的,以下为翻译的文章,文章来源为:
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文件的操作:

  1. 从repomd.xml中获取元数据文件的位置及校验值(checksum)
  2. 使用curl -Ls <url> | shasum来验证文件校验值是否匹配
  3. 使用curl -Ls <url> | zless来检查这个文件

总结

yum仓库元数据是由一系列的xml文件,校验值以及某些情况下的GPG签名组成,元数据描述了哪一个包在仓库里,每个包大量的属性,文件及目录,以及修改记录(changelog)信息

yum仓库元数据可以通过手动去检查及验证,使用了一些命令行工具curl, less/zless, gpg及shasum。如果你想要debug你的yum仓库中一些问题(包缺失,依赖缺失,不正确的版本等等)或者你对你的操作系统中一些重要部分的工作方式感兴趣,这都非常有用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值