在Ubuntu/Debian Linux上apt-get保留软件包

时间:2020-01-09 10:37:14  来源:igfitidea点击:

如何在Ubuntu/Debian Linux上保留软件包以防止更新特定软件包?
如何使用apt命令/apt-get命令将软件包更新列入黑名单?
我们可以在Debian或Ubuntu Linux下使用apt,apt-mark,aptitude,dpkg和dselect命令行选项阻止软件包。
我们有多种选择来保留软件包。
让我们一一看一下。

使用apt-get/apt时保留软件包(方法1)

apt-mark方法适用于已安装和已卸载的软件包。

通常,我们运行以下两个命令来更新所有软件包:

$ sudo apt update && sudo apt upgrade
## OR ##
$ sudo apt-get update && sudo apt-get upgrade

步骤1列出可用更新

运行apt命令:

$ sudo apt list --upgradable

步骤2强制apt-get使用apt-mark阻止名为mariadb-server的软件包

如下所示,将hold选项传递给apt-mark命令以将软件包标记为保留,这将阻止该软件包被自动安装,升级或删除:

$ sudo apt-mark hold package-name
$ sudo apt-mark hold mariadb-server
mariadb-server set on hold.

步骤3显示保留的软件包列表

让我们打印保留的软件包列表:

$ apt-mark showhold

步骤4取消保留

是否要取消对软件包的先前设置的保留以再次允许所有操作?
尝试:

$ sudo apt-mark unhold pacakgeName
$ sudo apt-mark unhold mariadb-server
Canceled hold on mariadb-server.

如何使用dpkg命令防止特定软件包的更新(方法2)

使用dpkg方法时,必须安装软件包以使其暂停。
否则,您将收到如下错误:dpkg:警告:软件包不在状态或第1行上没有可用的数据库dpkg:警告:发现未知的软件包;这可能意味着可用的数据库已过时,需要通过前端方法进行更新;请参阅常见问题解答<https://wiki.debian.org/Teams/Dpkg/FAQ>

我们可以将软件包搁置如下:

$ echo "{pkgName} hold" | sudo dpkg --set-selections
# Put a bash package on hold #
$ echo "bash hold" | sudo dpkg --set-selections

获取您的软件包状态:

$ dpkg --get-selections pkgname
## Use the grep command/egrep command as filter to see the status of a single package named bash ##
$ dpkg --get-selections | grep bash

是否要删除保全?
尝试:

$ echo "pkgName install" | sudo dpkg --set-selections
$ echo "bash install" | sudo dpkg --set-selections

使用aptitude命令更新黑名单软件包

此方法适用于已安装和已卸载的程序包。

让我们拿着一个叫做nginx的包:

$ sudo aptitude hold pkgNameHere
$ sudo aptitude hold nginx

让我们删除/删除名为nginx的软件包的保留:

$ sudo aptitude unhold pkgNameHere
$ sudo aptitude unhold nginx

我们还可以禁止将软件包升级到特定版本,同时允许将其自动升级到将来的版本。
例如,这对于避免已知的grub等软件包的损坏版本很有用:

$ sudo aptitude forbid-version {pkg}={version}
$ sudo aptitude forbid-version bash=5.0-6ubuntu1.1

当您尝试使用aptitude命令升级软件包时,将看到以下消息:

$ sudo aptitude upgrade
The following packages will be upgraded: 
  libcomerr2 libx11-data 
2 packages upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
....

显示如何禁用或锁定/黑名单程序包的示例

打开终端应用程序,然后刷新存储库:

$ sudo apt update

列表升级:

$ apt list --upgradable

保留基本文件,mailutils-common,mailutils和mariadb-common软件包:

$ sudo apt-mark hold base-files mailutils-common mailutils mariadb-common

尝试更新系统:

$ sudo apt upgrade

取消打包:

$ sudo apt-mark unhold base-files mailutils-common mailutils mariadb-common

应用待处理的更新:

$ sudo apt upgrade

通过apt update命令将软件包列入黑名单或保留该软件包。

使用Ansible IT自动化/DevOps工具阻止软件包

这是用于保存软件包的示例剧本:

# Prevent nginx from being upgraded
- dpkg_selections:
    name: python
    selection: hold
 
# Kept multiple packages back (hold packages)
- dpkg_selections: name={{ item }} selection=hold
  with_items:
          - apache2
          - php7-fpm
          - nginx
          - mariadb-server
 
# Removing hold using Ansible
- dpkg_selections:
    name: python
    selection: install