Skip to main content

Command Palette

Search for a command to run...

apt update 是如何工作的

Updated
2 min read
apt update 是如何工作的

本文简单介绍了在 ubuntu 的命令行下运行 apt update 时,软件包管理工具 apt 所执行的实际动作,相信此文会让你对 ubuntu 的包管理系统有更好的了解

1. 导言

  • 众所周知,Linux 有很多的发行版,Ubuntu 是其中之一,Ubuntu 使用一个软件包管理系统 apt 对软件进行维护,这些软件包包括硬件驱动、Linux 内核以及应用软件,所有这些软件包放在一个在线的服务器上,这个服务器被称作 软件仓库,使用 apt 命令行工具,可以访问软件仓库、建立本地软件仓库,并管理这些软件。本文将讨论在 ubuntu 上执行 apt update 命令所执行的具体操作。

2. 什么是 APT

  • apt 是一个在 UbuntuDebian 以及其他 Debian 衍生发行版上使用的强大的命令行工具,用于软件包的管理。

  • APT 是一个高级包管理工具,可以完成各种任务:

    • 新软件安装

    • 已安装包的升级

    • 更新软件包索引清单(本地软件仓库)

    • 甚至可以使用 apt 命令升级 Ubuntu 系统

3. 软件仓库和软件源

  • 前面说过,存储 ubuntu 软件包的在线服务器就是软件仓库;Ubuntu 会在本地磁盘中存放一个软件仓库中的软件包清单,这个清单又称为本地软件仓库;下面是一些软件仓库的地址:

    • http://cn.archive.ubuntu.com/ubuntu/

    • http://mirrors.aliyun.com/ubuntu/

    • https://mirrors.163.com/ubuntu/

  • 在一个 ubuntu 软件仓库中实际存储着各种版本的 ubuntu 发行版的软件包,还包括软件包的源代码;但是,我们实际正在使用的 ubuntu 其实只是其中的一个版本而已,而且大多数情况下我们也并不需要这些软件包的源代码,所以实际我们只是需要软件仓库中一部分的资源;在文件 /etc/apt/sources.list 中定义了我们需要软件仓库中的哪些资源,其中的每一行定义了一种资源,我们把每一个定义又称为软件源

  • 除了在 /etc/apt/sources.list 定义了软件源外,/etc/apt/sources.list.d 目录下的文件中也会定义一些第三方的软件源或者叫 PPA(Personal Package Archives)

4. apt update 是什么

  • apt update 命令从软件仓库获取最新版的所需的软件包清单信息,并以此更新本地软件仓库

    sudo apt update
    

apt-update-screen.png

图1:执行 apt update
  • 运行 apt update 需要使用 root 用户登录,或者有 sudo 权限

5. ubuntu 下执行 apt update 实际执行的操作

  • apt update 命令会从所有软件源中下载最新的软件包信息,包括软件包的名称、版本信息和依赖关系等,并更新本地软件仓库;

  • apt upgrade 这类的命令只会从本地软件仓库中获取信息,并不会直接从软件仓库中下载软件包信息,所以在更新软件前如果不更新本地软件仓库,有可能 apt upgrade 命令并不会把软件升级到最新版本。

  • 在执行 apt update 时,针对每个软件源,会首先从软件仓库中下载一个 InRelease 文件,并通过电子签名验证其正确性,该文件中包含有所有软件包索引文件的 hash 校验值

  • 然后 apt 会下载每一类软件包的软件包索引文件 Packages,下载前,apt 会首先检查本地软件仓库中是否存在准备下载的文件,如果有则检查其 Hash 校验值并和 InRelease 中给出的值做比较,如果一致则不再下载该文件,否则从软件仓库中下载该文件

  • 计算从软件仓库中下载文件的 hash 校验值,并使用 InRelease 文件中给出的该文件的 hash 校验值验证其正确性,使用经验证正确的文件更新本地软件仓库

  • InReleasePackages 和一些其它文件(比如国际版本用的 Translation 文件)组成了本地软件仓库

  • apt update 只会更新本地的软件包清单(本地软件仓库),并不会升级任何软件,所以,运行 apt update 是绝对安全的,不会对你现有系统和应用软件做任何修改;即便是执行 apt update 时意外中断也不会出现问题,只需要再次执行即可

  • ubuntu 系统中,本地软件清单(本地软件仓库)存放在 /var/lib/apt/lists 这个目录下,实际上,如果你删除这个目录下的所有文件(也就是清空了本地软件仓库),运行 apt update 后会重建你的本地软件仓库

6. 执行 apt update 时 Hit、Ign、Err和Get分别代表什么

  • 执行 apt update 更新本地软件仓库时,在终端上显示的信息中,每行的开头会有一个关键字(参见图1),它们的含义如下:

    1. Hit(命中):

      apt 发现某个 Packages 文件(软件清单索引文件)的 Hash 校验值与最新的 InRelease 文件中给出的 Hash 校验值一致,所以无需再下载

    2. Ign(忽略):

      apt 在下载一个文件时出错,但是,这个文件并不重要,所以这个错误被忽略掉,apt 会继续下一个动作

    3. Err(错误):

      apt 在下载一个文件时发现了一个严重错误,无法再继续执行命令,比如在验证 InRelease 文件的电子签名时找不到所需的公钥时就会出现这个错误

    4. Get(获取):

      apt 已经从软件仓库下载了一个正确的软件包索引文件,并且更新了本地软件仓库

7. 结语

  • Ubuntu 上的 apt update 命令会从软件仓库上更新本地软件仓库,本文描述了其基本过程

  • apt update 仅会更新本地的软件包索引文件(本地软件仓库),不会实际更新或升级任何软件,运行是安全的

  • apt update 会保证本地软件仓库为最新版,所以在准备更新软件前先运行 apt update 是非常必要的

  • apt update 的运行依赖在 Ubuntu 上配置的软件源文件 /etc/apt/sources.list

  • 本地软件仓库存放在 Ubuntu 上的 /var/lib/apt/lists/ 目录下。


email: hengch@163.com

donation

297 views

More from this blog

双向链表及如何使用GLib的GList实现双向链表

双向链表是一种比单向链表更为灵活的数据结构,与单向链表相比可以有更多的应用场景,本文讨论双向链表的基本概念及实现方法,并着重介绍使用GLib的GList实现单向链表的方法及步骤,本文给出了多个实际范例源代码,旨在帮助学习基于GLib编程的读者较快地掌握GList的使用方法,本文程序在 ubuntu 20.04 下编译测试完成,gcc 版本号 9.4.0;本文适合初学者阅读。 1 双向链表及其实现 在文章《单向链表以及如何使用GLib中的GSList实现单向链表》中,介绍了单向链表以及基于 G...

Oct 29, 20245 min read24
双向链表及如何使用GLib的GList实现双向链表

C程序员应该知道的最好的8个c编程框架

C 编程框架是开发人员必不可少的工具,编程框架可以为构建强大且性能优异的应用程序提供结构化的基础,本文将对 8 个最佳 C 编程框架和库做出简要的介绍,如果您正在寻找适合初学者的 C 编程框架或旨在进行 C 编程框架比较,相信本文可以给您一定的帮助。 顶级 C 编程框架 – 概述 本文将介绍以下 8 个 C 语言编程框架: 序号框架名称主要特点易于集成下载链接 1GTK全面的小部件集,跨平台支持中等的下载 2Qt跨平台支持,集成开发环境中等的下载 3CMocka轻量级,模...

Oct 19, 20244 min read36
C程序员应该知道的最好的8个c编程框架

单向链表以及如何使用GLib中的GSList实现单向链表

单向链表是一种基础的数据结构,也是一种简单而灵活的数据结构,本文讨论单向链表的基本概念及实现方法,并着重介绍使用GLib的GSList实现单向链表的方法及步骤,本文给出了多个实际范例源代码,旨在帮助学习基于GLib编程的读者较快地掌握GSList的使用方法,本文程序在 ubuntu 20.04 下编译测试完成,gcc 版本号 9.4.0;本文适合初学者阅读。 1 单向链表及其实现 在文章《使用GLib进行C语言编程的实例》中,简单介绍了 GLib,建议阅读本文前先阅读这篇文章; 单向链表是一...

Aug 19, 20246 min read23
单向链表以及如何使用GLib中的GSList实现单向链表

使用GLib进行C语言编程的实例

本文将讨论使用GLib进行编程的基本步骤,GLib是一个跨平台的,用C语言编写的3个底层库(以前是5个)的集合,GLib提供了多种高级的数据结构,如内存块、双向和单向链表、哈希表等,GLib还实现了线程相关的函数、多线程编程以及相关的工具,例如原始变量访问、互斥锁、异步队列等,GLib主要由GNOME开发;本文是使用GLib编程的入门文章,旨在通过实例帮助希望学习GLib编程的读者较快地入门,本文将给出多个使用GLib库编程范例的源代码,本文程序在 ubuntu 20.04 下编译测试完成,gc...

Aug 9, 20245 min read9
使用GLib进行C语言编程的实例

Linux下使用libiw进行无线信号扫描的实例

打开电脑连接wifi是一件很平常的事情,但这些事情通常都是操作系统下的wifi管理程序替我们完成的,如何在程序中扫描wifi信号其实资料并不多,前面已经有两篇文章介绍了如何使用ioctl()扫描wifi信号,但其实在Linux下有一个简单的库对这些ioctl()的操作进行了封装,这个库就是libiw,使用libiw可以简化编程,本文介绍了如果使用libiw对wifi信号进行扫描的基本方法,本文将给出完整的源代码,本文程序在 ubuntu 20.04 下编译测试完成,gcc 版本号 9.4.0;尽...

Jul 4, 20244 min read21
Linux下使用libiw进行无线信号扫描的实例

whowin - 开源和分享是技术发展的源泉和动力

42 posts

一个从业30多年的退休程序员,主要从事嵌入式软件开发。