在Ubuntu/Debian Linux中,apt-get更新软件包时如何不更新某些软件包

时间:2019-11-20 08:54:13  来源:igfitidea点击:

问题

在Ubuntu/Debian Linux上如何保留某些软件包不进行更新?

在使用apt命令/apt-get命令时,如何将某些软件包加入不更新列表?

解决方案

在Debian或Ubuntu Linux中,可以使用apt,apt-mark,aptitude,dpkg和dselect命令行选项阻止软件包。
我们有多种选择来保留软件包。

使用apt-get/apt时保留软件包不更新

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

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

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

列出可用的更新

运行apt命令:

$ sudo apt list --upgradable

使用apt-mark,使apt-get保留mariadb-server软件包

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

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

Linux查看不进行更新,升级的软件包列表

让我们查看保留的软件包列表:

$ apt-mark showhold

取消保留的软件包

要取消保留的软件包,执行下面命令:

$ sudo apt-mark unhold pacakgeName
$ sudo apt-mark unhold mariadb-server

输出示例:

Canceled hold on mariadb-server.

使用dpkg命令时,如何防止指定的软件包的更新

使用dpkg方法时,必须安装软件包以使其暂停。否则,您将收到如下错误:dpkg: warning: package not in status nor available database at line 1: PACKAGE_NAME_HERE dpkg: warning: found unknown packages; this might mean the available database is outdated, and needs to be updated through a frontend method;

dpkg:警告:软件包不在状态或第1行上没有可用的数据库dpkg:警告:发现未知的软件包;这可能意味着可用的数据库已过时,需要通过前端方法进行更新;

我们可以像下面这样将软件包置于hold状态:

$ 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

要删除hold的软件包,执行:

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

使用aptitude命令时,软件包不更新的列表

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

将nginx包置于hold状态:

$ sudo aptitude hold pkgNameHere
$ sudo aptitude hold nginx

删除保留的nginx软件包(解除hold状态)

$ sudo aptitude unhold pkgNameHere
$ sudo aptitude unhold nginx

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

$ 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

保留base-files,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

更新上一次未进行更新的软件包(处于pending状态),即base-files mailutils-common mailutils mariadb-common:

$ sudo apt upgrade

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

下面是保留软件包不进行更新的playbook示例:

# 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

总结

您学习了如何在使用apt update或apt-get update命令时保留软件包。我强烈建议您使用apt-mark命令,因为它易于使用,并且可以作为前端来设置软件包的各种设置。