当前位置: 首页 > ds >正文

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)。
这样包管理器(aptdnfpacman 等)就能自动安装、卸载、升级,并处理依赖关系。

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/<包名>/

    • READMELICENSEchangelog.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

  • 依赖声明:要求系统有 libc6openssl

4. 小总结

一个软件包的组成部分大致可以归为 三大类

  1. 软件运行需要的内容:程序文件、库、配置、数据。

  2. 用户/开发者参考信息:文档、帮助、许可证。

  3. 包管理系统需要的内容:依赖关系、版本号、维护者信息、服务脚本。




二、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 软件包全名

http://www.xdnf.cn/news/19568.html

相关文章:

  • 十分钟快速掌握 YML YAML 文件
  • 07.《交换机三层功能、单臂路由与端口安全基础知识》
  • 在Linux环境安装Maven(保姆级别)
  • leetcode 面试题 01.01.判定字符是否唯一
  • 【高级】系统架构师 | 信息系统基础
  • 基于Seurat的空转单样本数据分析流程学习(一)
  • JavaScript中的XMLHttpRequest对象分析
  • 基于单片机智能保温杯/智能水杯
  • Java基础第7天总结(代码块、内部类、函数式编程)
  • 【多模态】使用LLM生成html图表
  • 打开多个Excel文件后快速关闭所有的文档,并且退出Excel应用
  • s[:] = reversed(s) 和 s = reversed(s)的区别
  • 【Proteus仿真】点亮小灯系列仿真——小灯闪烁/流水灯/交通灯
  • R3:适用于 .NET 的新一代响应式扩展库,事件订阅流
  • TFS-2002《Fuzzy Clustering With Viewpoints》
  • 嵌入式ARM程序高级调试技能:19.qumu arm elf无法生成coredump
  • 接口测试:如何定位BUG的产生原因
  • nginx-增加VTS模块
  • 数据结构八股
  • 数据结构(C语言篇):(八)栈
  • vscode+EIDE+Clangd环境导入keil C51以及MDK工程
  • shell脚本第六阶段---三剑客之sed
  • C++日志系统:高效异步日志实现解析
  • LeetCode 36. 有效的数独 - 解题思路与实现详解
  • ans.1中的对象标识符OBJECT_IDENTIFIER----OID
  • 【机器学习基础】决策树算法原理及其在无人驾驶技术中的应用
  • Matplotlib:让数据在Python中跳舞的魔法画笔![特殊字符]
  • 基于FPGA的正弦波和及滤波(已通过仿真和上板)
  • 如何确定虚拟机的IP
  • DVWA靶场通关笔记-SQL Injection (Impossible级别)