Skip to content

LV100-软件包管理

一、软件包

1. 流行的两种软件包管理机制

Debian Linux 首先提出“软件包”的管理机制—— Deb 软件包 。就是将应用程序的二进制文件、配置文档、 man/info 帮助页面等文件合并打包在一个文件中,用户使用软件包管理器直接操作软件包,完成获取、安装、卸载、查询等操作。

Redhat Linux 基于这个理念推出了自己的软件包管理机制—— Rpm 软件包 。

随着 Linux 操作系统规模的不断扩大,系统中软件包间复杂的依赖关系,导致 Linux 用户麻烦不断。所以 Debian Linux 开发出了 APT 软件包管理器 。它可以 检查和修复软件包依赖关系,利用 Internet 网络帮助用户 主动获取软件包。 APT 工具再次促进了 Deb 软件包更为广泛地使用,成为 Debian Linux 的一个无法替代的亮点。

2. 软件包的类型

大概有两种类型,如下表所示:

类型说明
二进制软件包( Binary Packages )它包含可执行文件、库文件、配置文件、 man/info 页面、版权声明和其它文档。
源码包( Source Packages )包含软件源代码、版本修改说明、构建指令以及编译工具等。先由 tar 工具归档为 .tar.gz 文件,然后再打包成 .dsc 文件。

3. 软件包的命名

一般命名格式如下:

shell
Filename_Version-Reversion_Architecture.deb

参数说明

Filename 软件包名称
Version 软件版本
Reversion 修订版本
Architecture 体系架构
例如: image-20220124184915131

二、包管理工具

常见的软件包管理工具有以下三类:

类别 软件包名称 描述
命令行 dpkg-deb
dpkg
apt
在命令行模式下完成软件包管理任务。为完成软件包的获取、查询、软件包依赖性检查、安装、卸载等任务,需要使用各自不同的命令
文本窗口界面 dselect
aptitude
tasksel
在文本窗口模式中,使用窗口和菜单可以完成软件包管理任务
图形界面 synaptic 在 X-Window 图形桌面环境中运行,具有更好的交互性、可读性、易用性等特点

1. dpkg 工具

常用的一些命令如下:

shell
dpkg -i <.deb file_name> # 安装一个在本地文件系统上存在的 Debian 软件包
dpkg -L <package>  # 列出与该包相关联的文件,也可以查看安装包的安装位置 
dpkg -r <package>  # 移除已经安装的软件包,但是保留配置文件
dpkg -P <package>  # 移除已安装的软件包,同时移除配置文件
dpkg -s <package>  # 显出软件包的安装状态, 包含包的详细信息
dpkg -c <package>  # 查看软件包的内容
dpkg -l            # 列出当前系统中已经安装的软件以及软件包的状态

2. APT 管理工具

2.1 apt 是什么?

Advanced Packaging Tool(apt)是 Linux 下的一款安装包管理工具,是一个客户/服务器系统。常用于在 Ubuntu、Debian 和相关 Linux 发行版上安装、更新、删除和管理 deb 软件包。

2.2 工作原理

在 Ubuntu 系统中,使用软件源配置文件 /etc/apt/sources.list 列出最合适访问的镜像站点地址。软件源配置文件只是告知 Ubuntu 系统可以访问的镜像站点地址。但那些镜像站点都拥有什么软件资源并不清楚。若是每安装一个软件包,就在服务器上寻找一边,效率是很低的。因而,就有必要为这些软件资源列个清单(建立索引文件),以便本地主机查询。

  • 软件源

根据软件包的开发组织对该软件的支持程度,以及遵从的开源程度,划分为四类:

核心(Main) 官方维护的开源软件,是由 Ubuntu 官方完全支持的软件,包括大多数流行的、稳定的开源软件,是 Ubuntu 默认安装的基本软件包
公共(Universe) 社区维护的开源软件,是由 Ubuntu 社区的计算机爱好者维护的软件。这些软件包没有安全升级的保障。用户在使用时,需要考虑这些软件包存在的不稳定性
受限(Restricted) 官方维护的非开源软件,是专供特殊用途,而且没有自由软件版权,不能直接修改软件,但依然被 Ubuntu 团队支持的软件
多元化(Multiverse) 非 Ubuntu 官方维护的非开源软件,用户使用这些软件包时,需要特别注意版权问题
- 软件源配置文件 /etc/apt/sources.list

/etc/apt/sources.list 本质就是一个普通的文本文件,可以在超级管理员授权下,使用任何文本编辑器进行编辑。在该文件中,添加的软件源镜像站点称为一个配置项,并遵循以下格式:

shell
DebType  AddressType://Hostaddress/Ubuntu  Distribution  Component1  Component2……
# 例如
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted
  • 软件包存储位置 /var/cache/apt/archives

/var/cache/apt/archives 中主要 apt-get 命令下载的 deb 软件包;另有一个文件 lock ,随 apt-get 启动而建立,随 apt-get 退出而删除,用以保证同一时间只有一个 apt-get 进程;还有一个文件夹 partial ,用以存放正在下载的软件包(下载完成后会被移动到上一级文件夹)。

  • 刷新软件源

修改了配置文件—— /etc/apt/sources.list ,只是告知软件源镜像站点的地址。但那些所指向的镜像站点所具有的软件资源并不清楚,需要将这些资源列个清单,以便本地主机知晓可以申请哪些资源。此时使用使用 apt-get update 命令扫描每一个软件源服务器,并为该服务器所具有软件包资源建立索引文件,存放在本地的 /var/lib/apt/lists/ 目录中。

3. apt 相关命令

3.1 命令格式

在 Ubuntu Linux 中,通常使用 apt-get 命令管理软件包,只需告知软件包名字,就可以自动完成软件包的获取、安装、编译和卸载,以及检查软件包依赖关系。 也经常通过 apt-cache 来查询软件包相关信息。要注意的是大多数的情况需要给管理员权限即要加上 sudo 。

3.1.1 apt-get
shell
sudo apt-get subcommands [option] pkg

参数说明如下:

subcommands update 下载更新软件包列表信息
upgrade 将系统中所有软件包升级到最新的版本
install 下载所需软件包并进行安装配置
remove 卸载软件包
autoremove 将不满足依赖关系的软件包自动卸载
source 下载源码包
build-dep 为源码包构建所需的编译环境
dist-upgrade 发布版升级
dselect-upgrade 根据 dselect 的选择来进行软件包升级
clean 删除缓存区中所有已下载的包文件
autoclean 删除缓存区中老版本的己下载的包文件
check 检查系统中依赖关系的完整性
option -d 仅下载软件包,而不安装或解压
-f 修复系统中存在的软件包依赖性问题
-m 当发现缺少关联软件包时,仍试图继续执行
-q 将输出作为日志保留,不获取命令执行进度
--purge 与 remove 子命令一起使用,完全卸载软件包
-reinstall 与 install 子命令一起使用,重新安装软件包
-b 在下载完源码包后,编译生成相应的软件包
-s 不做实际操作,只是模拟命令执行结果
-y 对所有询问都作肯定的回答,apt-get 不再进行任何提示
-u 获取已升级的软件包列表
-h 获取帮助信息
-v 获取 apt-get 版本号
##### 3.1.2 apt-cache
shell
sudo apt-cache subcommands [option] pkg

参数说明如下:

subcommands showpkg 获取二进制软件包的常规描述信息
showsrc 获取源码包的详细描述信息
show 获取二进制软件包的详细描述信息
stats 获取软件源的基本统计信息
search 根据正则表达式检索软件包
depends 获取该软件包的依赖信息
rdepends 获取所有依赖于该软件包的软件包
pkgnames 列出所有已安装软件包的名字
policy 获取软件包当前的安装状态
option 有 [ -p | -s | - q | - i | - c | -h ] 等, 但是不怎么用,详情可查看手册(man apt-cache)

3.2 常用命令

在使用以下命令时,若提示没有权限,则可以在前边加上 sudo 。

shell
# 修复软件包依赖关系
# 如果由于故障而中断软件安装过程,可能会造成关联的软件包只有部分安装。之后,可能就会发现该软件既不能重装又不能删除,就可以使用以下两条命令。
apt-get check      # 检查软件包依赖关系,检查是否有损坏的依赖
apt-get -f install # 修复依赖关系

# 更新相关命令
apt-get upgrade      # 将系统中的所有软件包一次性升级到最新版本。
apt-get update       # 更新源
apt-get dist-upgrade # 升级系统

# 安装软件包 
apt-get install <package_name>  
# 当用户不小心损坏了已安装的软件包,而需要修复。或者,希望重新安装软件包中某些文件的最新版本,可以重新安装软件包。  
apt-get  --reinstall  install <soft_name>

apt-get source package         # 下载该包的源代码

# 卸载软件包
# 删除一个软件包时,将会连带删除与该软件包有依赖关系的软件包。 
apt-get remove <package_name>         # 不完全卸载
apt-get --purge remove <package_name> # 包括配置文件

# 清理软件包缓冲区
apt-get clean     # 删除全部下载的软件包
apt-get autoclean # 如果希望缓冲区中只保留最新版本的软件包,多余版本全部清除,可使用该命令
apt-get clean && apt-get autoclean # 清理无用的包
apt-get build-dep package          # 安装相关的编译环境

# apt-cache 相关命令
apt-cache show             # 获取包的相关信息,如说明、大小、版本等
apt-cache policy           # 获取软件包安装状态 
apt-cache search package   # 搜索软件包
apt-cache depends package  # 了解使用该包依赖那些包
apt-cache rdepends package # 查看该包被哪些包依赖

4. 更换软件源

4.1 为什么要更换软件源

  • 下载速度:默认软件源可能位于国外,导致下载速度缓慢。更换为国内镜像站点可以显著提高下载速度。

  • 网络稳定性:某些镜像站点可能在网络连接方面更加稳定,减少下载失败的情况。

  • 软件包更新及时性:一些镜像站点会更及时地同步软件包更新,确保获取最新版本。

  • 本地化服务:国内镜像站点通常提供更好的本地化支持和服务。

4.2 软件源格式

软件源文件一般位于 /etc/apt/sources.list,下面是一个清华源的示例:

text
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble-backports main restricted universe multiverse

# 以下安全更新软件源包含了官方源与镜像站配置,如有需要可自行修改注释切换
deb http://security.ubuntu.com/ubuntu/ noble-security main restricted universe multiverse
# deb-src http://security.ubuntu.com/ubuntu/ noble-security main restricted universe multiverse

# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble-proposed main restricted universe multiverse
# # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble-proposed main restricted universe multiverse

前面有提到软件源文件的格式:

text
deb [选项] <仓库地址> <发行版> <组件1> <组件2> ...

各部分说明如下:

组成部分示例含义
debdeb / deb-srcdeb = 二进制包仓库,deb-src = 源码包仓库
仓库地址https://mirrors.tuna.tsinghua.edu.cn/ubuntu/软件包来源的 URL
发行版noble, noble-updates, noble-backportsUbuntu 版本代号
组件main restricted universe multiverse软件包分类
4.2.1 仓库地址

这个就是软件包来源的地址,常用的一些就是:

text
http://archive.ubuntu.com/ubuntu/              # ubuntu默认的软件源 
https://mirrors.tuna.tsinghua.edu.cn/ubuntu/   # 清华源 tuna
https://mirrors.ustc.edu.cn/ubuntu/            # 中科大 ustc
https://mirrors.aliyun.com/ubuntu/             # 阿里 aliyun
https://mirrors.cloud.tencent.com/ubuntu/      # 腾讯 tencent
4.2.2 发行版

这个是 Ubuntu 的版本代号,Ubuntu 采用 "形容词 + 动物" 的组合作为版本代号,这个传统从 Ubuntu 6.06 (Dapper Drake) 开始。

  • 数字编号:表示发布的"年份.月份",如 24.04 = 2024年4月发布
  • 代号名称:开发阶段的代号,发布后保留作为别名

我们可以通过lsb_release -c命令直接查看版本代号名称,也可以直接从cat /etc/os-release中查找。这里的noble 就是ubuntu的24.04版本:

版本代号说明
nobleUbuntu 24.04 (Noble Numbat) 版本
noble-updates发布后的累积更新/补丁
noble-backports较旧软件包的新版本(测试用)
noble-security安全更新补丁(使用官方源)

Tips:需要注意,如果版本名不匹配,可能会导致软件包无法正确安装或更新。

4.2.3 组件

组件前面已经提到过了,这里回顾一下:

  • main - 自由开源软件,受官方支持
  • restricted - 专有驱动/硬件支持
  • community 维护的非官方软件
  • multiverse - 闭源/商业软件

4.3 如何更换软件源

方法一:手动编辑 sources.list 文件
  • 备份原配置文件:
shell
sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup
  • 编辑 sources.list 文件:
shell
sudo nano /etc/apt/sources.list
  • 替换文件内容为新的软件源地址,保存并退出。

  • 更新软件源列表:

shell
sudo apt-get update
方法二:使用脚本一键更换

可以使用一些脚本来一键更换软件源,例如:

shell
# 更换为阿里云镜像
sudo sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
sudo sed -i 's/security.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
sudo apt-get update