如何防止特定软件包的更新?


374

由于存在错误#693758,我希望阻止apt-get upgradeUpdate Manager更新“ libgtk2.0-0”软件包。

如何做到这一点?


@hhlp:但是这个问题询问的是从未安装的软件包。
内森·奥斯曼

1
@乔治·爱迪生(George Edison)-还有软件包存放区,您可以不更新软件包。因此,基本上,保持软件包意味着您要告诉软件包管理器无论如何都保持当前版本。如果更新后当前正在运行的程序的较新版本中断,这将很有用。(您不能持有从未安装过的软件包,也看到我的问题是相同的。)...我现在disable packages from the auto-update
对此

Answers:


553

保持

保留软件包的方法有四种:dpkg,apt,aptitude或dselect。

dpkg

将包裹搁置:

echo "<package-name> hold" | sudo dpkg --set-selections

取消保全:

echo "<package-name> install" | sudo dpkg --set-selections

显示软件包的状态:

dpkg --get-selections

显示单个软件包的状态:

dpkg --get-selections | grep "<package-name>"

易于

持有包裹:

sudo apt-mark hold <package-name>

取消保全:

sudo apt-mark unhold <package-name>

显示所有保留的包裹:

sudo apt-mark showhold

d选择

使用dselect,进入[选择]屏幕,找到您想要保持在其当前状态的包装,然后按=H。更改将在退出[S] elect屏幕后立即生效。


下列方法的局限性在于,将软件包锁定/保持在智能或突触范围内不会影响apt-get / apt。

才能

持有包裹:

sudo aptitude hold <package-name>

取消保全:

sudo aptitude unhold <package-name>

用Synaptic软件包管理器锁定

转到Synaptic软件包管理器(系统>管理> Synaptic软件包管理器)。

单击搜索按钮,然后键入程序包名称。

找到软件包后,将其选中,然后进入“ 软件包”菜单,然后选择“ 锁定版本”

突触菜单

该软件包现在将不会显示在更新管理器中,也不会被更新。


4
这也可以防止安装软件包。安装时devscripts,将打包的很多产品作为“推荐”产品包拉出。由于我不需要邮件服务器(后缀),因此可以通过在运行echo postfix hold | sudo dpkg --set-selections之前运行来禁用其安装sudo apt-get install devscripts。仅在此安装后,此保留操作才会保留,在安装后,重置选择。
Lekensteyn 2011年

3
值得一提的是,程序包保留有时会造成无法解决依赖关系的合法解决方案的情况,从而破坏升级和补丁。如果软件包foo对libbar具有== <或<=依赖关系,那么apt将拒绝升级foo和libbar。随着时间的流逝,这些级联依赖性可能会增长,以阻止大量更新,包括重要的安全更新。您需要删除保留并让升级发生,或者如果发生这种情况,请针对其依赖关系的较新版本重建所保存的软件包。
Stephanie

2
请注意:0.7.25版(Ubuntu Lucid)apt-mark不支持hold
Joril

1
当试图阻止图形驱动程序时,这特别有用。对于ATI用户,apt-mark hold fglrx fglrx-amdcccle fglrx-dev && aptitude hold fglrx fglrx-amdcccle fglrx-dev
EarthmeLon 2013年

8
目前,突触和智能仅将软件包锁定在这些程序中。“其他任何进行软件包升级的内容(请参阅:Update Manager,apt-get,aptitude等)都将忽略此内容。” 从这个问题
holocronweaver

44

搁置软件包“ foo”:

echo "foo hold" | dpkg --set-selections

在您的情况下,我们将搁置葡萄酒:

sudo -i
echo "wine hold" | dpkg --set-selections

删除保留:

sudo -i
echo "wine install" | dpkg --set-selections

另请注意,在保留软件包的同时,您可以通过安装特定版本apt-get install wine=1.2.3。处于保留状态可防止apt-get (dist-)upgrade更改它。
rcoup

@rcoup如果您保留一个旧版本,然后手动升级到一个新版本而没有按照您描述的那样删除保留,那么旧版本是否会保留在缓存中以便您可以返回到它?
cxrodgers

1
@cxrodgers本地缓存(通常为/var/cache/apt/archives)与保留,升级和内容无关,因此您下载的所有版本都将存在,直到您运行apt-get [auto]clean
rcoup

35

我一直在寻找相同的东西,经过大量研究,我发现使用以下语法可以禁止一个特定的版本,但允许下一个更新:

软件包:compiz-plugins-main
引脚:版本1:0.9.7.0〜bzr19-0ubuntu10.1
引脚优先级:-1

这进入/ etc / apt / preferences文件。


9
这是比无限期阻止更新更好的方法
Eero Aaltonen 2013年

我认为,通过这种方法,阻止下一个版本升级重新安装像ubuntu one这样的ubuntu“ adware”或amazon图标的机会更大……
Daniel Alder

19

synaptic使用安装sudo apt-get install synaptic

使用运行,gksudo synaptic然后在搜索框上找到要锁定的软件包,即:gedit

在此处输入图片说明

从包菜单中选择“ 锁定版本”

在此处输入图片说明

就是如此,即使在升级期间,锁定时当前安装的版本也将保持安装状态。


7
请查看“锁定版本并不像听起来那样聪明。它应该按照其提示进行操作,锁定版本...但是它只能将其锁定在Synaptic中。其他任何可以进行软件包升级的内容(请阅读:Update Manager ,apt-get,aptitude等)都忽略了这一点。这很可能是越野车的行为,因此我希望此问题能够及时得到解决。” 来自askubuntu.com/questions/9607/what-does-lock-version-do。目前的状态是什么?如果Synaptic中已锁定某些内容,其他软件包管理器是否会“兑现”该锁定?

2
vasa1:作为0.75.13版本,仍然没有:(同样的问题才能。
syockit

16

防止安装软件包称为“软件包保存”,这非常简单:

回声package_name保持| dpkg --set-selections

...其中package_name *是您要阻止安装的软件包的名称。

注意:以上命令假定具有root特权。换句话说,您可能需要sudo su在运行之前键入。


完美,就是答案。谢谢。
asoundmove 2011年

s/sudo su/sudo -s/g(或sudo -i)。(-i将提供登录外壳,-s不会)。
derobert 2015年

6

由于某些时间apt-get已由代替apt,因此例如,我想阻止Firefox更新到高于56的版本,因为许多附加组件(例如“标签组”)在新的Firefox 57中不再起作用(请参阅“ WebExtensions更新”)。

一个命令可以容纳多个软件包并使用通配符。

阻止Firefox更新

sudo apt-mark hold firefox firefox-locale-*

如果您稍后打算解除对它们的锁定,则可以使用以下命令:

sudo apt-mark unhold firefox firefox-locale-*

4

我突触您可以冻结特定程序包的版本,我不确定这是否会修改apt-get,但一定会停止更新管理器。

要冻结软件包,请以突触方式将其选中,然后打开软件包菜单,然后选择冻结版本。

希望这可以帮助

编辑:这个问题16668处理类似的情况



3

请参阅错误#75332#158981#72806

摘要是,在apt-get / aptitude级别的保持不会触发dpkg中的保持状态(尤其是参见错误72806),而update-manager从dpkg中读取状态。

解决方法以root用户身份运行: echo "package hold" | dpkg --set-selections


2

您可以巧妙地使用“特定替代”,如下所示:

aptitude reinstall ~i oracle-java8-jre:

这是一次性使用(不存储以供将来重新安装),保留特定的覆盖,以重新安装系统中的所有软件包,而不是oracle-java8-jre。

如果您使用Keep特定替代,则该软件包将暂时处于keep aaptitude状态,不会尝试安装它。

如果您认为您的系统在某种程度上受到损害,那么这是一件非常好的事情。


1

如果已安装Synaptic,则可以选择软件包,然后使用菜单软件包->锁定版本防止其被更新。

您可以使用sudo apt-get install synaptic安装Synaptic。我个人认为它比软件中心更有用...再说一遍,我还是老学校。:)


0

有时可能要保留当前安装的所有软件包。这是如何做。

首先保存当前状态,所以可以撤消:

dpkg --get-selections > current_selections.txt

然后,保留所有软件包:

dpkg --get-selections | sed -r "s/\tinstall/hold/" |dpkg --set-selections

最后,当您想恢复到之前的状态时:

dpkg --set-selections < current_selections.txt

一种用例是在创建VM或Amazon AMI快照以从QA迁移到生产环境时。


0

在与Ubuntu 16.04相关的@ soger注释中添加详细信息。

默认情况下,Ubuntu 16.04没有现有的/ etc / apt / preferences文件。如果当前没有该文件,则只需创建一个新文件,并使用上面的@soger描述的节填充该文件,即可从更新中排除给定的包及其依赖项。

然后,运行apt update,您就是GTG。:0)

例如,我有一个带有嵌入式Intel视频卡和NVidia卡的Ubuntu 16.04.5 LTS服务器。NVidia卡是唯一使用的卡。该服务器还使用CUDA驱动程序。我有一个问题,apt一直坚持

va-driver-all

(英特尔驱动程序)需要更新,但无法确定要安装的版本。这真让我发疯,而且我也不需要英特尔驱动程序。我将此文本输入到首选项文件中并刷新了apt,问题已解决。

Package: va-driver-all
Pin: release *
Pin-Priority: -1
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.