注1:在文章的最后,我解释了为什么我认为这不是这或者这问题。
笔记2:如果你想避免浪费太多时间阅读问题,你可以直接阅读问题如果你愿意的话,我尝试过。帖子的其余部分仅包含完整性的详细信息。
问题
过去我升级过,因为失误,后来我意识到我需要保留我曾经拥有的旧版本的软件包。
然后我降级了该软件包,但显然新版本保留在某些缓存中,并且该aptitude
工具正在定期升级它(每 75 分钟更确切地说)。
我该如何预防?
也许我应该想办法从一些缓存?
我尝试过
我尝试了所有最常见的方法抓住包,其中描述了这里和这里,但没有成功。
例如,我尝试使用dpkg --set-selections
apt-mark hold
,aptitude hold
以及Lock version
中的功能Synaptic
。
特别是,该Synaptic
工具甚至将该包报告为锁定,但aptitude
仍然对其进行了升级,当然我尝试使用该aptitude
工具来保留该包,但还是发生了同样的情况。
经过一番调查,我意识到通过运行来安装文件可以aptitude
安装较新的版本。绝望的是,我甚至尝试了肮脏的方法来删除该文件,但它甚至重新生成了(因此我猜可能是dpkg
.deb
/var/cache/apt/archives/
下载来自网络或提取来自一些 tar/zip 文件)。
最后,我还尝试使用 完全删除较新版本apt-get purge
,然后使用 安装较旧版本apt-get install
,然后保留它。没用,它仍然会自动升级...
细节
语境
由于编写某些代码时出现兼容性问题,在升级软件包之后,thepackage
我不得不改变主意,我需要降级它,从较新的版本到较旧的版本,比如从1.1
到1.0
。
因此我运行了类似
dpkg -i thepackage_1.0.deb
但每 75 分钟,这个包中的文件就会自动删除并用新版本的文件替换1.1
,就像一些系统脚本一样升级自动包裹。
怎么了
然后,为了调查原因,我用rm
我编写的脚本替换了删除文件的工具,该脚本在调用实际的rm
(已重命名为real_rm
)之前,打印最终调用的命令链 rm
(我通过获取每个进程的 PID 来实现这一点父母)。
然后,我的这个脚本生成的日志文件会打印类似以下内容:
COMMAND: /bin/bash /bin/rm -rf -- /var/lib/dpkg/tmp.ci
CAUSAL CHAIN:
/sbin/init
-> /usr/sbin/cron -f
-> /usr/sbin/CRON -f
-> /bin/sh -c /sbin/maint --mode=cron > /dev/null 2>&1
-> /usr/bin/perl /sbin/maint --mode=cron
-> /usr/bin/perl -I /var/cache/sysmaint/production/vol/linux/ubuntu/16.04/lib/perl /var/cache/sysmaint/production/vol/linux/ubuntu/16.04/maint/017aptitude/maint --nodebug --nosilent --nodryrun --nologperline --colour --nomachineread --trace=none --mode=cron
-> /usr/bin/aptitude -o Dpkg::Options::=--force-confdef -v -y -f install
-> /usr/bin/dpkg --force-confdef --status-fd 57 --unpack --auto-deconfigure /var/cache/apt/archives/thepackage_1.1.deb
从此日志中我们可以看到,通过执行以下命令cron
定期运行aptitude
/usr/bin/aptitude -o Dpkg::Options::=--force-confdef -v -y -f install
此命令执行以下子命令
/usr/bin/dpkg --force-confdef --status-fd 57 --unpack --auto-deconfigure /var/cache/apt/archives/thepackage_1.1.deb
因此,似乎aptitude
正在定期执行以通过dpkg
存储在缓存文件夹中的某些包自动升级,其中一个包是thepackage_1.1.deb
。
注意:为什么我认为这不再是重复的。
我尝试了所有解决方案抓住描述的包这里和这里,但它们就是不起作用。我怀疑这是一个不同的问题,因为包是已在缓存中这可能是为什么保留旧版本的尝试不起作用的原因。也许我应该找到一种方法来消除从缓存中取出吗?
答案1
用于apt-mark hold package_name
暂停此包。
$ apt-mark --help
apt 1.6.1 (amd64)
Usage: apt-mark [options] {auto|manual} pkg1 [pkg2 ...]
apt-mark is a simple command line interface for marking packages
as manually or automatically installed. It can also be used to
manipulate the dpkg(1) selection states of packages, and to list
all packages with or without a certain marking.
Most used commands:
auto - Mark the given packages as automatically installed
manual - Mark the given packages as manually installed
hold - Mark a package as held back
unhold - Unset a package set as held back
showauto - Print the list of automatically installed packages
showmanual - Print the list of manually installed packages
showhold - Print the list of package on hold