徐明雅 發表於 2023-1-18 16:05:00

Debian 软件包管理

<h1 id="debian-软件包管理">Debian 软件包管理</h1>
<ul>
<li>Debian 软件包管理
<ul>
<li>基础软件包管理知识
<ul>
<li>sources.list 文件格式</li>
<li>新手建议</li>
<li>档案库临时小故障</li>
<li>软件包依赖关系</li>
</ul>
</li>
<li>APT 进行软件包管理
<ul>
<li>基本操作</li>
<li>软件包管理操作</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="基础软件包管理知识">基础软件包管理知识</h2>
<p>Debian 档案库</p>
<ul>
<li>Debian 官方建立一致的软件包并从档案库中分发它们</li>
<li>提供 HTTP 和 FTP 的方式来访问 Debian 档案库</li>
<li>全世界都有 Debian 档案库的 镜像站,可以理解为 Debian 档案库的备份</li>
</ul>
<p>软件包管理工具</p>
<ul>
<li>
<p>可以让用户从档案库安装 <strong>统一设置</strong> 的二进制软件包到系统中</p>
</li>
<li>
<p>目前 Debian 的软件包管理系统是 <strong>高级软件包工具</strong> <code>APT</code></p>
<ul>
<li>apt: 用于所有的 <strong>交互式命令行</strong> 操作</li>
<li>apt-get: 主要用于 <strong>脚本调用</strong>,在 apt 不可用时可作为备用选项</li>
<li>aptitude: <strong>交互式的文本界面</strong> 来管理已安装的软件包和搜索可用的软件包</li>
</ul>
</li>
<li>
<p>APT 前端用户程序和后端的不同访问方式</p>
<ul>
<li>dpkg: <strong>底层</strong> 软件包管理系统</li>
<li>apt: <strong>命令行</strong> 管理软件包的 APT 前端 apt, apt-get, apt-cache</li>
<li>aptitude: 全屏控制台 <strong>交互式管理</strong> 软件包的 APT 前端,可以管理软件包的多个版本</li>
<li>gnome-software: GNOME 图形化的 APT 前端</li>
<li>synaptic: GTK 图形化的 APT 前端</li>
</ul>
</li>
<li>
<p>APT 辅助工具</p>
<ul>
<li>apt-utils: APT 实用程序 apt-extracttemplates, apt-ftparchive, apt-sortpkgs</li>
<li>apt-file: 软件包搜索工具</li>
<li>apt-cache: 提供了标准的正则表达式来搜索软件包名称和描述</li>
<li>apt-rdepends: 查询软件包依赖</li>
<li>apt-listchanges: 软件包历史更改提醒工具</li>
<li>apt-listbugs: 在 APT 安装前列出严重的 bug</li>
<li>unattended-upgrades: 用于 APT 的增强软件包,会自动安装安全更新</li>
</ul>
</li>
<li>
<p>apt-get 和 apt-cache 是最基础的基于 APT 的软件包管理工具,意味快但功能不丰富</p>
</li>
<li>
<p>apt-get 和 apt-cache 可以使用 <code>/etc/apt/preferences</code> 来管理软件包的多个版本,但这非常繁琐</p>
</li>
<li>
<p>在成功安装下载的软件包后,apt 将默认删除缓存的 <code>.deb</code> 软件包</p>
</li>
</ul>
<h3 id="sourceslist-文件格式">sources.list 文件格式</h3>
<p>对于典型的 HTTP 访问,档案库在 <code>/etc/apt/sources.list</code> 文件</p>
<pre><code class="language-sh"># 源的信息组成 deb/deb-src URL         stable/testing/unstable
deb http://deb.debian.org/debian/ bullseye main contrib non-free
deb-src http://deb.debian.org/debian/ bullseye main contrib non-free
</code></pre>
<ul>
<li>
<p>一行一条</p>
</li>
<li>
<p>第一个参数</p>
<ul>
<li>deb 表示二进制软件包</li>
<li>deb-src 表示源代码软件包,非必要,不使用可以加速档案库元数据的更新</li>
</ul>
</li>
<li>
<p>第二个参数 <strong>Debian 档案库</strong> 的根 URL</p>
<ul>
<li>URL 可以是 "http://", "ftp://", "file://", ...</li>
</ul>
</li>
<li>
<p>第三个参数是发行版名称,这个一般需要查看一下</p>
<ul>
<li>stable: 稳定版,不用说一般都是使用这个,用于你的生产服务器</li>
<li>testing: 测试版,它是自动滚动发布的,由 Debian 档案库的 QA 质量架构来管理,更新得足够频繁来提供全部最新的特性</li>
<li>unstable: 不稳定版,不推荐的使用,仅对开发者调试软件包合适</li>
</ul>
</li>
<li>
<p>后面全部参数是 Debian 档案库的有效档案库范围名称</p>
<ul>
<li>main: 遵从 Debian 自由软件指导方针(DFSG),并且不依赖于 non-free</li>
<li>contrib: 遵从 Debian 自由软件指导方针(DFSG),但依赖于 non-free</li>
<li>non-free: 不遵从 Debian 自由软件指导方针(DFSG)</li>
</ul>
<p>自由软件</p>
<ul>
<li>Debian 默认只安装自由软件</li>
<li>Debian 建议只运行来自 main 的自由软件</li>
</ul>
</li>
</ul>
<p>下面是一个小脚本可以帮助你添加 <strong>第三方档案库</strong>,前提是你的默认 /etc/apt/sources.list 没有被破坏并且会 Linux 的 CLI 界面的基本操作,此脚本是根据默认的 sources.list 创建,当然你可以不用脚本用手动编辑 φ(゜▽゜*)♪</p>
<ul>
<li>
<p>第一步,在命令行执行以下内容</p>
<pre><code class="language-sh"># 创建一个文件夹 test 名称随意
mkdir test

# 创建脚本,可以使用 vi, vim, ... 编辑,建议不会对应编辑器可以查询一下用法
vi apt-sources.sh
</code></pre>
</li>
<li>
<p>第二步,编辑 <code>apt-sources.sh</code> 脚本,注意:在进入 vi 编辑模式后 <strong>小心</strong> 每个操作,如果 <strong>不确定</strong> 或 <strong>有问题</strong>,可以按 <code>ESC</code> 进入命令模式再按 <code>u</code> 撤销</p>
<ul>
<li>
<p>按照 <code>i</code> 输入下面内容,只要按 <code>i</code> 就可以进入编辑模式</p>
<pre><code class="language-sh">#!/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~" &gt; /etc/apt/sources.list.d/${filename%%.*}.list
    done &lt; "$1"
    apt update
else
    echo "文件不存在或无法权限读取"
fi
</code></pre>
</li>
<li>
<p>输入完上面内容,按 <code>Esc</code> 进入命令模式,按 <code>:wq</code> 保存退出 vi 编辑器,如果有问题按照上面警告可以撤销操作按 <code>:q!</code> 退出 vi</p>
</li>
<li>
<p>注:读不懂脚本,可以在 <strong>此处</strong> 了解 shell 脚本的基本知识</p>
</li>
</ul>
</li>
<li>
<p>第三步,编辑第三方档案库信息,<code>vi sources.txt</code> 像第二步一样输入下面内容,当然你可以添加其他你知道的 <strong>第三方档案库信息</strong>,注意一条地址一行</p>
<pre><code class="language-txt">http://mirrors.ustc.edu.cn
https://mirrors.aliyun.com
</code></pre>
</li>
<li>
<p>第四步,执行脚本</p>
<pre><code class="language-sh"># 赋予脚本执行权
chmod +x apt-sources.sh

# 执行脚本
sudo ./apt-sources.sh sources.txt

# 查看添加是否成功
cd /etc/apt/sources.list.d/ &amp;&amp; ls -lh
</code></pre>
<ul>
<li>使用时部分命令可能执行不了,建议查看权限,可以使用 <code>sudo</code> 进行临时提权,关于 sudo 信息</li>
</ul>
</li>
</ul>
<p>说明:</p>
<ul>
<li>如果需要对 <strong>档案库的有效档案库范围</strong> 变更可以在 <code>/etc/apt/sources.list.d/</code> 目录中找到不同第三方档案库进行调整</li>
<li>在 <code>/etc/apt/sources.list.d/</code> 目录中最好一个档案库一个文件</li>
<li>注意 <code>/etc/apt/sources.list.d/</code> 是官方为我们准备的不是脚本创建的</li>
<li>此脚本的作用:根据默认的 /etc/apt/sources.list 为模板,将每条 sources.txt 中的档案库地址于默认的进行替换,并一个档案库创建一个 <code>.list</code> 文件存放在 <code>/etc/apt/sources.list.d/</code> 目录中</li>
</ul>
<p>网上直接复制的源一般存在以下问题</p>
<ul>
<li>
<p>协议问题,一般是 HTTP 协议,部分对 HTTPS 协议不友好需要安装 <code>apt-transport-https</code> 或 <code>ca-certificates</code> 的支持</p>
</li>
<li>
<p>发行版号不匹配,这个建议查看自己当前系统 <code>uname -a</code> 然后在官网查看,或看看 /etc/apt/sources.list 默认的内容,所以一般别改 /etc/apt/sources.list</p>
</li>
<li>
<p><code>deb-src</code> 一般含义此行需要下载大量源码信息,一些不必的可以注释掉,不一定每个仓库需要拉取</p>
</li>
<li>
<p><code>GPG error</code> 问题,这个一般是版本问题或安装时是离线安装,导致发行版的元数据文件 Release 不同步出现 GPG 验证错误,或者离线安装没有网络在安装时 apt 自动配置根据 CD/DVD 的数据配置等可能,建议了解 GPG</p>
<p><strong>解决方法是添加上对应的签名即可</strong>,两种方法,都需要 wget 这个一般有自带,解决时的两种关于签名的文件 <code>.asc</code> 或 <code>.gpg</code></p>
<ul>
<li>
<p>直接使用 gpg 程序</p>
<ul>
<li>
<p>确认 gpg 是否安装,没有就安装一下</p>
<pre><code class="language-sh">sudo apt-get install gpg
</code></pre>
</li>
<li>
<p>得到 <code>.gpg</code> 文件,具体名字随便,建议有辨识度,比如阿里云记为 aliyun.gpg</p>
<pre><code class="language-sh"># 根据对应档案库的 Release.gpg 文件下载
wget -qO- https://mirrors.aliyun.com/debian/dists/buster/Release.gpg?spm=a2c6h.25603864.0.0.25864a07v5Lsgz &gt; aliyun.gpg

# 如果是 .asc 文件,使用 gpg --dearmor 转化
wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor &gt; microsoft.gpg
</code></pre>
</li>
<li>
<p>添加 <code>.gpg</code> 文件,两种方法</p>
<pre><code class="language-sh"># 方法一:安装 /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
</code></pre>
<p>方法一需要改变 list 文件,在 <code>deb/deb-src</code> 和 <code>url</code> 之间添加一条信息 <code></code></p>
<pre><code class="language-list"># 这是 /etc/apt/sources.list.d/aliyun.list 文件,其中 ... 是简化的需要根据情况填写,参考默认的 /etc/apt/sources.list
deb https://mirrors.aliyun.com/debian ...
</code></pre>
</li>
</ul>
</li>
<li>
<p>使用 apt 默认的 apt-key</p>
<p>使用非常方便,首先下载 .asc 或 .gpg 文件,然后使用 apt-key 安装</p>
<pre><code class="language-sh"># 下载
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 &gt; aliyun.gpg

# 安装
sudo apt-key archive-key.asc
sudo apt-key aliyun.gpg
</code></pre>
</li>
</ul>
<p>Release.gpg 文件在每个档案库都有的,比如阿里的访问 https://mirrors.aliyun.com/debian/dists/buster 就可以看到,<code>.asc</code> 文件也差不多在档案库中但位置不定,不同档案库可能不同需要自己查,<strong>Debian 官方档案库</strong> 的 keys 仓库 地址</p>
</li>
</ul>
<h3 id="新手建议">新手建议</h3>
<ul>
<li>
<p>/etc/apt/sources.list 不要包含 testing 或 unstable</p>
</li>
<li>
<p>/etc/apt/sources.list 不要在标准的 Debian 中混合使用其它非 Debian 的档案库</p>
</li>
<li>
<p>第三方档案库放在 /etc/apt/sources.list.d 分类以 <code>.list</code> 后缀结尾的文件中</p>
</li>
<li>
<p>不要建立 /etc/apt/preferences</p>
</li>
<li>
<p>不了解会造成的全部影响,就不要通过配置文件改变软件包管理工具的默认行为</p>
</li>
<li>
<p>不要使用 <code>dpkg -i random_package</code> 或 <code>dpkg --force-all -i random_package</code> 安装任何软件包</p>
</li>
<li>
<p>不要删除或修改 /var/lib/dpkg/ 中的文件</p>
</li>
<li>
<p>不要让从源码直接安装的程序覆盖系统文件</p>
</li>
<li>
<p>没有在安全的条件下使用你特定的配置进行彻底地测试,就不要从 Debian 安装任何软件包</p>
</li>
<li>
<p>使用 non-free 和 contrib 中的软件包所需要冒的风险</p>
<ul>
<li>使用类似的软件包会失去自由</li>
<li>失去 Debian 对软件包的支持,这些软件包无法访问源代码,Debian 不能进行完全的支持</li>
<li>可能存在商业付费</li>
</ul>
</li>
</ul>
<h3 id="档案库临时小故障">档案库临时小故障</h3>
<ul>
<li>损坏的软件包被上传到档案库,多见于 unstable</li>
<li>延迟接受新的软件包到档案库,多见于 unstable</li>
<li>档案库时间同步问题,在 testing 和 unstable</li>
<li>手动干预档案库,多见于 testing</li>
</ul>
<h3 id="软件包依赖关系">软件包依赖关系</h3>
<p>Debian 系统通过其控制文件字段中的版本化二进制依赖声明机制</p>
<ul>
<li>Depends: 绝对的依赖,所有在这里列出的软件包都必须同时或提前安装</li>
<li>Pre-Depends: 类似于 Depends,但列出的软件包必须提前完成安装</li>
<li>Recommends: 这里表示一个强,但不是绝对的依赖关系,大多数用户不会想要这个包除非在这里列出的所有包都已经安装</li>
<li>Suggests: 较弱的依赖,这个软件包的大多数用户可能会从安装所列的软件包中受益,但没有它们也可以有适当的功能</li>
<li>Enhances: 这里表明一个像建议的弱依赖关系,不装也没关系</li>
<li>Breaks: 表明一个软件包不兼容一些版本规范,一般的解决方法就是升级列出的所有软件包</li>
<li>Conflicts: 这表明了绝对的不兼容,为了安装这个软件包必须移除所有列出的软件包</li>
<li>Replaces: 这表明这个文件安装的文件会替代所列的软件包的文件</li>
<li>Provides: 表明这个软件包会提供所列的软件包所有的文件和功能</li>
</ul>
<p>Conflicts, Replaces, Provides 定义到一个虚拟的软件包,确保了在任何一个时间只能安装一个提供该虚拟包的真正软件包</p>
<hr>
<h2 id="apt-进行软件包管理">APT 进行软件包管理</h2>
<h3 id="基本操作">基本操作</h3>
<p>更新元数据: apt update, apt-get update, aptitude update</p>
<ul>
<li>从远程档案库获取档案库元数据</li>
<li>重建并更新 APT 使用的本地元数据</li>
</ul>
<p>安装软件: apt install ..., apt-get install ..., aptitude install ...</p>
<ul>
<li>选择命令行中列出的包</li>
<li>解决软件包依赖关系</li>
<li>从远程服务器获取已选二进制包</li>
<li>解包所获取的二进制软件包</li>
<li>运行 preinst 脚本</li>
<li>安装二进制文件</li>
<li>运行 postinst 脚本</li>
</ul>
<p>升级软件: apt upgrade/full-upgrade, pt-get upgrade/dist-upgrade, aptitude safe-upgrade/full-upgrade</p>
<ul>
<li>选择候选版本,默认最新的可用版本,除非手动指定版本</li>
<li>解决软件包依赖关系</li>
<li>如果候选版本与已安装的版本不同,会从远程档案库获取所选择的二进制软件包</li>
<li>解包所获取的二进制软件包</li>
<li>运行 preinst 脚本</li>
<li>安装二进制文件</li>
<li>运行 postinst 脚本</li>
</ul>
<p>移除软件: apt remove ..., apt-get remove ..., aptitude remove ...</p>
<ul>
<li>选择命令行中列出的包</li>
<li>解决软件包依赖关系</li>
<li>运行 prerm 脚本</li>
<li>移除已安装的文件,除了 <strong>配置文件</strong></li>
<li>运行 postrm 脚本</li>
</ul>
<p>清除软件: apt purge ..., apt-get purge ..., aptitude purge ...</p>
<ul>
<li>选择命令行中列出的包</li>
<li>解决软件包依赖关系</li>
<li>运行 prerm 脚本</li>
<li>移除已安装的文件,包含 <strong>配置文件</strong></li>
<li>运行 postrm 脚本</li>
</ul>
<h3 id="软件包管理操作">软件包管理操作</h3>
<ul>
<li>apt 用于交互式命令行</li>
<li>aptitude 全屏的交互式文本用户界面</li>
<li>apt-get/apt-cache 基本工具,主要用于脚本</li>
</ul>
<table>
<thead>
<tr>
<th style="text-align: left">apt</th>
<th style="text-align: left">aptitude</th>
<th style="text-align: left">apt-get/apt-cache</th>
<th style="text-align: left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left">apt update</td>
<td style="text-align: left">aptitude update</td>
<td style="text-align: left">apt-get update</td>
<td style="text-align: left">更新软件包档案库元数据</td>
</tr>
<tr>
<td style="text-align: left">apt install <em>foo</em></td>
<td style="text-align: left">aptitude install <em>foo</em></td>
<td style="text-align: left">apt-get install <em>foo</em></td>
<td style="text-align: left">安装 foo 软件包的候选版本以及它的依赖</td>
</tr>
<tr>
<td style="text-align: left">apt upgrade</td>
<td style="text-align: left">aptitude safe-upgrade</td>
<td style="text-align: left">apt-get upgrade</td>
<td style="text-align: left">安装已安装的软件包的候选版本并且不移除任何其它的软件包</td>
</tr>
<tr>
<td style="text-align: left">apt full-upgrade</td>
<td style="text-align: left">aptitude full-upgrade</td>
<td style="text-align: left">apt-get dist-upgrade</td>
<td style="text-align: left">安装已安装的软件包的候选版本,并且需要的话会移除其它的软件包</td>
</tr>
<tr>
<td style="text-align: left">apt remove <em>foo</em></td>
<td style="text-align: left">aptitude remove <em>foo</em></td>
<td style="text-align: left">apt-get remove <em>foo</em></td>
<td style="text-align: left">移除 foo 软件包,但留下配置文件</td>
</tr>
<tr>
<td style="text-align: left">apt autoremove</td>
<td style="text-align: left">N/A</td>
<td style="text-align: left">apt-get autoremove</td>
<td style="text-align: left">移除不再需要的自动安装的软件包</td>
</tr>
<tr>
<td style="text-align: left">apt purge <em>foo</em></td>
<td style="text-align: left">aptitude purge <em>foo</em></td>
<td style="text-align: left">apt-get purge <em>foo</em></td>
<td style="text-align: left">清除 foo 软件包的配置文件</td>
</tr>
<tr>
<td style="text-align: left">apt clean</td>
<td style="text-align: left">aptitude clean</td>
<td style="text-align: left">apt-get clean</td>
<td style="text-align: left">完全清除本地仓库的软件包检索文件</td>
</tr>
<tr>
<td style="text-align: left">apt autoclean</td>
<td style="text-align: left">aptitude autoclean</td>
<td style="text-align: left">apt-get autoclean</td>
<td style="text-align: left">清除本地仓库中过时软件包的软件包检索文件</td>
</tr>
<tr>
<td style="text-align: left">apt show <em>foo</em></td>
<td style="text-align: left">aptitude show <em>foo</em></td>
<td style="text-align: left">apt-cache show <em>foo</em></td>
<td style="text-align: left">显示 foo 软件包的详细信息</td>
</tr>
<tr>
<td style="text-align: left">apt search <em>regex</em></td>
<td style="text-align: left">aptitude search <em>regex</em></td>
<td style="text-align: left">apt-cache search <em>regex</em></td>
<td style="text-align: left">搜索匹配 regex 的软件包</td>
</tr>
<tr>
<td style="text-align: left">N/A</td>
<td style="text-align: left">aptitude why <em>regex</em></td>
<td style="text-align: left">N/A</td>
<td style="text-align: left">解释匹配 regex 的软件包必须被安装的原因</td>
</tr>
<tr>
<td style="text-align: left">N/A</td>
<td style="text-align: left">aptitude why-not <em>regex</em></td>
<td style="text-align: left">N/A</td>
<td style="text-align: left">解释匹配 regex 的软件包不必安装的原因</td>
</tr>
<tr>
<td style="text-align: left">N/A</td>
<td style="text-align: left">aptitude search '~i!~M'</td>
<td style="text-align: left">apt-mark showmanual</td>
<td style="text-align: left">列出手动安装的软件包</td>
</tr>
</tbody>
</table>
<ul>
<li>对于使用体验和功能性: aptitude &gt; apt &gt; apt-get/apt-cache</li>
<li>对于自动化脚本: apt-get/apt-cache &gt; apt &gt; aptitude</li>
<li>apt 算得上是 apt-get, apt-cache, ... 类似命令的封装,针对终端用户交互的界面</li>
</ul>
<p>注意:</p>
<ul>
<li>不建议在新版本发布后在 stable 的 Debian 系统上使用 aptitude 命令来进行跨版本的系统升级</li>
<li>aptitude 命令有时候会为了 testing 或 unstable 的 Debian 系统升级清除大量软件包</li>
<li>建议用户使用 apt 命令用于 <strong>交互式</strong> 的使用场景,而在 <strong>shell 脚本</strong> 中使用 apt-get/apt-cache 命令</li>
<li>对于它们更精细化或特殊选项的使用建议 man 查看</li>
</ul>
<p>关于 GNU/Linux 的内容</p><br><br>
来源:https://www.cnblogs.com/shadow-/p/17060082.html
頁: [1]
查看完整版本: Debian 软件包管理