Debian/Ubuntu 软件包基础设施是否有某种方式来标记软件包,以便无论其他软件包是否固定,它们都不会被卸载?
我的问题是,有时,Puppet 安装的软件包(当然来自非标准存储库)会导致其他软件包被卸载 - 特别是 openssh-{server,client}。
这种情况的发生原因是,软件包 A 和 B 依赖于软件包 C 的不同版本。如果安装了 A,然后有人要求安装 B,那么 C 的版本就会改变。新版本的 C 与 A 不兼容,因此 A 会被卸载。
有趣的是,这个过程随后被逆转,因为在下一次运行时,Puppet 注意到 A 尚未安装并尝试安装它。
所以,基本上,我想确保绝不卸载,这将阻止 B 的安装。这将被报告为错误,让我意识到这个问题。
如果有人关心的话,Puppet 使用以下命令来安装软件包:
/usr/bin/apt-get -q -y -o DPkg::Options::=--force-confold install <package>
答案1
你需要“保管”包裹,这样apt-get upgrade
就不会在升级到新版本时会将其删除。
echo "package-name hold" | sudo dpkg --set-selections
但是,请注意,明确执行apt-get install package-name
WILL 会覆盖保留,而明确执行apt-get remove package-name
WILL 会卸载它。
如果将其固定到优先级为 1001 或更高的特定版本,甚至apt-get install
不会升级它,但仍可以将其删除。
答案2
这个问题或许可以通过将以下内容添加到 apt.conf[.d] 来解决:
Aptitude::Always-Use-Safe-Resolver "true";
并在 puppet 中对 site.pp 进行如下操作:
Package { provider => 'aptitude' }
但尚未正确测试过。