本文简单介绍了在ubuntu的命令行下运行apt update时,软件包管理工具apt所执行的实际动作,相信此文会让你对ubuntu的包管理系统有更好的了解。
1. 导言
众所周知,Linux有很多的发行版,Ubuntu是其中之一,Ubuntu使用一个软件包管理系统apt对软件进行维护,这些软件包包括硬件驱动、Linux内核以及应用软件,所有这些软件包放在一个在线的服务器上,这个服务器被称作软件仓库,使用apt命令行工具,可以访问软件仓库、建立本地软件仓库,并管理这些软件。本文将讨论在ubuntu上执行apt update命令所执行的具体操作。
2. 什么是 APT
- apt是一个在Ubuntu、Debian以及其他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
图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校验值验证其正确性,使用经验证正确的文件更新本地软件仓库;
- InRelease、Packages和一些其它文件(比如国际版本用的Translation文件)组成了本地软件仓库;
- apt update只会更新本地的软件包清单(本地软件仓库),并不会升级任何软件,所以,运行apt update是绝对安全的,不会对你现有系统和应用软件做任何修改;即便是执行apt update时意外中断也不会出现问题,只需要再次执行即可;
- 在ubuntu系统中,本地软件清单(本地软件仓库)存放在/var/lib/apt/lists这个目录下,实际上,如果你删除这个目录下的所有文件(也就是清空了本地软件仓库),运行apt update后会重建你的本地软件仓库。
6. 执行apt update时Hit、Ign、Err和Get分别代表什么
- 执行apt update更新本地软件仓库时,在终端上显示的信息中,每行的开头会有一个关键字(参见图1),它们的含义如下:
- Hit(命中):
apt发现某个Packages文件(软件清单索引文件)的Hash校验值与最新的InRelease文件中给出的Hash校验值一致,所以无需再下载; - Ign(忽略):
apt在下载一个文件时出错,但是,这个文件并不重要,所以这个错误被忽略掉,apt会继续下一个动作; - Err(错误):
apt在下载一个文件时发现了一个严重错误,无法再继续执行命令,比如在验证InRelease文件的电子签名时找不到所需的公钥时就会出现这个错误; - Get(获取):
apt已经从软件仓库下载了一个正确的软件包索引文件,并且更新了本地软件仓库。
7. 结语
- Ubuntu上的apt update命令会从软件仓库上更新本地软件仓库,本文描述了其基本过程;
- apt update仅会更新本地的软件包索引文件(本地软件仓库),不会实际更新或升级任何软件,运行是安全的;
- apt update会保证本地软件仓库为最新版,所以在准备更新软件前先运行apt update是非常必要的;
- apt update的运行依赖在Ubuntu上配置的软件源文件/etc/apt/sources.list
- 本地软件仓库存放在Ubuntu上的/var/lib/apt/lists/目录下。
(欢迎访问我的博客:https://whowin.gitee.io)