如何从apt-get升级中排除特定软件包

时间:2020-03-05 15:26:40  来源:igfitidea点击:

在进行某些项目时,有时我们需要环境的稳定性。
更新程序包可能会导致整个项目失败。
有时,我们不小心升级了那些软件包,这在服务器上造成了严重的问题。
这就是为什么维护特定版本的软件包很重要的原因。

本教程将向我们展示如何在Ubuntu或者Debian发行版的升级中排除特定的软件包。

1)使用某些命令排除软件包

在系统的全面升级过程中,存在一些用于排除或者保留特定程序包的方法。
可以将包装标记为退货。
在本文中,我们将使用virtualbox包作为示例。
我们可以看到已安装的版本

# dpkg -l | grep virtualbox
ii  virtualbox    5.0.18-dfsg-2build1   amd64   x86  virtualization solution - base binaries

现在我们可以看到我们有可用的更新版本

# apt list --upgradable
Listing... Done
virtualbox/xenial-updates 5.0.40-dfsg-0ubuntu1.16.04.2 amd64 [upgradable from: 5.0.18-dfsg-2build1]

我们可以使用以下命令标记安装包

apt-mark

我们可以使用“ apt-mark”命令以及“ hold”选项。
这将防止软件包被自动安装,升级或者删除。
语法如下

apt-mark hold package

我们可以按照以下方式实际使用它

# apt-mark hold virtualbox 
virtualbox set on hold.

现在我们可以检查如下

# apt upgrade
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Calculating upgrade... Done
The following packages have been kept back:
  virtualbox
0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.

我们会看到我们无法升级该程序包。

要取消标记,请使用以下语法

apt-mark unhold package

实际上你有下面的命令

# apt-mark unhold virtualbox
Canceled hold on virtualbox.

dpkg

我们也可以使用'dpkg --set-selection'命令标记软件包。
语法如下

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

实际上,我们可以按照以下步骤进行操作

# echo "virtualbox hold" | dpkg --set-selections

我们没有任何显示结果的退货。
因此,直接进行升级检查

# apt upgrade
Reading package lists... Done
Building dependency tree 
Reading state information... Done
Calculating upgrade... Done
The following packages have been kept back:
 virtualbox
0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.

我们可以看到它有效。

现在要释放的命令是不同的,并且遵循语法

echo "package install" | sudo dpkg --set-selections

因此,使用命令

# echo "virtualbox install" | dpkg --set-selections

我们将不会得到回报。
因为我们已经是root用户,所以我们不使用sudo

aptitude

我们也可以使用aptitude命令。
默认情况下,该命令不存在于系统上,因此我们需要按以下方式安装

# apt install aptitude
Reading package lists... Done
Building dependency tree 
Reading state information... Done
The following additional packages will be installed:
 aptitude-common libcwidget3v5

要使用命令标记软件包,请使用以下语法

aptitude hold package

当我们用敏锐度标记软件包时,我们将不会得到退货。

# aptitude hold virtualbox
No packages will be installed, upgraded, or removed.
0 packages upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
Need to get 0 B of archives. After unpacking 0 B will be used.

如果我们使用“智能升级”检查结果,则不会提及已标记的软件包,但是如果尝试“适当升级”,则将获得该软件包。

我们可以使用以下语法

aptitude unhold package

如下

# aptitude unhold virtualbox
No packages will be installed, upgraded, or removed.
0 packages upgraded, 0 newly installed, 0 to remove and 1 not upgraded.

dselect

我们可以使用“ dselect”命令,它是dpkg的前端,用于管理Debian和基于Debian的Linux发行版中的软件包。
默认情况下不存在,因此我们需要安装它

# apt install dselect

启动命令

现在,请仔细阅读帮助。

现在,我们可以使用空格键退出帮助并找到要保存的包。
我们可以使用“ /”进行研究

现在,我们可以使用'H'或者'='来保存该程序包

现在,我们可以使用'Q'退出。
它将打开第一个菜单,选择退出。
我们可以通过升级检查

# apt upgrade
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Calculating upgrade... Done
The following packages have been kept back:
  virtualbox
0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.

我们可以看到它有效。

如果要取消包装的标记,则需要使用“ +”代替“ H”或者“ =”,以保持三颗星在结果上,如下所示

2)使用apt配置文件阻止程序包

标记软件包的一种方法是编辑“/etc/apt/preferences”文件。
为了在升级整个系统时不升级软件包,我们必须将apt引脚优先级设置为小于零(0)。
如果文件不存在,则必须创建它。
我们需要遵守以下语法

Package: <package-name> ('*' for all packages)
Pin: release * (o=Ubuntu for Ubuntu origin)
Pin-Priority: <less than 0>

在“释放引脚”行上,我们可以添加程序包的始发者,对于“引脚优先级”编号,数字越大表示优先级越高,“-1”等于忽略该程序包。
还有一些其他选项可以使用。

要阻止virtualbox软件包,请如下编辑文件

Package: virtualbox
Pin: release o=Ubuntu
Pin-Priority: -1

保存并退出。
我们只需要阻止该软件包即可。
要取消打包,我们可以注释文件的行或者直接删除文件。

我们会看到可以使用某些方法来阻止程序包。
这对于维护项目的稳定版本很有用。
我们可以选择自己喜欢的方法。
我们无需为同一目标使用两种或者多种方法。