Debian 软件包管理

基础软件包管理知识

Debian 档案库

  • Debian 官方建立一致的软件包并从档案库中分发它们
  • 提供 HTTP 和 FTP 的方式来访问 Debian 档案库
  • 全世界都有 Debian 档案库的 镜像站,可以理解为 Debian 档案库的备份

软件包管理工具

  • 可以让用户从档案库安装 统一设置 的二进制软件包到系统中

  • 目前 Debian 的软件包管理系统是 高级软件包工具 APT

    • apt: 用于所有的 交互式命令行 操作
    • apt-get: 主要用于 脚本调用,在 apt 不可用时可作为备用选项
    • aptitude: 交互式的文本界面 来管理已安装的软件包和搜索可用的软件包
  • APT 前端用户程序和后端的不同访问方式

    • dpkg: 底层 软件包管理系统
    • apt: 命令行 管理软件包的 APT 前端 apt, apt-get, apt-cache
    • aptitude: 全屏控制台 交互式管理 软件包的 APT 前端,可以管理软件包的多个版本
    • gnome-software: GNOME 图形化的 APT 前端
    • synaptic: GTK 图形化的 APT 前端
  • APT 辅助工具

    • apt-utils: APT 实用程序 apt-extracttemplates, apt-ftparchive, apt-sortpkgs
    • apt-file: 软件包搜索工具
    • apt-cache: 提供了标准的正则表达式来搜索软件包名称和描述
    • apt-rdepends: 查询软件包依赖
    • apt-listchanges: 软件包历史更改提醒工具
    • apt-listbugs: 在 APT 安装前列出严重的 bug
    • unattended-upgrades: 用于 APT 的增强软件包,会自动安装安全更新
  • apt-get 和 apt-cache 是最基础的基于 APT 的软件包管理工具,意味快但功能不丰富

  • apt-get 和 apt-cache 可以使用 /etc/apt/preferences 来管理软件包的多个版本,但这非常繁琐

  • 在成功安装下载的软件包后,apt 将默认删除缓存的 .deb 软件包

sources.list 文件格式

对于典型的 HTTP 访问,档案库在 /etc/apt/sources.list 文件

# 源的信息组成 deb/deb-src URL 	stable/testing/unstable [area ...]
deb http://deb.debian.org/debian/ bullseye main contrib non-free
deb-src http://deb.debian.org/debian/ bullseye main contrib non-free
  • 一行一条

  • 第一个参数

    • deb 表示二进制软件包
    • deb-src 表示源代码软件包,非必要,不使用可以加速档案库元数据的更新
  • 第二个参数 Debian 档案库 的根 URL

    • URL 可以是 "http://", "ftp://", "file://", ...
  • 第三个参数是发行版名称,这个一般需要查看一下

    • stable: 稳定版,不用说一般都是使用这个,用于你的生产服务器
    • testing: 测试版,它是自动滚动发布的,由 Debian 档案库的 QA 质量架构来管理,更新得足够频繁来提供全部最新的特性
    • unstable: 不稳定版,不推荐的使用,仅对开发者调试软件包合适
  • 后面全部参数是 Debian 档案库的有效档案库范围名称

    • main: 遵从 Debian 自由软件指导方针(DFSG),并且不依赖于 non-free
    • contrib: 遵从 Debian 自由软件指导方针(DFSG),但依赖于 non-free
    • non-free: 不遵从 Debian 自由软件指导方针(DFSG)

    自由软件

    • Debian 默认只安装自由软件
    • Debian 建议只运行来自 main 的自由软件

下面是一个小脚本可以帮助你添加 第三方档案库,前提是你的默认 /etc/apt/sources.list 没有被破坏并且会 Linux 的 CLI 界面的基本操作,此脚本是根据默认的 sources.list 创建,当然你可以不用脚本用手动编辑 φ(゜▽゜*)♪

  • 第一步,在命令行执行以下内容

    # 创建一个文件夹 test 名称随意
    mkdir test # 创建脚本,可以使用 vi, vim, ... 编辑,建议不会对应编辑器可以查询一下用法
    vi apt-sources.sh
  • 第二步,编辑 apt-sources.sh 脚本,注意:在进入 vi 编辑模式后 小心 每个操作,如果 不确定有问题,可以按 ESC 进入命令模式再按 u 撤销

    • 按照 i 输入下面内容,只要按 i 就可以进入编辑模式

      #!/bin/bash
      
      if [ -r $1 ]; then
      while read -r url; do
      filename=${url#*.}
      grep "^deb.*" /etc/apt/sources.list | sed -E "s~http.*\.[[:lower:]]{2,5}~$url~" > /etc/apt/sources.list.d/${filename%%.*}.list
      done < "$1"
      apt update
      else
      echo "文件不存在或无法权限读取"
      fi
    • 输入完上面内容,按 Esc 进入命令模式,按 :wq 保存退出 vi 编辑器,如果有问题按照上面警告可以撤销操作按 :q! 退出 vi

    • 注:读不懂脚本,可以在 此处 了解 shell 脚本的基本知识

  • 第三步,编辑第三方档案库信息,vi sources.txt 像第二步一样输入下面内容,当然你可以添加其他你知道的 第三方档案库信息,注意一条地址一行

    http://mirrors.ustc.edu.cn
    https://mirrors.aliyun.com
  • 第四步,执行脚本

    # 赋予脚本执行权
    chmod +x apt-sources.sh # 执行脚本
    sudo ./apt-sources.sh sources.txt # 查看添加是否成功
    cd /etc/apt/sources.list.d/ && ls -lh
    • 使用时部分命令可能执行不了,建议查看权限,可以使用 sudo 进行临时提权,关于 sudo 信息

说明:

  • 如果需要对 档案库的有效档案库范围 变更可以在 /etc/apt/sources.list.d/ 目录中找到不同第三方档案库进行调整
  • /etc/apt/sources.list.d/ 目录中最好一个档案库一个文件
  • 注意 /etc/apt/sources.list.d/ 是官方为我们准备的不是脚本创建的
  • 此脚本的作用:根据默认的 /etc/apt/sources.list 为模板,将每条 sources.txt 中的档案库地址于默认的进行替换,并一个档案库创建一个 .list 文件存放在 /etc/apt/sources.list.d/ 目录中

网上直接复制的源一般存在以下问题

  • 协议问题,一般是 HTTP 协议,部分对 HTTPS 协议不友好需要安装 apt-transport-httpsca-certificates 的支持

  • 发行版号不匹配,这个建议查看自己当前系统 uname -a 然后在官网查看,或看看 /etc/apt/sources.list 默认的内容,所以一般别改 /etc/apt/sources.list

  • deb-src 一般含义此行需要下载大量源码信息,一些不必的可以注释掉,不一定每个仓库需要拉取

  • GPG error 问题,这个一般是版本问题或安装时是离线安装,导致发行版的元数据文件 Release 不同步出现 GPG 验证错误,或者离线安装没有网络在安装时 apt 自动配置根据 CD/DVD 的数据配置等可能,建议了解 GPG

    解决方法是添加上对应的签名即可,两种方法,都需要 wget 这个一般有自带,解决时的两种关于签名的文件 .asc.gpg

    • 直接使用 gpg 程序

      • 确认 gpg 是否安装,没有就安装一下

        sudo apt-get install gpg
      • 得到 .gpg 文件,具体名字随便,建议有辨识度,比如阿里云记为 aliyun.gpg

        # 根据对应档案库的 Release.gpg 文件下载
        wget -qO- https://mirrors.aliyun.com/debian/dists/buster/Release.gpg?spm=a2c6h.25603864.0.0.25864a07v5Lsgz > aliyun.gpg # 如果是 .asc 文件,使用 gpg --dearmor 转化
        wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
      • 添加 .gpg 文件,两种方法

        # 方法一:安装 /etc/apt/keyrings/ 目录
        sudo install -D -o root -g root -m 644 aliyun.gpg /etc/apt/keyrings/aliyun.gpg # 方法二:安装 /etc/apt/trusted.gpg.d/ 目录
        sudo install -D -o root -g root -m 644 aliyun.gpg /etc/apt/trusted.gpg.d/aliyun.gpg

        方法一需要改变 list 文件,在 deb/deb-srcurl 之间添加一条信息 [arch=amd64,arm64,armhf signed-by=/etc/apt/keyrings/aliyun.gpg]

        # 这是 /etc/apt/sources.list.d/aliyun.list 文件,其中 ... 是简化的需要根据情况填写,参考默认的 /etc/apt/sources.list
        deb [arch=amd64,arm64,armhf signed-by=/etc/apt/keyrings/aliyun.gpg] https://mirrors.aliyun.com/debian ...
    • 使用 apt 默认的 apt-key

      使用非常方便,首先下载 .asc 或 .gpg 文件,然后使用 apt-key 安装

      # 下载
      wget https://archive.kali.org/archive-key.asc
      wget -qO- https://mirrors.aliyun.com/debian/dists/buster/Release.gpg?spm=a2c6h.25603864.0.0.25864a07v5Lsgz > aliyun.gpg # 安装
      sudo apt-key archive-key.asc
      sudo apt-key aliyun.gpg

    Release.gpg 文件在每个档案库都有的,比如阿里的访问 https://mirrors.aliyun.com/debian/dists/buster 就可以看到,.asc 文件也差不多在档案库中但位置不定,不同档案库可能不同需要自己查

新手建议

  • /etc/apt/sources.list 不要包含 testing 或 unstable

  • /etc/apt/sources.list 不要在标准的 Debian 中混合使用其它非 Debian 的档案库

  • 第三方档案库放在 /etc/apt/sources.list.d 分类以 .list 后缀结尾的文件中

  • 不要建立 /etc/apt/preferences

  • 不了解会造成的全部影响,就不要通过配置文件改变软件包管理工具的默认行为

  • 不要使用 dpkg -i random_packagedpkg --force-all -i random_package 安装任何软件包

  • 不要删除或修改 /var/lib/dpkg/ 中的文件

  • 不要让从源码直接安装的程序覆盖系统文件

  • 没有在安全的条件下使用你特定的配置进行彻底地测试,就不要从 Debian 安装任何软件包

  • 使用 non-free 和 contrib 中的软件包所需要冒的风险

    • 使用类似的软件包会失去自由
    • 失去 Debian 对软件包的支持,这些软件包无法访问源代码,Debian 不能进行完全的支持
    • 可能存在商业付费

档案库临时小故障

  • 损坏的软件包被上传到档案库,多见于 unstable
  • 延迟接受新的软件包到档案库,多见于 unstable
  • 档案库时间同步问题,在 testing 和 unstable
  • 手动干预档案库,多见于 testing

软件包依赖关系

Debian 系统通过其控制文件字段中的版本化二进制依赖声明机制

  • Depends: 绝对的依赖,所有在这里列出的软件包都必须同时或提前安装
  • Pre-Depends: 类似于 Depends,但列出的软件包必须提前完成安装
  • Recommends: 这里表示一个强,但不是绝对的依赖关系,大多数用户不会想要这个包除非在这里列出的所有包都已经安装
  • Suggests: 较弱的依赖,这个软件包的大多数用户可能会从安装所列的软件包中受益,但没有它们也可以有适当的功能
  • Enhances: 这里表明一个像建议的弱依赖关系,不装也没关系
  • Breaks: 表明一个软件包不兼容一些版本规范,一般的解决方法就是升级列出的所有软件包
  • Conflicts: 这表明了绝对的不兼容,为了安装这个软件包必须移除所有列出的软件包
  • Replaces: 这表明这个文件安装的文件会替代所列的软件包的文件
  • Provides: 表明这个软件包会提供所列的软件包所有的文件和功能

Conflicts, Replaces, Provides 定义到一个虚拟的软件包,确保了在任何一个时间只能安装一个提供该虚拟包的真正软件包


APT 进行软件包管理

基本操作

更新元数据: apt update, apt-get update, aptitude update

  • 从远程档案库获取档案库元数据
  • 重建并更新 APT 使用的本地元数据

安装软件: apt install ..., apt-get install ..., aptitude install ...

  • 选择命令行中列出的包
  • 解决软件包依赖关系
  • 从远程服务器获取已选二进制包
  • 解包所获取的二进制软件包
  • 运行 preinst 脚本
  • 安装二进制文件
  • 运行 postinst 脚本

升级软件: apt upgrade/full-upgrade, pt-get upgrade/dist-upgrade, aptitude safe-upgrade/full-upgrade

  • 选择候选版本,默认最新的可用版本,除非手动指定版本
  • 解决软件包依赖关系
  • 如果候选版本与已安装的版本不同,会从远程档案库获取所选择的二进制软件包
  • 解包所获取的二进制软件包
  • 运行 preinst 脚本
  • 安装二进制文件
  • 运行 postinst 脚本

移除软件: apt remove ..., apt-get remove ..., aptitude remove ...

  • 选择命令行中列出的包
  • 解决软件包依赖关系
  • 运行 prerm 脚本
  • 移除已安装的文件,除了 配置文件
  • 运行 postrm 脚本

清除软件: apt purge ..., apt-get purge ..., aptitude purge ...

  • 选择命令行中列出的包
  • 解决软件包依赖关系
  • 运行 prerm 脚本
  • 移除已安装的文件,包含 配置文件
  • 运行 postrm 脚本

软件包管理操作

  • apt 用于交互式命令行
  • aptitude 全屏的交互式文本用户界面
  • apt-get/apt-cache 基本工具,主要用于脚本
apt aptitude apt-get/apt-cache 描述
apt update aptitude update apt-get update 更新软件包档案库元数据
apt install foo aptitude install foo apt-get install foo 安装 foo 软件包的候选版本以及它的依赖
apt upgrade aptitude safe-upgrade apt-get upgrade 安装已安装的软件包的候选版本并且不移除任何其它的软件包
apt full-upgrade aptitude full-upgrade apt-get dist-upgrade 安装已安装的软件包的候选版本,并且需要的话会移除其它的软件包
apt remove foo aptitude remove foo apt-get remove foo 移除 foo 软件包,但留下配置文件
apt autoremove N/A apt-get autoremove 移除不再需要的自动安装的软件包
apt purge foo aptitude purge foo apt-get purge foo 清除 foo 软件包的配置文件
apt clean aptitude clean apt-get clean 完全清除本地仓库的软件包检索文件
apt autoclean aptitude autoclean apt-get autoclean 清除本地仓库中过时软件包的软件包检索文件
apt show foo aptitude show foo apt-cache show foo 显示 foo 软件包的详细信息
apt search regex aptitude search regex apt-cache search regex 搜索匹配 regex 的软件包
N/A aptitude why regex N/A 解释匹配 regex 的软件包必须被安装的原因
N/A aptitude why-not regex N/A 解释匹配 regex 的软件包不必安装的原因
N/A aptitude search '~i!~M' apt-mark showmanual 列出手动安装的软件包
  • 对于使用体验和功能性: aptitude > apt > apt-get/apt-cache
  • 对于自动化脚本: apt-get/apt-cache > apt > aptitude
  • apt 算得上是 apt-get, apt-cache, ... 类似命令的封装,针对终端用户交互的界面

注意:

  • 不建议在新版本发布后在 stable 的 Debian 系统上使用 aptitude 命令来进行跨版本的系统升级
  • aptitude 命令有时候会为了 testing 或 unstable 的 Debian 系统升级清除大量软件包
  • 建议用户使用 apt 命令用于 交互式 的使用场景,而在 shell 脚本 中使用 apt-get/apt-cache 命令
  • 对于它们更精细化或特殊选项的使用建议 man 查看

关于 GNU/Linux 的内容

Debian 软件包管理的更多相关文章

  1. kali中的APT软件包处理工具(apt-get)、Debian软件包管理器(dpkg)、源代码压缩和Nessus安装实用指南

    写在前面的话 能看懂此博客的朋友,深信你有一定的Kali基础了. 使用APT软件包处理工具(apt-get).Debian软件包管理器(dpkg)来维护.升级和安装自定义及第三方应用程序 APT软件包 ...

  2. debian下软件包管理方式总结

    linux最流行的包管理方式除了rpm之外就是debian的deb格式了.目前采用deb管理方式的主流操作系统主要有debian和ubuntu系列.和rpm包管理方式不同的是,虽然debian也有包含 ...

  3. Linux不同发型版本(Debian REHL)与软件包管理器(RPM dpkg)的概念

    Linux的发行版本可以大体分为两类: Linux发行版 = Linux内核(类Unix内核) + Linux软件管理(package manager) 一类是商业公司维护的发行版本,以著名的Red ...

  4. BZOJ 4196: [Noi2015]软件包管理器 [树链剖分 DFS序]

    4196: [Noi2015]软件包管理器 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1352  Solved: 780[Submit][Stat ...

  5. [BZOJ4196][NOI2015]软件包管理器

    4196: [Noi2015]软件包管理器 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1040  Solved: 603[Submit][Stat ...

  6. linux软件包管理(上)

    1.二进制包管理(RPM,yum) 2.源代码包的安装 3.脚本安装(shell或java) 4.Debian系列的linux软件包管理简介 在下载rmp包的时候注意检查硬件平台是否正确,如果硬件平台 ...

  7. BZOJ4196 软件包管理器

    Description Linux用户和OSX用户一定对软件包管理器不会陌生. 通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖 ...

  8. 【NOI2015】软件包管理器

    NOI难得的水题,话说还是T2诶……又学到了线段树的一种新的魔性使用 看sxysxy大神的代码才写出来的,sxysxy_orz 原题: Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包 ...

  9. Ubuntu 软件包管理详解

    原文转载自:http://www.cppblog.com/jb8164/archive/2009/01/09/71583.html Ubuntu 方便宜用,最值得让人称道的便是其安装软件的方式, 一条 ...

  10. BZOJ_4196_[NOI2015]_软件包管理器_(树链剖分)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=4196 给出一棵树,树上点权为0或1.u权值为1的条件是从根节点到u路径上的所有点权值都为1.u ...

随机推荐

  1. 1.httprunner3入门

    一.httprunner3 httprunner是一款面向HTTP(S)协议的通用开源测试框架 支持三种格式的用例:YAML/JSON/Pytest,httprunner3以前不支持pytest用例 ...

  2. Java多线程(4):ThreadLocal

    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来- 为了提高CPU的利用率,工程师们创造了多线程.但是线程们说:要有光!(为了减少线程创建(T1启动)和销毁(T3切换)的时间),于是工程师们又接着 ...

  3. Java多线程(5):CAS

    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来- 在JDK1.5之前,Java的多线程都是靠synchronized来保证同步的,这会引起很多性能问题,例如死锁.但随着Java的不断完善,JNI ...

  4. SQL--临时表的使用

    临时表的创建 临时表分为:本地临时表和全局临时表 通俗区分: 本地临时表:只能在当前查询页面使用,新开的查询是不能使用它的     #temp 全局临时表:不管开多少查询页面都可以使用  ##temp ...

  5. Linux系统文件与启动流程

    Linux系统文件与启动流程 /etc初始化系统重要文件 /etc/sysconfig/network-scripts/ifcfg-eth0:网卡配置文件 /etc/resolv.conf:Linux ...

  6. 三种梯度下降法的对比(BGD & SGD & MBGD)

    常用的梯度下降法分为: 批量梯度下降法(Batch Gradient Descent) 随机梯度下降法(Stochastic Gradient Descent) 小批量梯度下降法(Mini-Batch ...

  7. gin框架——使用viper读取配置

    什么是viper Viper是Go应用程序的完整配置解决方案,包括12-Factor(也称为"十二要素",是一套流行的应用程序开发原则. 其实我也不是很清楚)应用程序.它被设计为在 ...

  8. 使用canvas 根据角度画圆弧

    最近收到一个需求,根据角度在平面上画出对应的区域,实际就是 以固定的原点,根据起始角度和结束角度和半径,画出他的区域. 写了一小段,试试 export class Draw {   construct ...

  9. DNS 解析 prefeath

    本文将详细介绍DNS预解析prefetch的主要内容 概述 DNS(Domain Name System, 域名系统),是域名和IP地址相互映射的一个分布式数据库.DNS 查询就是将域名转换成 IP ...

  10. getAddress和getHostAddress的区别

    getAddress方法和getHostAddress类似,它们的唯一区别是getHostAddress方法返回的是字符串形式的IP地址,而getAddress方法返回的是byte数组形式的IP地址.