linux系统学习(6.软件包管理)
目录
一、概述
1.分类
2.命名方式
3.一个软件包的组成
1. 软件包的基本定义
2. 一个软件包通常包含的部分
① 程序文件
② 库文件
③ 配置文件
④ 数据文件 / 资源文件
⑤ 文档 / 帮助信息
⑥ 服务脚本 / 单元文件(如果是服务型软件)
⑦ 包的元数据(非常重要)
3. 举个例子(以 Ubuntu 的 nginx 包为例)
4. 小总结
二、apt选包流程
2. 多个仓库都有同一个包时,如何选择?
(1) 包的版本号(Version)
(2) 软件源的优先级(Pin-Priority)
(3) 已安装包的来源
三、常用指令
📌 APT 常用指令(Ubuntu 20.04 适用)
1. 更新软件包索引
2. 升级系统
3. 搜索/查询
4. 安装/卸载
5. 清理
6. 修复相关
一、概述
1.分类
ubuntu系统中,安装软件包可以是源码安装,dpkg安装,apt安装。源码安装一般有个配置文件,设置安装路径啥的,dpkg包就是直接对.deb包进行解压安装,apt包底层和dpkg一样。但是它有包管理系统,可以自动处理依赖和管理包,所以他还需要软件仓库。
2.命名方式
3.一个软件包的组成
1. 软件包的基本定义
在 Linux 中,一个 软件包(package) 就是把某个软件运行所需要的 文件 + 元数据 打包成一个统一的格式(比如
.deb
或.rpm
)。
这样包管理器(apt
、dnf
、pacman
等)就能自动安装、卸载、升级,并处理依赖关系。2. 一个软件包通常包含的部分
① 程序文件
可执行文件(bin 文件),真正的应用逻辑。
例:/usr/bin/vim
、/usr/sbin/sshd
② 库文件
软件依赖的共享库或静态库。
例:/usr/lib/x86_64-linux-gnu/libsomething.so
③ 配置文件
用来调整软件行为,通常放在
/etc
下。
例:/etc/ssh/sshd_config
④ 数据文件 / 资源文件
程序运行需要的静态数据,如图标、文档、语言文件。
例:/usr/share/icons/
、/usr/share/locale/
⑤ 文档 / 帮助信息
软件说明、许可协议、帮助文档。
例:/usr/share/doc/<包名>/
README
、LICENSE
、changelog.gz
等⑥ 服务脚本 / 单元文件(如果是服务型软件)
用来告诉系统如何启动、停止服务。
在
systemd
下是 unit 文件:/lib/systemd/system/xxx.service
在 SysV init 下是
/etc/init.d/xxx
⑦ 包的元数据(非常重要)
这些不会装进最终系统目录,但包管理器会读:
包名、版本号
依赖关系(Depends, Recommends, Suggests, Conflicts)
维护者信息、描述
例子(Debian 包用
dpkg-deb -I xxx.deb
可以看到):
Package: vim Version: 2:8.1.2269-1ubuntu5 Depends: libc6 (>= 2.29), libgpm2 (>= 1.20.7), ... Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> Description: Vi IMproved - enhanced vi editor
3. 举个例子(以 Ubuntu 的
nginx
包为例)安装
nginx
后,会有:
可执行文件:
/usr/sbin/nginx
配置文件:
/etc/nginx/nginx.conf
日志目录:
/var/log/nginx/
文档:
/usr/share/doc/nginx/
systemd 服务单元:
/lib/systemd/system/nginx.service
依赖声明:要求系统有
libc6
、openssl
等4. 小总结
一个软件包的组成部分大致可以归为 三大类:
软件运行需要的内容:程序文件、库、配置、数据。
用户/开发者参考信息:文档、帮助、许可证。
包管理系统需要的内容:依赖关系、版本号、维护者信息、服务脚本。
二、apt选包流程
1.apt软件仓库
-
Ubuntu 的软件包来源配置文件主要在:
-
/etc/apt/sources.list
-
/etc/apt/sources.list.d/*.list
-
-
每一行定义一个仓库(Repository),APT 会把它们全部纳入候选源。
2. 多个仓库都有同一个包时,如何选择?
APT 有一套 优先级规则(pinning system)来决定用哪个仓库的包。主要考虑因素:
(1) 包的版本号(Version)
-
默认情况下,APT 会优先选择最高版本号的包。
-
例如:
-
仓库 A 有
nginx 1.18.0
-
仓库 B 有
nginx 1.22.0
→ 默认选择 1.22.0。
-
(2) 软件源的优先级(Pin-Priority)
-
配置在
/etc/apt/preferences
或/etc/apt/preferences.d/*.pref
-
你可以给某个源设置优先级(Pin-Priority),APT 会参考它来选择。
常见规则:-
Pin-Priority > 1000
→ 强制使用这个源,即使版本更低也会降级。 -
990 ~ 1000
→ 默认优先使用这个源(如果版本号相同/更高)。 -
500
→ 普通优先级。 -
<100
→ 永远不装,只能手动指定。
-
(3) 已安装包的来源
-
如果某个包已经安装,APT 通常会默认继续从原来的仓库升级,除非有更高版本或 pinning 规则覆盖。
3.选包流程
[开始: apt install <包名>]|v[APT 检查所有仓库的索引缓存]|+--------+---------+| |v v
[没有找到] [找到候选包]报错: |Unable to locate vpackage [有多个仓库?]|+--------+--------+| |v v[只有一个仓库有包] [多个仓库都有包]| |v v[直接选它作为候选] [比较版本号 -> 选择最高版本]|v[检查 Pin-Priority (优先级规则)]|+----------------+----------------+| |v v[优先级更高的仓库覆盖] [保持默认最高版本]| |+----------------+----------------+|v[确定候选版本 Candidate]|v[下载并安装该版本的 .deb 包]|v[结束]
每个软件仓库对于某个包都有依赖关系,选择哪一个软件仓库依赖关系肯定也就按照这个仓库的依赖关系处理了。
三、常用指令
📌 APT 常用指令(Ubuntu 20.04 适用)
1. 更新软件包索引
sudo apt update
从配置的所有软件仓库下载最新的 索引信息(软件列表 + 版本号),存放在
/var/lib/apt/lists/
。不会升级软件,只是“刷新一下 apt 的数据库”。
2. 升级系统
sudo apt upgrade
安装所有“已安装软件”的最新版本。
如果新版本需要安装/删除额外包 → 会跳过。
sudo apt full-upgrade
和
upgrade
的区别是:允许删除旧包、安装新依赖,以完成升级。在以前叫
dist-upgrade
。
3. 搜索/查询
apt search <关键字>
搜索包名和描述。
apt show <包名>
查看软件包详细信息(版本、依赖、维护者、描述)。
apt list --installed
列出已安装的软件包。
apt list --upgradable
列出可以升级的软件包。
4. 安装/卸载
sudo apt install <包名>
安装指定软件包,自动解决依赖。
sudo apt install <包名>=<版本号>
安装指定版本的软件包。
sudo apt remove <包名>
卸载软件,但保留配置文件(/etc 下可能还在)。
sudo apt purge <包名>
卸载软件 并删除配置文件。
5. 清理
sudo apt autoremove
自动删除那些“不再被需要的依赖包”。
sudo apt clean
清理
/var/cache/apt/archives/
下所有.deb
包缓存。
sudo apt autoclean
清理过时的(本地已无用)缓存包。
6. 修复相关
sudo apt --fix-broken install
修复依赖问题(半安装状态)。
# v 表示显示安装详细信息
dpkg -iv 软件包全名