跳转到主要内容

命令:repo

如何使用 pig repo 子命令管理软件仓库?

pig repo 命令是一个综合性的软件包仓库管理工具。它提供了添加、移除、创建和管理软件仓库的功能,支持 RPM 系统(RHEL/CentOS/Rocky/Alma)和 Debian 系统(Debian/Ubuntu)。

pig repo - Manage Linux APT/YUM Repo

  pig repo list                    # available repo list             (info)
  pig repo info   [repo|module...] # show repo info                  (info)
  pig repo status                  # show current repo status        (info)
  pig repo add    [repo|module...] # add repo and modules            (root)
  pig repo rm     [repo|module...] # remove repo & modules           (root)
  pig repo update                  # update repo pkg cache           (root)
  pig repo create                  # create repo on current system   (root)
  pig repo boot                    # boot repo from offline package  (root)
  pig repo cache                   # cache repo as offline package   (root)

Examples:
  pig repo add -ru                 # add all repo and update cache (brute but effective)
  pig repo add pigsty -u           # gentle version, only add pigsty repo and update cache
  pig repo add node pgdg pigsty    # essential repo to install postgres packages
  pig repo add all                 # all = node + pgdg + pigsty
  pig repo add all extra           # extra module has non-free and some 3rd repo for certain extensions
  pig repo update                  # update repo cache
  pig repo create                  # update local repo /www/pigsty meta
  pig repo boot                    # extract /tmp/pkg.tgz to /www/pigsty
  pig repo cache                   # cache /www/pigsty into /tmp/pkg.tgz
命令 描述 备注
repo list 打印可用仓库与模块列表
repo info 获取仓库详细信息
repo status 显示当前仓库状态
repo add 添加新仓库 需要 sudo 或 root 权限
repo set 清空、覆盖并更新仓库 需要 sudo 或 root 权限
repo rm 移除仓库 需要 sudo 或 root 权限
repo update 更新仓库缓存 需要 sudo 或 root 权限
repo create 创建本地 YUM/APT 仓库 需要 sudo 或 root 权限
repo cache 从本地仓库创建离线包 需要 sudo 或 root 权限
repo boot 从离线包引导仓库 需要 sudo 或 root 权限
repo reload 刷新仓库目录

快速入门

# 方法 1:清理干净现有仓库,添加所有必要仓库并更新缓存(推荐)
pig repo add all --remove --update    # 移除旧仓库,添加所有必要仓库,更新缓存

# 方法 1 变体:一步到位
pig repo set                          # = pig repo add all --remove --update

# 方法 2:温和方式 - 仅添加所需仓库,保留你目前的仓库配置
pig repo add pgsql                    # 添加 PGDG 和 Pigsty PGSQL 仓库
pig repo add pigsty --region=china    # 添加 Pigsty 仓库,指定使用中国区域
pig repo add pgdg   --region=europe   # 添加 PGDG 仓库,指定使用欧洲区域
pig repo add pgdg   --mirror          # PGDG 优先使用腾讯云镜像
pig repo add infra  --region=default  # 添加 INFRA 仓库 ,指定使用默认区域

# 如果上面没有-u|--update 选项一步到位,请额外执行此命令
pig repo update                       # 更新系统包缓存

模块

在 pig 中,APT/YUM 仓库被组织为 模块 —— 服务于特定目的的一组仓库。

模块 说明 仓库列表
all 安装 PG 所需的全部核心模块 node + infra + pgsql
pgsql PGDG + Pigsty PG 扩展 pigsty-pgsql + pgdg
pigsty Pigsty Infra + PGSQL 仓库 pigsty-infra, pigsty-pgsql
pgdg PGDG 官方仓库 pgdg-common, pgdg14-18
node Linux 系统仓库 base, updates, extras, epel, baseos, appstream…
infra 基础设施组件仓库 pigsty-infra, nginx, docker-ce
docker Docker 仓库 docker-ce
beta PostgreSQL 19 Beta 版本 pgdg19-beta, pgdg-beta
extra PGDG Non-Free 与三方扩展 pgdg-extras, timescaledb, citus
groonga PGroonga 仓库 groonga
mssql Wiltondb 仓库(已弃用) babelfish
percona Percona PG + PG_TDE percona
llvm LLVM 工具链仓库 llvm
kube Kubernetes 仓库 kubernetes
grafana Grafana 仓库 grafana
haproxy HAProxy 仓库 haproxyd, haproxyu
redis Redis 仓库 redis
mongo MongoDB 仓库 mongo
mysql MySQL 仓库 mysql
click ClickHouse 仓库 clickhouse
gitlab GitLab 仓库 gitlab-ce, gitlab-ee

除此之外,pig 还自带了一些其他数据库的 APT/DNF 仓库:redis, kubernetes, grafana, clickhouse, gitlab, haproxy, mongodb, mysql,在此不再展开。

通常来说,为了安装 PostgreSQL node (Linux 系统仓库) 和 pgsql(PGDG + Pigsty)是必选项,infra 仓库是可选项(包含了一些工具,IvorySQL Kernel 等)。您可以使用特殊的 all 模块,一次性添加所有需要的仓库到系统中,对绝大多数用户来说,这是合适的起点。

pig repo add all      # 添加 node,pgsql,infra 三个仓库到系统中
pig repo add          # 不添加任何参数时,默认使用 all 模块
pig repo set          # 使用 set 替代 add 时,将清理备份现有仓库定义并覆盖式更新

仓库定义

Pigsty 中可用仓库的完整定义位于 cli/repo/assets/repo.yml。

您可以创建 ~/.pig/repo.yml 文件,显式修改并覆盖 pig 的仓库定义。在编辑仓库定义文件时,您可以在 baseurl 处添加额外的区域镜像,例如指定中国,欧洲地区的镜像仓库 URL。当 pig 使用 --region 参数指定特定的区域时,pig 会优先查找对应区域的仓库 URL,如果不存在,则会 Fallback 到 default 的仓库 URL。

从 v1.7.0 起,repo add 或 repo set 指定 --mirror 时会明确选择内置的china 定义。PGDG 优先使用腾讯云,并保留定义中声明的 Pigsty 回退;其他模块使用各自维护中的中国区域 URL。pig 不再通过单独的运行时代理路由改写 PGDG URL。

普通 EL 仓库保留 DNF 原生模块过滤。只有显式声明 module_hotfixes=1 的定义 (主要是 Pigsty 与 PGDG 仓库)会覆盖模块流;渲染 EL7 YUM 配置时会移除该键。

信任策略与配置归属

仓库操作会改变主机的软件供应链配置。可以先用 pig repo info MODULE 查看 PIG 将要渲染的定义。未指定 --remove 时,repo add 会保留无关文件;repo set 则一定会先备份再替换现有定义,并刷新元数据,因此可能与 Ansible、镜像构建或其他配置管理方发生冲突。

当所选模块包含当前平台可用的 pigsty-infra 或 pigsty-pgsql 仓库时,repo add 和 repo set 会准备 PIG 内嵌的 Pigsty 公钥,包括选择 pigsty、infra、pgsql 以及默认的 all。PIG 会先检查公钥文件是否存在,已有普通文件直接复用,不重新写入。文件缺失或检查失败(包括权限不足)时,在修改仓库定义前尝试安装。该步骤支持离线执行,不依赖 curl、gpg 或 apt-key 命令。

  • EL:/etc/pki/rpm-gpg/RPM-GPG-KEY-pigsty
  • Debian / Ubuntu:/etc/apt/keyrings/pigsty.asc

新安装的公钥文件权限为 0644。默认尽最大努力安装:失败只记录警告,并在结构化结果的 data.warnings 中保留,随后继续配置仓库。仅对所选 Pigsty 仓库降级:Debian/Ubuntu 使用 trusted=yes,EL 使用 gpgcheck=0 和 repo_gpgcheck=0。失败时仍保留默认密钥引用,使不同操作添加的 APT 定义保持相同的 signed-by,其他仓库定义保持不变。密钥不可用时,APT 可能告警并沿用旧索引;配置成功不代表刚刚下载了新索引。

如果所选 Pigsty 仓库的元数据显式指定了非空密钥引用,就必须准备该引用实际指定的密钥。Debian/Ubuntu 的 signed-by 必须通过绝对路径指定已有普通密钥文件,多个文件以逗号分隔;默认 Pigsty 路径可由内嵌公钥安装。EL 会按需准备显式引用的默认公钥文件,再将 gpgkey 中列出的路径或不含变量的 URL 交给 rpm --import。准备失败会在备份、写入仓库和更新缓存之前返回错误。显式引用保持原样,不会静默降级;有效的自定义密钥不依赖默认密钥路径。只选择 pgdg、node 等其他仓库不会准备 Pigsty 公钥。

默认自动安装只准备公钥文件及其仓库引用,不会导入 RPM 数据库或 APT 全局信任库;EL 显式配置 gpgkey 时会额外执行上述 RPM 导入。普通 repo add/set 在准备成功时保留原签名校验设置。pig sty boot 在公钥准备成功时启用 Pigsty 签名校验,默认公钥失败时使用同样的告警与降级规则。详细边界见 设计记录。

为了兼容离线仓库与镜像,PIG 内置元数据在 EL 上默认使用 gpgcheck=0,在 Debian/Ubuntu 上默认使用 trusted=yes;这些设置不会强制校验软件包签名。从 v1.7.0 起,普通 EL 仓库保留 DNF 原生模块过滤;只有显式声明 module_hotfixes=1 的定义(主要是 Pigsty 与 PGDG 仓库)会覆盖模块流,渲染 EL7 YUM 配置时还会移除该键。安全敏感环境应安装可信密钥、修改生成的仓库元数据以启用签名校验、固定批准的软件源,并通过既有配置管理体系维护这些设置。

repo list

pig repo list 将列出当前系统可用的所有仓库模块。

pig repo list                # 列出当前系统可用仓库
pig repo list all            # 列出所有仓库(不过滤)

repo info

显示特定仓库或模块的详细信息,包括 URL、元数据和区域镜像,以及 .repo / .list 仓库文件内容。

pig repo info pgdg               # 显示 pgdg 模块的信息
pig repo info pigsty pgdg        # 显示多个模块的信息
pig repo info all                # 显示所有模块的信息

repo status

显示系统上的当前仓库配置。

pig repo status

repo add

添加仓库配置文件到系统。需要 root/sudo 权限。

pig repo add pgdg                # 添加 PGDG 仓库
pig repo add pgdg pigsty         # 添加多个仓库
pig repo add all                 # 添加所有必要仓库 (pgdg + pigsty + node)
pig repo add pigsty -u           # 添加并更新缓存
pig repo add all -r              # 添加前移除现有仓库
pig repo add all -ru             # 移除、添加并更新(完全重置)
pig repo add pgdg --region=china # 使用中国镜像
pig repo add pgdg -m             # 选择中国定义;PGDG 优先使用腾讯云

选项:

  • -r|--remove:添加新仓库前移除现有仓库
  • -u|--update:添加仓库后运行包缓存更新
  • --region <region>:使用区域镜像仓库(default / china / europe)
  • -m|--mirror:明确选择内置的 china 仓库定义
平台 模块位置
EL /etc/yum.repos.d/<module>.repo
Debian /etc/apt/sources.list.d/<module>.list

repo set

等同于 repo add --remove --update。清空现有仓库并设置新仓库,然后更新缓存。

pig repo set                     # 替换为默认仓库
pig repo set pgdg pigsty         # 替换为特定仓库并更新
pig repo set all --region=china  # 使用中国镜像
pig repo set -m                  # 明确选择内置的中国区域定义

repo rm

移除仓库配置文件并备份它们。

pig repo rm                      # 移除所有仓库
pig repo rm pgdg                 # 移除特定仓库
pig repo rm pgdg pigsty -u       # 移除并更新缓存
平台 备份位置
EL /etc/yum.repos.d/backup/
Debian /etc/apt/sources.list.d/backup/

repo update

更新包管理器缓存以反映仓库更改。

pig repo update                  # 更新包缓存
平台 等效命令
EL dnf makecache
Debian apt update

repo create

为离线安装创建本地包仓库。

pig repo create                  # Linux:/www/pigsty;macOS:当前目录
pig repo create /srv/repo        # 在自定义位置创建

当前实现会优先使用 PATH 中的 sow。在 Linux 上选择 SOW 后,会对每个目标目录以 sudo 执行等价命令:

sow create --pigsty --timeout 10m -- /absolute/repository/path

在 macOS 上必须安装 SOW,执行时不使用 sudo,默认目标为当前目录。Linux 上如果没有安装 sow,EL 会回退到 createrepo_c,Debian/Ubuntu 会回退到 dpkg-dev 提供的 dpkg-scanpackages;首选后端与平台回退均不可用时,pig repo create 才会失败。SOW 一旦被选中,其执行错误会直接返回,不会再用旧后端重试。10m 只限制等待 SOW 目录锁的时间,并不限制仓库索引本身的执行时间。

SOW 的 --pigsty 事务会:

  1. 只扫描顶层普通 .rpm 与 .deb 文件,不递归,也不跟随符号链接。
  2. 按解析后的软件包事实,删除 32 位 x86 包(RPM 的 i386/i486/i586/i686、DEB 的 i386),以及二进制包名恰为 patroni、上游版本恰为 3.0.4 的包。
  3. 以原子方式生成对应的 RPM/DEB 元数据,最后写入 repo_complete;marker 按 basename 排序,记录剩余顶层软件包的 SHA-256。

非软件包文件与目录不会被改动;候选软件包无法解析或逻辑坐标冲突时,SOW 事务会失败关闭。旧版回退脚本的清理与元数据语义不同,并在 repo_complete 中写入软件包的 MD5 列表。任一后端退出后,PIG 都会要求 repo_complete 存在且为普通文件,但不会校验 marker 内容或其中哈希。若交付流程把 marker 当作放行条件,调用方应自行完成这些验证。

repo cache

创建仓库内容的压缩 tarball 用于离线分发。

pig repo cache                   # 默认:/www 到 /tmp/pkg.tgz
pig repo cache -d /srv           # 自定义源目录

选项:

  • -d, --dir:源目录(默认:/www/)
  • -p, --path:输出路径(默认:/tmp/pkg.tgz)

repo boot

从离线包解压并设置本地仓库。

pig repo boot                    # 默认:/tmp/pkg.tgz 到 /www
pig repo boot -p /mnt/pkg.tgz   # 自定义包路径
pig repo boot -d /srv           # 自定义目标目录

选项:

  • -p, --path:包路径(默认:/tmp/pkg.tgz)
  • -d, --dir:目标目录(默认:/www/)

repo reload

从 GitHub 刷新仓库元数据到最新版本。

pig repo reload                  # 刷新仓库目录

更新后的文件会放置于 ~/.pig/repo.yml 中。