1. 背景与问题
系统里同时存在两类包信息:
-
远程仓库中的包(来自
sources.list配置的源,下载索引缓存在/var/lib/apt/lists/) -
本机已安装的包(记录在 dpkg 数据库
/var/lib/dpkg/status)
很多命令(如 apt-cache show、apt-cache policy)会同时显示这两类信息,容易让人误以为“仓库里有多个版本”。本文档说明三个常用数据源/命令的差异,并给出“只看仓库包”的推荐方法。
2. 三个数据源/命令对比
| 项目 | apt-cache show | apt-cache policy | /var/lib/apt/lists/*Packages |
|---|---|---|---|
| 数据来源 | APT 已知的所有版本(仓库 + 本机 dpkg) | APT 版本表(仓库 + dpkg/status) | 仅远程仓库索引缓存文件 |
| 是否含本机已安装记录 | ✅(有 Status: install ok installed 段落) | ✅(Installed: 和 *** 行) | ❌ |
| 是否含远程仓库版本 | ✅ | ✅ | ✅ |
| 显示候选版本 | ❌ | ✅(Candidate:) | ❌ |
| 显示优先级 | ❌ | ✅(500 / 100 等) | ❌ |
| 显示下载信息 | ✅(Filename、Size、SHA256) | ❌ | ✅(同 show 的字段) |
| 输出格式 | 多段完整元数据 | 结构化摘要 | 原始 Packages 索引(每包一段) |
| 适合场景 | 看某包某版本的完整字段(大小、依赖、校验值、配置文件) | 判断“升级会装哪个版本、为什么” | 列出仓库里有哪些包、有哪些版本 |
3. apt-cache show <包名>
作用
列出 APT 已知的该包所有版本的完整元数据,每个版本一段。
示例
bash
apt-cache show app
输出(节选):
text
Package: app Version: 0.1.20261022.98 Architecture: arm64 Depends: libc6, libcurl4, libmd0, libuuid1 Filename: pool/main/a/app/app_0.1.20261022.98_arm64.deb Size: 44662288 SHA256: c5db... Description: Edge node application Package: app Status: install ok installed Version: 0.1.20261014.97 Conffiles: /etc/logrotate.d/example/example-logrotate ... /etc/nginx/conf.d/example-nginx.conf ... Description: Edge node application
如何区分两段
-
仓库版本:有
Filename、Size、SHA256/SHA1/MD5sum,没有Status:字段。 -
本机已安装版本:有
Status: install ok installed,没有Filename/Size/校验值。
⚠️ 注意:
apt-cache show出现两段 不代表仓库里有两个版本。其中一段是本机 dpkg 记录。
适用
-
想了解某版本的大小、依赖、校验值、配置文件列表。
-
升级前确认包内容。
4. apt-cache policy <包名>
作用
显示 APT 的版本决策信息:已安装版本、候选版本、所有版本来源及优先级。
示例
bash
apt-cache policy app
输出:
text
app:
Installed: 0.1.20261014.97
Candidate: 0.1.20261022.98
Version table:
0.1.20261022.98 500
500 https://artifacts.example.com/application stable/main arm64 Packages
*** 0.1.20261014.97 100
100 /var/lib/dpkg/status
字段含义
| 字段 | 含义 |
|---|---|
Installed: | 本机 dpkg 已安装版本 |
Candidate: | 执行 apt install/upgrade 时会安装的版本 |
Version table: | APT 已知的所有版本、来源、pin 优先级 |
*** | 标记当前已安装版本 |
500 | 普通仓库默认优先级 |
100 | 已安装版本(dpkg/status)默认优先级 |
如何判断远程仓库版本
Version table 中来源为仓库 URL(如 https://... stable/main)的行才是远程仓库版本;来源为 /var/lib/dpkg/status 的是本机记录。
适用
-
判断“现在升级会装哪个版本”。
-
排查“为什么候选版本不是最新”的优先级问题。
5. /var/lib/apt/lists/*Packages(仓库索引缓存)
作用
apt update 会把每个源的 Packages 索引下载到 /var/lib/apt/lists/。这些文件只包含远程仓库的包,不含本机已安装记录。
文件命名规律
text
<主机名>_<路径>_dists_<发行版>_<组件>_binary-<架构>_Packages
例如:
text
artifacts.example.com_application_dists_stable_main_binary-arm64_Packages
常用命令
列出所有仓库中的所有包名(去重):
bash
grep -h '^Package:' /var/lib/apt/lists/*Packages | awk '{print $2}' | sort -u
只看某个源:
bash
ls /var/lib/apt/lists/ | grep example
grep '^Package:' /var/lib/apt/lists/*example*Packages | awk '{print $2}' | sort -u
看包名 + 版本:
bash
awk '/^Package:/{p=$2} /^Version:/{print p, $2}' /var/lib/apt/lists/*Packages
只看某个源的包名 + 版本:
bash
awk '/^Package:/{p=$2} /^Version:/{print p, $2}' /var/lib/apt/lists/*example*Packages
示例输出
text
agent 0.9.0 app 0.1.20261022.98 cli 1.2.3
适用
-
列出仓库里到底有哪些包(最准确,完全不含系统包)。
-
确认仓库里某包有几个版本(同一包名出现多次即多版本)。
-
脚本化处理(grep/awk 友好)。
⚠️ 注意:这些文件是
apt update的缓存。若刚改过源或很久没 update,内容可能过期。执行apt update后再读。
6. 选型建议
| 你的目的 | 推荐 |
|---|---|
| 只看仓库里有哪些包、几个版本 | grep '^Package:' /var/lib/apt/lists/*Packages | awk '{print $2}' | sort -u |
| 看某仓库源的包名+版本 | awk '/^Package:/{p=$2} /^Version:/{print p,$2}' /var/lib/apt/lists/*<源关键字>*Packages |
| 看某包完整元数据(大小/依赖/校验值/配置文件) | apt-cache show <包名>(注意区分仓库段与 installed 段) |
| 判断升级会装哪个版本、为什么 | apt-cache policy <包名> |
| 数某包在远程仓库有几个版本 | apt-cache madison <包名>(每行一个仓库版本) |
7. 常见误区
-
apt-cache show出现两段 ≠ 仓库有两个版本
一段是仓库版本,一段是本机已安装记录(看Status:和Filename区分)。 -
apt list --upgradable -a的 “1 additional version”
多出来的通常是本机now已安装版本,不是仓库里的第二个版本。 -
apt-cache policy的Version table含/var/lib/dpkg/status
该行是本机记录,不是远程仓库版本。远程仓库版本看来源为 URL 的行。 -
/var/lib/apt/lists/*Packages是缓存
改源后需apt update刷新,否则看到的是旧索引。
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/qq_30531921/article/details/169250115



