为什么 dpkg 日志不记录安装过程中删除的软件?

为什么 dpkg 日志不记录安装过程中删除的软件?

Ubuntu 20.04 桌面映像的清单已可用这里。清单中列出的一些软件包在安装过程中被删除。例如,、、ubiquity和都被删除了(仅举几个例子)。这可以通过查看最开始的 (现在可能已存档)来看到ubiquity-casper,其中的部分以以下内容开头:ubiquity-frontend-gtkubiquity-slideshow-ubuntuhistory.log/var/log/apt/

Start-Date: ...
Requested-By: ubuntu (999)
Purge: ...

运行类似的操作apt policy ubiquity ubiquity-casper ubiquity-frontend-gtk ubiquity-slideshow-ubuntu将会确认他们的缺席。

但是,这个自动“清除:”删除这些包的过程并没有在最开始记录下来dpkg.log(涵盖安装过程)。

如果用户运行

zgrep "status installed ubiquity" /var/log/dpkg.log*

结果是这样的(假设相关的归档日志仍然可用),给人的印象是软件包仍然安装着:

$ zgrep "status installed ubiquity" /var/log/dpkg.log*
/var/log/dpkg.log.1:2020-04-23 07:40:38 status installed ubiquity-ubuntu-artwork:all 20.04.15
/var/log/dpkg.log.1:2020-04-23 07:40:43 status installed ubiquity-casper:all 1.445
/var/log/dpkg.log.1:2020-04-23 07:40:43 status installed ubiquity-slideshow-ubuntu:all 160
/var/log/dpkg.log.1:2020-04-23 07:42:15 status installed ubiquity-frontend-gtk:amd64 20.04.15
/var/log/dpkg.log.1:2020-04-23 07:42:18 status installed ubiquity:amd64 20.04.15
$ 

是不是软件的安装由 处理dpkg,但这Purge一步没有由 处理dpkg?或者 dpkg 日志没有显示这些不同的软件包已被删除(如 apt 的 history.log 中正确显示的那样)的原因是什么?




我以不同的方式问同样的问题。

/var/log/history.log这是我从安装 Ubuntu 20.04 之日起的带注释的摘录(长行被截断)
2:3:为方便参考,包含了行号:

2: Start-Date: 2020-04-23  07:34:03
3: Commandline: apt-get --yes -oDebug::pkgDepCache::AutoInstall=yes install linux-generic-hwe-20.04 adduser apt apt-utils ...
4: Install: speech-dispatcher-espeak-ng:amd64 (0.9.1-4)Install: speech-dispatcher-espeak-ng:amd64 (0.9.1-4)
5: End-Date: 2020-04-23  07:39:30

7: Start-Date: 2020-04-23  07:39:39
8: Commandline: apt-get --yes -oDebug::pkgDepCache::AutoInstall=yes install lupin-casper ...
9: Install: hunspell-en-gb:amd64 (1:6.4.3-1), cryptsetup-bin:amd64 ...
10: End-Date: 2020-04-23  07:42:21

12: Start-Date: 2020-04-26  16:12:11
13: Requested-By: ubuntu (999)
14: End-Date: 2020-04-26  16:12:12

16: Start-Date: 2020-04-26  16:13:28
17: Requested-By: ubuntu (999)
18: End-Date: 2020-04-26  16:13:29

20: Start-Date: 2020-04-26  16:14:08
21: Requested-By: ubuntu (999)
22: Purge: hunspell-en-gb:amd64 ...
23: End-Date: 2020-04-26  16:19:54

25: Start-Date: 2020-04-26  16:19:57
26: Requested-By: ubuntu (999)
27: End-Date: 2020-04-26  16:19:58

29: Start-Date: 2020-04-26  16:20:00
30: Requested-By: ubuntu (999)
31: End-Date: 2020-04-26  16:20:00

33: Start-Date: 2020-04-26  16:24:48
34: Commandline: aptdaemon role='role-commit-packages' sender=':1.105'
35: Upgrade: netplan.io:amd64 (0.99-0ubuntu1, 0.99-0ubuntu2), distro-info-data:amd64 (0.43ubuntu1, 0.43ubuntu1.1), libnetplan0:amd64 (0.99-0ubuntu1, 0.99-0ubuntu2)
36: End-Date: 2020-04-26  16:25:01

因此,让我们hunspell-en-gb以无需任何依赖项即可安装的示例为例。(您可能更喜欢使用已在第 22 行从系统中删除的其他语言版本。)

它一直已安装根据第 9 行。稍后,同一个包清除根据第 22 行。

apt policy 2>/dev/null hunspell-en-gb可以通过运行以下命令来验证我的系统上是否存在此包:

hunspell-en-gb:
  Installed: (none)
  Candidate: 1:6.4.3-1

我希望查询/var/log/dpkg.log.1(或适当的存档日志)能够反映这一点。

$ zgrep hunspell-en-gb /var/log/dpkg*
dpkg.log.1:2020-04-23 07:39:54 install hunspell-en-gb:all <none> 1:6.4.3-1
dpkg.log.1:2020-04-23 07:39:54 status half-installed hunspell-en-gb:all 1:6.4.3-1
dpkg.log.1:2020-04-23 07:39:54 status unpacked hunspell-en-gb:all 1:6.4.3-1
dpkg.log.1:2020-04-23 07:40:43 configure hunspell-en-gb:all 1:6.4.3-1 <none>
dpkg.log.1:2020-04-23 07:40:43 status unpacked hunspell-en-gb:all 1:6.4.3-1
dpkg.log.1:2020-04-23 07:40:43 status half-configured hunspell-en-gb:all 1:6.4.3-1
dpkg.log.1:2020-04-23 07:40:43 status installed hunspell-en-gb:all 1:6.4.3-1
$ 

如果使用 成功删除了软件包,则通常不会出现“状态未安装”的行sudo apt purge ...。您可以检查任何第 22 行列出的包。

通常情况下,
- 如果一个软件包存在于一个系统上并且使用 安装sudo apt install,则 dpkg 日志会在初始安装时/var/log显示该软件包一次,然后在该软件包的每次更新时重复显示 - 如果使用 删除该软件包,则 dkpg 日志通常会反映该情况(每次删除该软件包时)。status:installedsudo apt purgestatus not-installed

为了确认,现在运行,sudo apt install hunspell-en-gb然后运行sudo apt purge hunspell-en-gb。然后再次查询 dpkg 日志:

$ zgrep -E “状态(未)?安装 hunspell-en-gb:”/var/log/dpkg.log* | sed 's/:/: /' | sort -k2,3 -r |列 -t /var/log/dpkg.log: 2020-05-20 15:36:09 状态未安装 hunspell-en-gb:all /var/log/dpkg.log: 2020-05-20 15:36:08 状态已安装 hunspell-en-gb:all 1:6.4.3-1 /var/log/dpkg.log: 2020-05-20 15:35:51 状态已安装 hunspell-en-gb:all 1:6.4.3-1 /var/log/dpkg.log.1: 2020-04-23 07:40:43 状态已安装 hunspell-en-gb:all 1:6.4.3-1 $

请注意,第一行(由于排序)有status not-installed。这正是安装过程中删除的软件包的 dpkg 日志中缺少的内容。这是为什么呢?

答案1

对我来说 - 这样做是为了数据安全,并且为了在安装后出现问题时获得一些线索。

从技术上讲,这种清除或移除是通过package.prermpackage.postrm 维护脚本位于/var/lib/dpkg/(如果包当前已安装,则位于此处)。

例如我sysstat的系统上安装了包,它的sysstat.postrm脚本包含行用于/var/log/sysstat在清除时删除其日志。

然后让我们分析一下您帖子中的包:

  • ubiquityubiquity-frontend-gtk-不拥有中的任何文件/var/log不具有文件/var/log中提及;*.*rm
  • ubiquity-casper-不拥有中的任何文件/var/log不具有 *.*rm文件;
  • ubiquity-slideshow-ubuntu-不拥有中的任何文件/var/log不具有 *.*rm文件。

因此这些包没有用于删除日志文件的删除后指令。

相关内容