各个平台的包管理器

请注意:本文编写于 ,其中某些信息可能已经失去时效性。

前言

作为一个程序员,在进行日常工作的时候经常要进行操作系统的切换,就我而言我个人的笔记本是 Windows 10 + macOS 双系统,公司电脑是 Windows 10 + VMware目前已经更换为台式机:Hackintosh + Windows 10,每当进行系统重装或者新环境部署的时候都需要面临各类(软件)包的安装。Windows 下还比较好说,基本上都是打包好的安装包,只需要找到下载方法,下载并安装即可。而处理剩下的这些 类 Unix 系统就比较头疼了,不同体系的系统(使用不同的软件包管理器)有不同的软件包安装方式。

本文主要介绍常用的几种包管理器:

包管理器 典型适用系统
Yum CentOS
apt Ubuntu
homebrew MacOS

Windows

为了方便理解我们先介绍一下最为普遍的 Windows 系统是如何进行包安装的:

  1. 确定需要安装的软件包
  2. 找到一个提供目标软件包下载服务的(url)地址
  3. 下载目标软件包
  4. 双击目标软件包根据提示安装目标软件

在后面的介绍过程中我会将不同包管理器的使用类比这里的四个步骤方便理解

2021.04.18 补充:
Windows 也出现了很多包管理工具:ChocolateyScoop 以及微软自家推出的WinGet

类 Unix

RPM Package Manager(RPM)

RPM 包管理员(简称 RPM,全称为 The RPM Package Manager)是在 Linux 下广泛使用的软件包管理器。RPM 此名词可能是指 .rpm 的文件格式的软件包,也可能是指其本身的软件包管理器(RPM Package Manager)。最早由 Red Hat 研制,现在也由开源社区开发。RPM 通常随附于 Linux 发行版,但也有单独将 RPM 作为应用软件发行的发行版(例如Gentoo)。RPM 仅适用于安装用 RPM 来打包的软件,当前是 GNU/Linux 下软件包资源最丰富的软件包类型之一。

RPM软件包 分为二进制包(Binary)、源代码包(Source)和 Delta 包三种。二进制包可以直接安装在计算机中,而源代码包将会由 RPM 自动编译、安装。源代码包经常以 .rpm 作为后缀名。

—— RPM 维基百科

The RPM Package Manager(RPM) is a powerful package management system capable of
building computer software from source into easily distributable packages
installing, updating and uninstalling packaged software
querying detailed information about the packaged software, whether installed or not
verifying integrity of packaged software and resulting software installation

—— rpm.org

RPM 包管理器是一个强大的包管理系统,它能够做到:

  • 将电脑软件从源码构建成可分发包
  • 安装、更新和删除打包好的软件包
  • 查询软件包的详细信息,无论是否安装
  • 验证软件包的完整性和软件的安装情况

原理

[RPM 打包原理][]

写完之后会更新链接

命令简介

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# From man rpm
# Querying and verifying packages | 查询和验证包
rpm {-q | --query} [select-options] [query-options]
rpm --querytags
rpm {-V | --verify} [select-options] [verify-options]

# Installing, upgrading and removing packages | 安装、更新、删除
rpm {-i | --install} [install-options] PACKAGE_FILE ...
# 更新包,如果未安装则安装
rpm {-U | --upgrade} [install-options] PACKAGE_FILE ...
# 如果包已安装则更新
rpm {-F | --freshen} [install-options] PACKAGE_FILE ...
rpm {--reinstall} [install-options] PACKAGE_FILE ...
rpm {-e | --erase] [--allmatches] [--justdb] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME ...

Yum | DNF

Yum(Yellow dog Updater, Modified) 是由 Duke University 团队修改 Yellow Dog Linux 的 Yellow Dog Updater 开发而成,是一个基于 RPM 包管理的字符前端软件包管理器。能够从指定的服务器自动下载 RPM 包并且安装,可以处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。被 Yellow Dog Linux 本身,以及 Fedora, Red Hat Enterprise Linux 采用。

—— Yum 维基百科

运行原理

Yum 可以简单的分为「服务器」和「客户端」两个部分

服务器 | 以下简称 YumS

所有要发行的 RPM 包都放在 YumS 上以供别人下载,RPM 包根据 Kernel 和 CPU 的版本分别编译发布。YumS 使用 FTP 或 HTTP 等形式提供下载服务。YumS 还有一个重要的功能即整理出每个 RPM 包的基本信息,包括:版本号、conf 文件、binary 信息以及最关键的依赖信息等。

YumS 上提供了 createrepo 工具,来把 RPM 包的基本概要信息做成一张「清单」,这张「清单」就是描述每个 RPM 包的 spec 文件。

客户端 | 以下简称 YumC

客户端每次调用 yum install 或者 yum search 命令时,都会去解析 /etc/yum.repos.d 下面所有以 .repo 结尾的配置文件,这些配置文件指定了 YumS 的地址。

YumC 会定期从 YumS 更新 RPM 包清单,然后把清单下载保存到 YumC 的缓存里,根据 /etc/yum.conf 的配置,每次调用 yum install 的时候都会去缓存目录下去找这个清单,根据清单来确定安装包的名字、版本号、所需要的依赖包等信息,再去 YumS 下载相应包进行安装(前提是该包的缓存不在本地缓存中)。

Yum 与 DNF

由于 Yum 在更新迭代的过程中积累了很多问题没有解决,例如:性能差、内存占用多、依赖解析速度慢等等。

因此在 RedHat 系列 Linux 系统在进行大版本更新时使用 DNF 替代料 Yum,例如在 Centos7 升级到 Centos8 之后 yum 命令就是一个指向 dnf 命令的软连接。

DNF 使用 libsolv 进行依赖解析,由 SUSE 开发和维护,旨在提高性能。

DNF 代表 Dandified Yum 是 Yum 的下一代版本,最早出现在 Fedora18 中,并在 Fedora22、RHEL8 中替代了 yum。

dnf 的命令格式与 yum 基本一致。

dnf 与 yum 对比

图片来自:知乎:linux中国-DNF 和 Yum 的区别……
内容是译自:2daygeek:Magesh Maruthamuthu-What is…

命令简介

参考

  1. 维基百科:Yum
  2. firefoxbug-深入理解yum工作原理
  3. 知乎:linux中国-DNF 和 Yum 的区别……