LabHub
学习 学习路径 课程

包管理

用 dpkg 看下面一层

在 LabHub 中继续学习

目标

使用 dpkg 查询系统,并亲手构建 .deb 直至完成安装。在不使用 apt 的情况下管理软件包后,就能清楚理解 apt 代替你做了什么。

为什么重要

dpkg 不认识软件仓库。它只会解开给定文件(unpack),并在依赖得到满足时完成配置(configure)。因此,dpkg -i 不会自动拉取依赖,而会停在 iU 状态。理解这种分工后,就能解释为什么隔离网络中“安装顺序”如此重要,以及 apt-get -f install 到底修复什么。养成使用 dpkg -S 确认文件来源的习惯,也是面对陌生服务器时最先使用的武器。

步骤

  1. 创建 /root/dpkg 目录,只把当前处于安装完成(ii)状态的软件包数量作为一行数字写入 /root/dpkg/count.txt
  2. coreutils 软件包安装的文件中,只筛选 /usr/bin/ 下的文件,保存到 /root/dpkg/coreutils-bin.txt
  3. 只把拥有 /usr/bin/ls软件包名称作为一行写入 /root/dpkg/owner.txt
  4. 使用 dpkg-query 提取 bash 软件包的 이름 버전 아키텍처,以空格分隔成一行,保存到 /root/dpkg/bash-fields.txt
  5. /opt/fixtures/pkg/labhub-tool 目录构建为 .deb,保存为 /root/dpkg/labhub-tool_1.2.0-labhub1_all.deb
  6. 将构建后软件包的控制信息保存到 /root/dpkg/deb-info.txt,将文件列表保存到 /root/dpkg/deb-contents.txt
  7. 安装该软件包,并将执行 labhub-tool 命令的结果保存到 /root/dpkg/run.txt
  8. 按以下 4 行创建 /root/dpkg/report.txtPACKAGE=labhub-tool / VERSION=<설치된 버전> / FILES=<이 패키지가 깐 실제 파일 개수(디렉터리 제외)> / OWNER_OF_LS=<3번에서 찾은 패키지 이름>

参考

工作目录与已安装列表

创建 /root/dpkg 目录,只把当前处于安装完成(ii)状态的软件包数量作为一行数字写入 /root/dpkg/count.txt

dpkg -l 的输出中,真实软件包行以状态标记(ii 等)开头。前五行表头不是软件包。

软件包安装的文件列表

coreutils 软件包安装的文件中,只筛选 /usr/bin/ 下的文件,保存到 /root/dpkg/coreutils-bin.txt

dpkg -L 也会输出目录。如果只需要可执行文件,应按路径筛选。

这个文件由谁安装

只把拥有 /usr/bin/ls软件包名称作为一行写入 /root/dpkg/owner.txt

dpkg -S 以“软件包: 路径”的格式回答。需要的是冒号前面的部分。

只提取所需字段

使用 dpkg-query 提取 bash 软件包的 이름 버전 아키텍처,以空格分隔成一行,保存到 /root/dpkg/bash-fields.txt

dpkg-query -W -f 的格式字符串中,字段由美元符号与花括号包围,换行使用反斜杠 n。

使用 fixture 构建 .deb

/opt/fixtures/pkg/labhub-tool 目录构建为 .deb,保存为 /root/dpkg/labhub-tool_1.2.0-labhub1_all.deb

dpkg-deb --build 会把包含 DEBIAN/control 的整个目录制作为软件包。输出文件名可以作为第二个参数提供。

检查构建后的软件包

将构建后软件包的控制信息保存到 /root/dpkg/deb-info.txt,将文件列表保存到 /root/dpkg/deb-contents.txt

dpkg-deb 提供 -I(信息)和 -c(内容列表)选项,两种输出的性质完全不同。

安装并检查状态

安装该软件包,并将执行 labhub-tool 命令的结果保存到 /root/dpkg/run.txt

使用 dpkg -i 安装后,检查 dpkg -s 的 Status 行。如果依赖未解决,软件包会停留在 iU 状态。

软件包综合报告

按以下 4 行创建 /root/dpkg/report.txtPACKAGE=labhub-tool / VERSION=<설치된 버전> / FILES=<이 패키지가 깐 실제 파일 개수(디렉터리 제외)> / OWNER_OF_LS=<3번에서 찾은 패키지 이름>

请复用前面步骤中生成的文件。文件数量可从 dpkg -L 结果中只统计真实文件得到。