dpkg -l 的输出第一列实际上是 3 个字符的状态字段,不是单纯一个状态。
你这里:
ii docker-ce
rc docker.io
分别是这 3 个位置:
① ② ③
↓ ↓ ↓
Want Status Error
完整含义是:
| 位置 | 名称 | 含义 |
|---|---|---|
| 第 1 个字符 | Want | 用户希望这个包处于什么状态 |
| 第 2 个字符 | Status | 当前包实际处于什么状态 |
| 第 3 个字符 | Eflag | 是否存在错误/异常标记 |
不过 dpkg -l 默认只显示比较常见的组合,所以你经常看到的是 ii、rc、un 等。
1. 第一位:Want ------ 用户期望状态
第一位一共有这些状态:
| 字符 | 含义 |
|---|---|
u |
Unknown,未知 |
i |
Install,用户希望安装 |
r |
Remove,用户希望卸载 |
p |
Purge,用户希望彻底清除配置 |
h |
Hold,保持当前版本/状态 |
例如:
ii
^^
||
|+-- 当前状态
+--- 用户希望安装
2. 第二位:Status ------ 实际状态
第二位常见的状态:
| 字符 | 含义 |
|---|---|
n |
Not-installed,未安装 |
i |
Installed,已安装 |
c |
Config-files,只剩配置文件 |
u |
Unpacked,已解包但还没配置 |
f |
Failed-config,配置失败 |
h |
Half-installed,安装了一半 |
w |
Triggers-awaiting,等待触发器 |
t |
Triggers-pending,有触发器待处理 |
这里特别注意:
rc
不是一个状态叫 rc,而是:
r + c
即:
r = 用户要求卸载
c = 当前只剩配置文件
所以:
rc docker.io
就是:
docker.io已经被卸载,但是配置文件状态还留在 dpkg 数据库里。
3. 第三位:Error flag
第三位通常是:
| 字符 | 含义 |
|---|---|
| 空格 | 没有错误 |
R |
Reinst-required,需要重新安装 |
所以正常情况下你看到:
ii␠
第三个字符实际上是一个空格。
例如:
ii docker-ce
实际上可以理解为:
i i " "
│ │ └── 无错误
│ └──── 已安装
└────── 用户希望安装
你的输出逐个解释
docker-ce
ii docker-ce
实际上:
i i " "
│ │
│ └── Installed:已经安装
└──── Want=Install:用户希望它安装
所以:
正常安装状态。
docker.io
rc docker.io
实际上:
r c " "
│ │
│ └── Config-files:软件已经卸载,只剩配置状态
└──── Want=Remove:用户希望卸载
所以:
软件已经没了,只剩 dpkg 的配置文件状态记录。
这就是你前面执行:
dpkg -L docker.io
出现:
Package 'docker.io' does not contain any files (!)
的原因。
如果看到 un
例如:
un xxx
意思是:
u = Unknown
n = Not-installed
即:
dpkg 没有安装这个包。
实际上 dpkg -l 的输出里会包含大量这种状态。
最重要的一张表
你平时排查服务器时,记住这几个就够了:
dpkg -l |
含义 |
|---|---|
ii |
已安装,正常 |
rc |
软件已卸载,但配置状态/配置文件残留 |
un |
未安装 |
iU |
已解包,但还没完成配置 |
iF |
配置失败 |
h? |
与 hold/半安装等状态有关,需要进一步看具体组合 |
?? |
其他组合,查具体两位含义 |
另外,dpkg -l 的状态组合理论上不止这些,因为它是三个字段的组合,而每个字段都有多个取值。
你这台机器目前最关键的是:
ii cri-dockerd
ii docker-ce
ii docker-ce-cli
rc docker.io
ii nvidia-docker2
也就是说,真正安装着 Docker 的是 docker-ce,不是 docker.io;docker.io 只是一个残留的 rc 条目。