用 dpkg 看下面一层
目标
使用 dpkg 查询系统,并亲手构建 .deb 直至完成安装。在不使用 apt 的情况下管理软件包后,就能清楚理解 apt 代替你做了什么。
为什么重要
dpkg 不认识软件仓库。它只会解开给定文件(unpack),并在依赖得到满足时完成配置(configure)。因此,dpkg -i 不会自动拉取依赖,而会停在 iU 状态。理解这种分工后,就能解释为什么隔离网络中“安装顺序”如此重要,以及 apt-get -f install 到底修复什么。养成使用 dpkg -S 确认文件来源的习惯,也是面对陌生服务器时最先使用的武器。
步骤
- 创建
/root/dpkg目录,只把当前处于安装完成(ii)状态的软件包数量作为一行数字写入/root/dpkg/count.txt。 - 从
coreutils软件包安装的文件中,只筛选/usr/bin/下的文件,保存到/root/dpkg/coreutils-bin.txt。 - 只把拥有
/usr/bin/ls的软件包名称作为一行写入/root/dpkg/owner.txt。 - 使用
dpkg-query提取bash软件包的이름 버전 아키텍처,以空格分隔成一行,保存到/root/dpkg/bash-fields.txt。 - 把
/opt/fixtures/pkg/labhub-tool目录构建为.deb,保存为/root/dpkg/labhub-tool_1.2.0-labhub1_all.deb。 - 将构建后软件包的控制信息保存到
/root/dpkg/deb-info.txt,将文件列表保存到/root/dpkg/deb-contents.txt。 - 安装该软件包,并将执行
labhub-tool命令的结果保存到/root/dpkg/run.txt。 - 按以下 4 行创建
/root/dpkg/report.txt。PACKAGE=labhub-tool/VERSION=<설치된 버전>/FILES=<이 패키지가 깐 실제 파일 개수(디렉터리 제외)>/OWNER_OF_LS=<3번에서 찾은 패키지 이름>
参考
- 使用
dpkg-deb --build <디렉터리> <출력파일>进行构建。 - 使用
dpkg -L <패키지> | while read p; do [ -f "$p" ] && echo "$p"; done | wc -l可以得到排除目录后的文件数量。 - 常见错误 1:第 1 步直接使用
dpkg -l | wc -l,会连表头一起统计,多出 5 行。 - 常见错误 2:第 5 步进入待构建目录后执行
dpkg-deb --build .,容易因相对路径产生混淆。请指定绝对路径。
工作目录与已安装列表
创建 /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.txt。
PACKAGE=labhub-tool / VERSION=<설치된 버전> / FILES=<이 패키지가 깐 실제 파일 개수(디렉터리 제외)> / OWNER_OF_LS=<3번에서 찾은 패키지 이름>
请复用前面步骤中生成的文件。文件数量可从 dpkg -L 结果中只统计真实文件得到。