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仓库中一些问题(包缺失,依赖缺失,不正确的版本等等)或者你对你的操作系统中一些重要部分的工作方式感兴趣,这都非常有用。

<think> 首先,用户的问题是:“我想查找自建yum仓库的相关内容,如方法、步骤、教程等 请问自建yum仓库的方法和教程”。用户提供了几个引用,我需要参考它们。 引用内容回顾: - [^1]:讨论了yum仓库的概述、安装原理、配置文件、命令和搭建方式,包括自建yum仓库、http方式、ftp方式。 - [^2]:提到yum源概述、本地yum源备份、配置文件、网络yum源、缓存软件、自建yum仓库。还给出了阿里云镜像的链接。 - [^3]:描述了通过ISO镜像搭建本地yum仓库的例子。 系统级指令: - 所有行内数学表达式用$...$,但这个问题不涉及数学,所以可能不需要。 - 独立公式用$$...$$,同样不适用。 - LaTeX语法正确:确保任何数学内容正确,但这里可能没有。 - 使用中文回答:整个回答必须用中文。 - 生成相关问题:在回答末尾添加相关问题。 - 引用的段落末尾自然地添加引用标识:比如[^1]。 用户指令: - 回答结构清晰,逐步解决问题,保证真实可靠。 - 参考站内引用:我需要基于用户提供的引用内容来回答,但引用不是用户真正的需求,而是上下文。用户的问题是查找自建yum仓库的方法和教程。 核心需求:用户想知道如何自建yum仓库,包括方法、步骤、教程。 从引用中提取相关信息: - [^1]:提到了搭建yum仓库的方式:自建yum仓库、以http方式、以ftp方式。具体步骤可能包括安装原理和配置文件设置。 - [^2]:提到了本地yum源备份、光盘配置、网络yum源、自建yum仓库。链接到阿里云镜像,但这可能是关于使用现有源,不是自建。 - [^3]:通过ISO镜像搭建本地yum仓库的例子,涉及合并多个ISO包。 综合引用,自建yum仓库的方式可能有: 1. 使用本地光盘或ISO镜像搭建本地仓库(如引用[^3])。 2. 通过网络方式,如HTTP或FTP(如引用[^1])。 3. 缓存软件包到本地并使用(如引用[^2]提到缓存软件)。 我需要构建一个结构清晰的回答,逐步解释方法和步骤。 回答结构: 1. **介绍**:简要解释自建yum仓库是什么和为什么需要。 2. **方法概述**:概述几种常见的方法(本地光盘/ISO、HTTP/FTP)。 3. **详细步骤**:为每种方法提供步骤。 - 基于引用,重点在本地ISO仓库(如[^3])和HTTP/FTP方式(如[^1])。 4. **教程参考**:如果有资源,提供链接(如引用[^2]的阿里云链接)。 5. **总结**:强调关键点。 6. **相关问题**:生成相关问题。 确保真实可靠:基于提供的引用内容,不要编造信息。引用来自用户提供的内容。 步骤细节: - **本地ISO仓库搭建**(来自[^3]): - 下载ISO镜像。 - 挂载ISO。 - 创建仓库元数据(使用createrepo命令)。 - 配置yum仓库指向本地目录。 - 示例:如果依赖包在多个ISO中,可能需要合并或软链接(如[^3]所述)。 - **HTTP 或 FTP 仓库搭建**(来自[^1]): - 安装必要的软件(如httpd或vsftpd)。 - 将软件包放在web或ftp目录。 - 创建仓库元数据(createrepo)。 - 配置yum客户端指向该URL。 配置文件设置(来自[^1]): - yum配置文件包括主配置文件(/etc/yum.conf)和仓库文件(/etc/yum.repos.d/*.repo)。 - 在仓库文件中指定baseurl或mirrorlist。 生成相关问题: - 类似于示例,生成2-3个相关问题。 - 例如: 1. 如何更新自建yum仓库的软件包? 2. 搭建HTTP yum仓库需要哪些工具? 3. 如何处理依赖关系在自建仓库中? 使用引用标识: - 在回答中,当引用特定信息时,在末尾添加[^1]、[^2]、[^3]。例如,提到合并ISO时引用[^3]。 完整回答: - 用中文。 - 逐步:先介绍,然后方法,然后步骤。 - 结束时生成相关问题。 </think> ### 自建 yum 仓库的方法和教程 自建 yum 仓库允许您在本地或私有网络中创建软件包源,用于快速安装和管理 RPM 软件包,尤其是在离线环境或需要自定义软件源时非常实用。基于您提供的引用内容([^1]、[^2]、[^3]),我将逐步解释自建 yum 仓库的常见方法、详细步骤和相关教程。方法主要包括三种:使用本地光盘/ISO 镜像、HTTP 方式和 FTP 方式。每种方法都基于标准 Linux 工具(如 `createrepo`),确保过程可靠。 #### 方法概述 自建 yum 仓库的核心是将 RPM 软件包组织到特定目录,并生成仓库元数据(metadata),然后配置客户端 yum 源指向该仓库。以下是三种主流方法: 1. **本地光盘/ISO 镜像仓库**:适用于离线环境,通过挂载物理光盘或 ISO 文件创建本地源(见引用[^3])。 2. **HTTP 方式仓库**:通过 Web 服务器(如 Apache HTTP)共享仓库,支持远程访问。 3. **FTP 方式仓库**:类似 HTTP,但使用 FTP 服务器(如 vsftpd),适用于内部网络(见引用[^1])。 所有方法都需要以下前提条件: - 操作系统:CentOS 或 Red Hat Enterprise Linux(RHEL)。 - 必备工具:安装 `createrepo` 包(用于生成元数据),命令示例:`sudo yum install createrepo`。 - 软件包源:从官方镜像(如阿里云镜像)下载 RPM 包,或使用系统自带光盘。 接下来,我将详细介绍每种方法的步骤,并提供完整教程示例。 #### 方法一:使用本地光盘/ISO 镜像搭建仓库 这种方法适合没有网络连接的环境。您可以使用物理光盘或下载的 ISO 文件(如 CentOS 安装镜像)。引用[^3]中提到,如果依赖包分布在多个 ISO 中(如 CD1 和 CD2),可以通过软链接合并目录来创建一个完整的仓库源。 **详细步骤:** 1. **准备 RPM 包目录**: - 挂载 ISO 文件到本地目录。例如,如果 ISO 文件在 `/path/to/centos.iso`: ```bash sudo mkdir -p /mnt/iso sudo mount -o loop /path/to/centos.iso /mnt/iso ``` 如果多个 ISO 文件需要合并(如 CD1 和 CD2),创建软链接整合包目录: ```bash sudo mkdir /repo # 创建仓库根目录 sudo ln -s /mnt/cd1/Packages /repo/Packages_cd1 # 软链接 CD1 包 sudo ln -s /mnt/cd2/Packages /repo/Packages_cd2 # 软链接 CD2 包 sudo cp -r /mnt/cd1/repodata /repo/ # 复制元数据 ``` 这确保所有包在一个目录下(引用[^3])。 2. **生成仓库元数据**: - 切换到仓库目录,使用 `createrepo` 生成元数据文件: ```bash cd /repo sudo createrepo . ``` 这会创建 `repodata` 文件夹,包含仓库索引。 3. **配置 yum 客户端**: - 在 `/etc/yum.repos.d/` 下创建仓库配置文件,如 `local.repo`: ```ini [local-repo] # 仓库名称 name=Local YUM Repository baseurl=file:///repo # 指向本地目录 enabled=1 # 启用仓库 gpgcheck=0 # 禁用 GPG 检查(测试时可关闭) ``` - 清理缓存并测试: ```bash sudo yum clean all sudo yum repolist # 应该显示 local-repo ``` 4. **测试安装软件**: - 例如,安装一个包验证: ```bash sudo yum install httpd # 如果仓库中有 httpd 包 ``` **教程参考**:引用[^3]提供了通过 ISO 搭建的实例。完整教程可参考 [CentOS 官方文档](https://wiki.centos.org/HowTos/CreateLocalRepos) 或阿里云镜像站的指南(引用[^2])。 #### 方法二:使用 HTTP 方式搭建仓库 这种方法允许通过 Web 服务器共享仓库,适用于多台机器访问。引用[^1]提到,HTTP 方式需要配置 Web 服务器(如 Apache)。 **详细步骤:** 1. **安装和配置 Web 服务器**: - 安装 Apache HTTP: ```bash sudo yum install httpd sudo systemctl start httpd sudo systemctl enable httpd ``` - 创建仓库目录并放入 RPM 包: ```bash sudo mkdir -p /var/www/html/yumrepo sudo cp /path/to/rpms/*.rpm /var/www/html/yumrepo/ # 复制软件包 ``` 2. **生成仓库元数据**: - 在仓库目录运行 `createrepo`: ```bash cd /var/www/html/yumrepo sudo createrepo . ``` 3. **配置 yum 客户端**: - 创建客户端配置文件 `/etc/yum.repos.d/http.repo`: ```ini [http-repo] name=HTTP YUM Repository baseurl=http://your-server-ip/yumrepo # 替换为服务器 IP enabled=1 gpgcheck=0 ``` - 测试连接: ```bash sudo yum clean all sudo yum repolist ``` **教程参考**:引用[^1]涵盖 HTTP 方式的原理。更多细节可查看 [Apache 官方指南](http://httpd.apache.org/docs/)。 #### 方法三:使用 FTP 方式搭建仓库 类似 HTTP,但适用于 FTP 协议(引用[^1])。适合内部网络环境。 **详细步骤:** 1. **安装和配置 FTP 服务器**: - 安装 vsftpd: ```bash sudo yum install vsftpd sudo systemctl start vsftpd sudo systemctl enable vsftpd ``` - 创建仓库目录: ```bash sudo mkdir -p /var/ftp/yumrepo sudo cp /path/to/rpms/*.rpm /var/ftp/yumrepo/ ``` 2. **生成仓库元数据**: - 运行 `createrepo`: ```bash cd /var/ftp/yumrepo sudo createrepo . ``` 3. **配置 yum 客户端**: - 编辑 `/etc/yum.repos.d/ftp.repo`: ```ini [ftp-repo] name=FTP YUM Repository baseurl=ftp://your-server-ip/yumrepo enabled=1 gpgcheck=0 ``` - 测试: ```bash sudo yum clean all sudo yum repolist ``` #### 通用注意事项 - **仓库维护**:定期更新 RPM 包后,重新运行 `createrepo --update .` 刷新元数据。 - **安全性**:生产环境中启用 GPG 检查(设置 `gpgcheck=1` 并导入 GPG 密钥)。 - **资源参考**:引用[^2]建议使用阿里云镜像作为源下载 RPM 包:[阿里云 CentOS 镜像站](https://developer.aliyun.com/mirror/centos)。自建仓库前,可备份本地源(引用[^1])。 通过以上步骤,您可以快速搭建自建 yum 仓库。如果在多个 ISO 合并时遇到依赖问题,采用软链接或目录整合解决(引用[^3])。确保配置文件语法正确(引用[^1]),避免常见错误如路径错误或权限不足。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值