在Ubuntu/Debian Linux中,apt-get更新软件包时如何不更新某些软件包
问题
在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命令,因为它易于使用,并且可以作为前端来设置软件包的各种设置。