包管理器和apt

一、什么是包(package)

一个“ 包(package)”(或“软件包”)通常指的是一个应用程序,它可以是一个 GUI 应用程序、命令行工具或(其他软件程序需要的)软件库。包本质上是一个存档文件,包含二进制可执行文件、配置文件,有时还包含依赖关系的信息。

在旧时代, 软件曾经是从它的源代码安装的 。你会参考一个文件(通常命名为 README),看看它需要什么软件组件、二进制文件的位置。它通常包括一个配置脚本或 Makefile。你必须自己编译该软件或自己处理所有的依赖关系(有些软件需要安装其他软件)。

为了摆脱这种复杂性,Linux 发行版创建了自己的打包格式,为终端用户提供随时可用的二进制文件(预编译软件),以便安装软件,同时提供一些 元数据 (版本号、描述)和依赖关系。

这就像烤蛋糕与买蛋糕一样。
大约在上世纪 90 年代中期,Debian 创建了 DEB 打包格式(.deb),Red Hat Linux 创建了 RPM(Red Hat Package Manager 的缩写)打包系统(.rpm)。编译源代码的方式仍然存在,但现在是可选的。
在这里插入图片描述
要与打包系统交互或使用打包系统,你需要一个包管理器。用户只需要决定吃什么蛋糕,如何去做则有类似商店的软件仓库。

二、包管理器如何工作?

请记住,包管理器是一个通用的概念,它并不是 Linux 独有的。你会经常发现各种软件或编程语言的包管理器。有 只是针对 Python 包的 PIP 包管理器 。甚至 Atom 编辑器也有自己的包管理器 。由于本文的重点是 Linux,所以我会从 Linux 的角度出发。不过,这里的大部分解释也可以应用于一般的包管理器。我创建了这个图(基于 SUSE Wiki),这样你就可以很容易理解包管理器是如何工作的。
在这里插入图片描述
几乎所有的 Linux 发行版都有“ 软件仓库(software repository)”,它基本上是软件包的集合。是的,可以有不止一个软件库。软件库包含不同种类的软件包。

软件仓库也有元数据文件,其中包含了软件包的信息,如软件包的名称、版本号、软件包的描述和软件仓库名称等。这就是你在 Ubuntu/Debian 中使用 apt show 命令 所看到的。

你的系统上的包管理器首先会与元数据进行交互。包管理器在你的系统上创建了一个元数据的本地缓存。当你运行包管理器的更新选项(例如 apt update)时,它会通过引用仓库中的元数据来更新本地元数据缓存。

当你运行软件包管理器的安装命令(例如 apt install package_name)时,软件包管理器会引用这个缓存。如果它在缓存中找到了包的信息,它就会使用互联网连接到相应的仓库,并在你的系统上安装之前先下载包。

一个包可能有依赖关系。意思是说,它可能需要安装其他软件包。软件包管理器通常会处理这些依赖关系,并将其与你正在安装的软件包一起自动安装。

在这里插入图片描述
Linux 中包管理器会处理依赖关系:同样,当你使用包管理器删除一个包时,它要么自动删除,要么通知你系统有未使用的包可以清理。

除了安装、删除这些显而易见的任务外,你还可以使用包管理器对包进行配置,并根据自己的需要进行管理。例如,你可以在常规的系统更新中 防止升级某个包的版本 。你的包管理器可能还能做很多事情。

不同种类的包管理器
在这里插入图片描述
包管理器因打包系统而异,但同一打包系统却可能有多个包管理器。软件包管理器不一定是基于命令行的,也有图形化的软件包管理工具,比如 Synaptic 。你的发行版的“软件中心”也是一个软件包管理器,即使它在底层运行的是 apt-get 或 DNF。例如,RPM 有 Yum 和 DNF 包管理器。对于 DEB,你有 apt-get、 aptitude 等基于命令行的包管理器。

三、Ubuntu的apt工具

高级打包工具(英语:Advanced Packaging Tools,缩写为APT)是Debian及其派生的Linux软件包管理器。利用这个工具,我们可以方便地下载、配置和安装二进制或者源代码格式的软件格式,对于Debian系统,常常会谈到dpkg这个工具,这个功能与apt功能时相似。

apt为包管理系统提供一个高级的命令行接口。如果你是Ubuntu相对较早的用户,你可能常常会使用apt-get而不是apt,相对于apt-get,apt更像是一个简化版的apt-get,简化体现在只提及最常见的命令和选项,毕竟不是所有人都喜欢冗长的控制命令,看看apt和apt-get之间的对比吧:

apt命令 apt-get命令 含义
apt install apt-get install 安装某个软件包
apt remove apt-get remove 卸载某个软件包
apt purge apt-get purge 卸载并移除配置文件
apt update apt-get update 更新存储库引索
apt upgrade apt-get upgrade 升级所有可升级的软件包
apt autoremove apt-get auto remove 自动删除不需要的包
apt full-upgrade apt-get dist-upgrade 升级包时自动处理依赖关系
apt search apt-get search 搜索应用程序
apt show apt-cache show 显示安装包细节

以cmake为例,看看是如何使用这个工具的。

卸载cmakesudo apt remove cmake
在这里插入图片描述
安装cmakesudo apt install cmake
在这里插入图片描述
cmake应用信息查看
在这里插入图片描述
从apt管理器展示出来的信息可以看到:

  • cmake版本是3.16.3
  • 大小
  • 依赖
  • 主页
  • 描述
  • APT-源位置:http://mirrors.aliyun.com/ubuntu focal/main amd64 Packages

具体的位置可能和APT-source有点点不一样:http://mirrors.aliyun.com/ubuntu/dists/focal/main/binary-amd64/Packages.gz,在这个压缩包中,我们可以看到cmake相关配置:

Package: cmake
Architecture: amd64
Version: 3.16.3-1ubuntu1
Multi-Arch: foreign
Priority: optional
Section: devel
Origin: Ubuntu
Maintainer: Ubuntu Developers <[email protected]>
Original-Maintainer: Debian CMake Team <[email protected]>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 18758
Depends: cmake-data (= 3.16.3-1ubuntu1), procps, libarchive13 (>= 3.3.3), libc6 (>= 2.17), libcurl4 (>= 7.16.2), libexpat1 (>= 2.0.1), libgcc-s1 (>= 3.0), libjsoncpp1 (>= 1.7.4), librhash0 (>= 1.2.6), libstdc++6 (>= 9), libuv1 (>= 1.11.0), zlib1g (>= 1:1.1.4)
Recommends: gcc, make
Suggests: cmake-doc, ninja-build
Filename: pool/main/c/cmake/cmake_3.16.3-1ubuntu1_amd64.deb
Size: 3668668
MD5sum: 0901cd90df683245c1c63aa25494e895
SHA1: 987da0bb67fef6ed1cc4bdf791c983534dea4341
SHA256: 1f09f5bd58627092ed1787538051ce9f5f016ab279fe4c795e01faa1f9619180
Homepage: https://cmake.org/
Description: cross-platform, open-source make system
Description-md5: 47b53839da906127970f1e8c870afc2d

简单来说,就是给定一个地址,每当Ubuntu认证通过了,新的安装包就会更新到网站上的package中,用户通过upgrade来同步新软件的地址。那么有没有办法安装高版本的cmake?

  • ppa
  • 二进制代码
  • 源码

四、Ubuntu软件仓库管理工具

软件仓库是一组文件,其中包含各种软件及其版本的信息,以及校验和等其他一些详细信息。每个版本的 Ubuntu 都有自己的四个官方软件仓库

  • Main - Canonical 支持的自由开源软件;
  • Universe - 社区维护的自由开源软件;
  • Restricted - 设备的专有驱动程序;
  • Multiverse - 受版权或法律问题限制的软件。
    在这里插入图片描述
    除了官方软件,还有其他软件(Other Software),最常见的可能就是VSCODE了!
    在这里插入图片描述

系统通过存储在/etc/apt目录中的sources.list文件检索到对应信息,这些信息可以帮助系统从实际存储软件的网址获取对应软件包。这样的话,当你运行sudo apt update 命令时,你的系统将使用 APT 工具 来检查软件仓库并将软件及其版本信息存储在缓存中。当你使用 sudo apt install package_name 命令时,它通过该信息从实际存储软件的网址获取该软件包。如果软件仓库中没有某个包的信息,则会提示E:Unable to locate package。使用官方仓库有一个问题:Ubuntu为了保证兼容性,开发、更新的新工具并不会马上更新到现有系统中,而是经过一些测试后正式加入到官方库,这个时间可能是几个月时间。那么我们可以如何解决呢?通过PPA!

PPA

PPA(Personal Package Archive)个人软件包存档时一个包含软件信息的仓库,个人的意思是开发者独享的,没有得到分发的正式许可。Ubuntu 提供了一个名为 Launchpad 的平台,使软件开发人员能够创建自己的软件仓库。终端用户,也就是你,可以将 PPA 仓库添加到 sources.list 文件中,当你更新系统时,你的系统会知道这个新软件的可用性,然后你可以使用标准的 sudo apt install 命令安装它。

  • sudo add-apt-repository <PPA_info>此命令将 PPA 仓库添加到列表中。
  • sudo apt-get update 此命令更新可以在当前系统上安装的软件包列表。
  • sudo apt-get install <package_in_PPA> 此命令安装软件包。

如:

sudo add-apt-repository ppa:dr-akulavich/lighttable

你会注意到此命令没有软件仓库的 URL。这是因为该工具被设计成将 URL 信息抽象之后再展示给你。

小小注意一下:如果你添加的是 ppa:dr-akulavich/lighttable,你会得到 Light Table。但是如果你添加 ppa:dr-akulavich,你将得到 “上层软件仓库” 中的所有仓库或软件包。它是按层级划分的。

基本上,当您使用 add-apt-repository 添加 PPA 时,它将执行与手动运行这些命令相同的操作:

deb http://ppa.launchpad.net/dr-akulavich/lighttable/ubuntu YOUR_UBUNTU_VERSION_HERE main
deb-src http://ppa.launchpad.net/dr-akulavich/lighttable/ubuntu YOUR_UBUNTU_VERSION_HERE main

以上两行是将任何软件仓库添加到你系统的 sources.list 文件的传统方法。但 PPA 会自动为你完成这些工作,无需考虑确切的软件仓库 URL 和操作系统版本。

此处不那么重要的一点是,当你使用 PPA 时,它不会更改原始的 sources.list 文件。相反,它在 /etc/apt/sources.d 统级目录中创建了两个文件,一个 .list 文件和一个带有 .save 后缀的备份文件。
在这里插入图片描述
这是一种安全措施,可以确保添加的 PPA 不会和原始的 sources.list 文件弄混,它还有助于移除 PPA。
可能会问为什么要使用 PPA,PPA 需要通过命令行使用,而不是每个人都喜欢用命令行。为什么不直接分发可以图形方式安装的 DEB 包呢?

答案在于更新的过程。如果使用 DEB 包安装软件,将无法保证在运行 sudo apt update 和 sudo apt upgrade 命令时,已安装的软件会被更新为较新的版本。

这是因为 apt 的升级过程依赖于 sources.list 文件。如果文件中没有相应的软件条目,则不会通过标准软件更新程序获得更新。

那么这是否意味着使用 DEB 安装的软件永远不会得到更新?不是的。这取决于 DEB 包的创建方式。

一些开发人员会自动在 sources.list 中添加一个条目,这样软件就可以像普通软件一样更新。谷歌 Chrome 浏览器就是这样一个例子。

某些软件会在运行时通知你有新版本可用。你必须下载新的 DEB 包并再次运行,来将当前软件更新为较新版本。Oracle Virtual Box 就是这样一个例子。

对于其余的 DEB 软件包,你必须手动查找更新,这很不方便,尤其是在你的软件面向 Beta 测试者时,你需要频繁的添加很多更新。这正是 PPA 要解决的问题。

[1] 【APT】https://zh.wikipedia.org/wiki/APT
[2] 【rpm与deb的区别】https://www.cnblogs.com/longchang/p/12530697.html
[3] 【Linux篇(三):Linux的包管理工具】https://blog.csdn.net/xu_fengyu/article/details/85218057

猜你喜欢

转载自blog.csdn.net/weixin_39258979/article/details/111772857