Package Manager

image

from pixiv

软件管理包的历史

Linux 内核由 Linus Torvalds 开发,是操作系统的核心组件,负责硬件管理和进程调度,其发行版分为Debian系和Red Hat系

  • Debian:

    • 社区驱动:由全球开发者协作维护,遵循自由软件原则,提供稳定、无商业约束的发行版
    • 衍生系统:Ubuntu、Linux Mint 等均基于 Debian,共享 APT 包管理体系和 .deb 格式
  • Red Hat:

    • 企业导向:由 Red Hat 公司维护,提供商业支持(如 RHEL),强调长期稳定性和企业级安全(如默认启用 SELinux)
    • 衍生系统:Fedora 是其上游测试平台,CentOS 是 RHEL 的免费社区版(现转向 CentOS Stream)
特性 Debian Red Hat
包管理器 APT(.deb 格式) YUM/DNF(.rpm 格式)
支持周期 Stable 版 5 年支持 RHEL 提供 10 年企业支持
软件包数量 超过 59,000 个(最新版) 较少,依赖 EPEL 等第三方仓库
安全性 默认启用 AppArmor 默认启用 SELinux
维护方 社区 企业(Red Hat 公司)

APT Package Manager

What is APT?

Anatomy of the Package System(软件包系统剖析), is the Debian packaging system, 用于管理软件包,可以将其想象成命令行版的App Store.

Debian 是一个自由且开源的 Linux 发行版,Ubuntu 是基于 Debian 构建的 Linux 发行版。它由 Canonical 公司及社区共同维护,目标是提供一个用户友好的操作系统,Ubuntu 继承了 Debian 的许多特性

其最大的特点是其是个"依赖系统":

  • simple dependency, 即当一个包依赖其他包时,其他包需要安装完成才能正常工作。
  • conflicting dependency, 即当一个包和其他包一起安装时可能无法正常工作,因为包之前在某些地方冲突了(如端口)

apt 和 apt-get都是软件包系统管理工具,但是apt整合了 apt-get,apt-cache等常用功能,提供了彩色输出和友好的进度条;apt-get输出较为简洁,适合在脚本或自动化任务中使用。

/etc/apt/sources.list

在 APT 的配置中,两个位置都用于定义软件源,但它们的角色略有不同:

  • /etc/apt/sources.list
    这是 APT 的主配置文件,通常由系统安装时预设,并且由管理员手动编辑,用来列出主要的软件仓库地址。

  • /etc/apt/sources.list.d/
    这是一个目录,里面可以放置多个以 “.list” 为后缀的文件,每个文件可以包含一部分软件源配置。这样做可以让软件包或第三方仓库添加自己的软件源而不必直接修改主文件,便于管理和维护。

两者在更新软件包列表时都会被读取,APT 会将它们合并成一个完整的软件源列表。通过这种分离方式,可以使系统配置更加模块化,方便添加、删除或调整单独的仓库配置,而不会影响整体配置。

/etc/apt/sources.list和/etc/apt/sources.list.d/文件中书写的软件源格式如下:

deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
  • 开头通常是 deb 或 deb-src,它们用于指示软件包的类型和获取方式。

    • deb:表示该条目指向的是预编译的二进制软件包仓库,适用于直接安装可执行软件。
    • deb-src:表示该条目指向的是源代码包仓库,适用于需要获取软件源代码以进行编译或开发的情况。
  • 在 Ubuntu 的软件源配置中,jammy 是 Ubuntu 22.04 LTS 版本的代号,全称为 "Jammy Jellyfish"(幸运水母)。使用代号(如 "jammy")来指定对应的 Ubuntu 版本,以确保从正确的仓库获取软件包和更新。

  • 在 Ubuntu 的软件仓库中,软件包根据支持和许可情况被分为四个“组件”,这使得用户可以更清晰地了解每个包的来源和支持情况。具体说明如下:

    • main
      • 含义:Ubuntu 官方完全支持的、自由开源的软件集合。
      • 作用:这些软件由 Canonical(或官方团队)直接维护和更新,保证了安全性和长期支持。
    • restricted
      • 含义:包含受限制但官方支持的软件,比如某些专有驱动和硬件支持程序。
      • 作用:这些包通常因专利或许可问题而不能完全开源,但它们对系统硬件的兼容和功能实现很重要,因此由 Ubuntu 官方提供支持。
    • universe
      • 含义:由社区维护的自由开源软件集合。
      • 作用:这些软件虽然免费开源,但不由 Ubuntu 官方团队直接支持,更新和维护依赖于社区贡献,因此可能在稳定性和及时性上略有差异。
    • multiverse
      • 含义:包含由于版权、许可或法律原因而受限制的软件。
      • 作用:这些软件可能无法自由分发或存在使用限制,Ubuntu 不提供官方支持,用户需要自行评估和承担相关风险。

/etc/apt/trusted.gpg

在 APT 软件包管理中,用于验证软件仓库签名的 GPG 公钥可以存放在两个位置:

  • /etc/apt/trusted.gpg
    这是一个单一的密钥环文件,通常包含多个经过信任的公钥。历史上,这个文件是存放所有仓库信任密钥的主要位置。

  • /etc/apt/trusted.gpg.d/
    这是一个目录,每个文件通常只存储一个仓库或一组相关的公钥。采用目录方式可以实现模块化管理,方便添加、更新或删除单个仓库的密钥,而不必修改整个密钥环。

GPG(GNU Privacy Guard)密钥是一种基于公钥密码体系的工具,用于数字签名和加密,主要目的是验证数据(如软件包、仓库元数据等)的完整性和来源可信性。

仓库维护者使用私钥对软件包或仓库元数据进行数字签名,用户系统则利用对应的公钥来验证签名。如果验证成功,就说明数据来自可信任的发布者且未被篡改。

私钥保存在发布者手中,而公钥则公开发布,供用户下载并存储在系统中(例如放在/etc/apt/trusted.gpg 或 /etc/apt/trusted.gpg.d/ 目录下)。


/var/cache/apt/archives
缓存的是实际下载的软件包安装文件,一般以.deb结尾

.deb 文件是一种软件包文件格式,全称是 “Debian package”。它用于在 Debian 及其衍生系统(如 Ubuntu、Linux Mint 等)上分发和安装软件。主要特点包括:

  • 封装内容:.deb 文件通常是一个归档包,其中包含了软件的二进制文件、库文件、配置文件以及安装前后需要执行的脚本(如 preinst、postinst 等)。
  • 底层格式:它由底层工具(如 dpkg)来处理,主要用于对本地的 .deb 文件进行安装、升级、卸载和查询。上层工具如 APT 则在此基础上增加了自动解析依赖关系和从远程仓库获取软件包的功能。
  • 打包与分发:.deb 格式允许开发者将一个软件所有必要的组件整合到一个文件中,方便软件的分发、管理和更新。

/var/lib/apt/lists

这个目录中保存了各个软件仓库的包索引文件,供 apt 命令查询软件包信息使用,供系统了解可安装软件包的最新状态.


PPA

PPA 的全称是 Personal Package Archive,由 Canonical 提供的 Launchpad 平台上的一种机制,用于托管和分发软件包。

PPA 实际上是一个在线的、个人或团队维护的软件仓库,你可以在 Launchpad 上创建和管理自己的 PPA。通过 PPA,你可以发布自己构建的 Ubuntu 软件包,其他用户可以通过添加该 PPA 来安装和更新你的软件包。

可以将你的软件包上传到一个 PPA。不过这需要你先在 Launchpad 上注册账户,并按照相应的打包要求和上传流程(例如使用 dput 工具上传源代码包)来操作。上传成功后,Launchpad 会自动构建并发布你的软件包,供用户通过 apt 系统进行安装和更新。

Launchpad

Command

常用命令

tutorial


apt update 和 apt upgrade

  • apt update

    • 作用是更新本地的包管理器数据库(即软件包列表),从已配置的仓库中获取最新的软件包信息。
    • 它不会安装或升级任何软件包,只是刷新信息,让系统知道有哪些新版本的软件包可用。
    • 更改的是/var/lib/apt/lists文件
  • apt upgrade

    • 作用是根据已经更新的软件包列表,将系统中已安装的软件包升级到新版本
    • 它会下载并安装软件包的更新,但通常不会安装新的依赖包,也不会删除旧的软件包。

简单来说,apt update 是先告诉系统“这里有最新的软件包信息”,而 apt upgrade 则根据这些信息实际更新系统中已安装的软件包。


apt clean

而 apt clean 的作用是清理 /var/cache/apt/archives 目录中下载的软件包缓存文件,从而释放磁盘空间。


add-apt-repository ppa:<repository_name>

  • 作用:
    使用命令 sudo add-apt-repository ppa:<repository_name> 会将指定的 PPA 添加到系统的软件源中。这使得系统可以从该 PPA 下载和安装相应的软件包,同时也会自动导入该仓库的 GPG 密钥,以确保软件包的安全性。

  • 影响的位置:
    此命令会在 /etc/apt/sources.list.d/ 目录下创建一个新的 .list 文件,该文件包含了该 PPA 的软件源信息。它不会直接修改 /etc/apt/sources.list,而是通过单独的文件来管理附加的仓库,使得系统的软件源配置更加模块化和易于管理。

# 如下案例:
sudo add-apt-repository ppa:cappelikan
# 后可以在/etc/apt/sources.list.d/目录下看到多了
cappelikan-ubuntu-ppa-jammy.list
# 其中内容为:
deb https://ppa.launchpadcontent.net/cappelikan/ppa/ubuntu/ jammy main
# deb-src https://ppa.launchpadcontent.net/cappelikan/ppa/ubuntu/ jammy main

需要注意的是以add-apt-repository ppa:<repository_name>方式添加的源基本上都是以https://ppa.launchpadcontent.net网站开头的

当然也可以sudo add-apt-repository --remove ppa:<repository_name>

Debugging

Err: 仓库 404

Err:14 https://ppa.launchpadcontent.net/rosecompiler/rose-development/ubuntu jammy Release 404
Err:15 https://repo.iovisor.org/apt/jammy jammy Release 404
Err:16 https://apt.llvm.org/jammy llvm-toolchain-jammy-7 Release 404
  • 仓库未提供对Ubuntu 22.04 (Jammy)的支持
  • 仓库已被废弃或迁移
  • 手动添加了错误版本的仓库配置
# 移除无效仓库
sudo rm -f /etc/apt/sources.list.d/rosecompiler-ubuntu-rose-development-jammy.list*
sudo rm -f /etc/apt/sources.list.d/iovisor.list*
sudo rm -f /etc/apt/sources.list.d/llvm-toolchain-7.list*

# 可以根据需要手动添加下最新厂库和相应GPG, 以LLVM为例:
# 添加新版LLVM仓库(以17版本为例)
echo "deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-17 main" | sudo tee /etc/apt/sources.list.d/llvm-toolchain-17.list
# 添加新版GPG密钥
wget -qO - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/llvm.gpg

# 更新仓库缓存
sudo apt update

Err: 仓库 stretch InRelease GPG error

Err:10 http://repo.mysql.com/apt/debian stretch InRelease
GPG error: xxx
  • MySQL的APT仓库密钥已过期
  • 密钥存储位置不符合apt新规范
# 清理旧MySQL仓库
sudo rm -f /etc/apt/sources.list.d/mysql.list

# 添加新版MySQL仓库(适配Jammy)
echo "deb http://repo.mysql.com/apt/ubuntu/ jammy mysql-8.0" | sudo tee /etc/apt/sources.list.d/mysql.list

# 获取新GPG密钥
wget -qO - https://repo.mysql.com/RPM-GPG-KEY-mysql-2023 | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/mysql.gpg

# 更新仓库
sudo apt update

清理 APT 缓存

sudo apt clean
sudo rm -rf /var/lib/apt/lists/*

sudo apt update

DNF

  1. RPM(Red Hat Package Manager)

    • 定义:RPM 是由 Red Hat 开发的软件包格式(.rpm 文件),同时也是底层包管理工具的名称,主要用于安装、查询和卸载单个软件包。
    • 功能局限:RPM 本身仅处理单个软件包的安装,无法自动解决依赖关系,需手动处理依赖链,这在实际使用中较为繁琐。
  2. YUM(Yellowdog Updater, Modified)

    • 角色:作为 RPM 的前端工具,YUM 弥补了 RPM 的缺陷,支持自动依赖解析和仓库管理,简化了软件安装流程。
    • 历史地位:曾是 Red Hat 系(如 CentOS 7、Fedora 早期版本)的默认包管理器,但因性能问题和代码冗余逐渐被 DNF 取代。
  3. DNF(Dandified YUM)

    • 改进:DNF 是 YUM 的现代化重构版本,使用 libsolv 库优化依赖解析效率,并支持模块化软件管理。从 Fedora 22 和 RHEL 8 起成为默认包管理器。
    • 兼容性:完全兼容 YUM 的配置文件与命令语法,用户可平滑过渡。
posted @ 2025-04-26 23:03  次林梦叶  阅读(58)  评论(0)    收藏  举报