如何在 CentOS/Rocky Linux 中阻止包和内核更新
在此页
- 先决条件
- 方法 1 - 永久禁用包安装/更新(使用 yum.conf)
- 阻止内核更新
- 通过其回购文件阻止存储库
包管理器可能是对 Linux 用户最有用的工具。您可以使用一条命令从您的 Linux 系统安装、升级和删除任何软件/软件包。但有时,您需要精细控制要安装或升级的包以及要阻止自动升级的包。你为什么想做这个?有时您会发现软件包更新版本有问题。您不希望下次运行
sudo yum upgrade
时升级该软件包。单独升级每个包很痛苦。在本教程中,我们将介绍如何阻止安装或升级某些包,以及如何阻止安装特定版本的包或内核。
注意:一段时间后很容易忘记您持有的软件包,即使它们的无错误版本已经发布。因此,请保持警惕,因为长时间持有包裹会带来安全问题。
我们将在这里讨论五种方法。所有这些方法都将涉及
yum
(Yellow dog Updater, Modified) 和dnf
(Dandified YUM) 包管理器。先决条件
- 装有 CentOS 或 Rocky Linux 或 Alma Linux 的服务器。本教程使用了 Rocky Linux 9,但此处的命令应该也适用于其他操作系统和旧版本。
- 具有 sudo 权限的非根用户。
方法 1 - 永久禁用包安装/更新(使用 yum.conf)
要永久锁定软件包以防止安装、更新或删除,我们可以使用
/etc/yum.conf
或/etc/dnf/dnf.conf
文件。它应该如下所示。
[main] gpgcheck=1 installonly_limit=3 clean_requirements_on_remove=True best=True skip_if_unavailable=False
如果要阻止安装、更新或删除软件包(例如 nginx),请在文件末尾附加以下行。
exclude=nginx
如果你想停止所有的 nginx 包,那么你可以使用
*
字符。exclude=nginx*
如果要排除多个包,可以用空格分隔它们的名称。
exclude=nginx php
即使您升级系统,锁定的软件包也将保持相同的版本。这对于阻止图形驱动程序特别有用。
让我们尝试安装被阻止的软件包 nginx。
$ sudo dnf install nginx or $ sudo yum install nginx
您将获得类似的输出。
Last metadata expiration check: 0:00:21 ago on Mon 05 Dec 2022 10:42:01 AM UTC. All matches were filtered out by exclude filtering for argument: nginx Error: Unable to find a match: nginx
您还可以在此处通过其架构来阻止软件包。例如,如果要阻止 32 位包,可以在
/etc/yum.conf
文件中输入以下行。exclude=*.i?86 *i686
这种方法有一个重要的警告。虽然软件包不会在使用命令
sudo yum upgrade
或在升级系统时自动升级,但您仍然可以手动删除软件包。sudo yum remove
仍然可以处理保留的包。此方法仅锁定它们以防止自动更改。除非您决定手动删除它们,否则无论如何保留它们将使它们保持当前版本。
阻止内核更新
要阻止内核更新,请使用以下命令。
$ sudo dmf --exclude=kernel* update or $ sudo yum --exclude=kernel* update
您可以在所有其他方法中使用
kernel*
作为包名称来阻止内核更新。方法 2 - 暂时禁用包安装/更新
此方法涉及使用带有附加参数的 yum 命令。
在更新任何包时,使用 -x 开关和您的命令来阻止您不想更新的特定包。
$ sudo dnf -x nginx update or $ sudo yum -x nginx update
上面的命令将更新系统上除 nginx 包之外的所有包。要使用单个命令阻止多个包,请多次使用 -x 开关。
$ sudo dnf -x nginx -x php update or $ sudo yum -x nginx -x php update
您也可以以相同的方式使用 --exclude 开关代替 -x。
$ sudo dnf --exclude nginx, php or $ sudo yum --exclude nginx, php
方法 3 - 使用存储库(使用 .repo 文件)
如果您通过其存储库安装了一个包,那么还有另一种方法可以阻止它升级。这是通过编辑其
.repo
文件来完成的,您可以在/etc/yum.repos.d
目录中找到该文件。假设您的系统添加了 Epel 存储库并且您不想从中安装
golang
包,您可以通过添加行exclude=certbot
来阻止它 在/etc/yum.repos.d/epel.repo
文件中,如图所示。[epel] name=Extra Packages for Enterprise Linux 8 - $basearch # It is much more secure to use the metalink, but if you wish to use a local mirror # place its address here. #baseurl=https://download.example/pub/epel/8/Everything/$basearch metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-8&arch=$basearch&infra=$infra&content=$contentdir enabled=1 gpgcheck=1 countme=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-8 exclude=certbot ...
现在,尝试安装可通过 Epel 存储库获得的
certbot
包。$ sudo dnf install certbot or $ sudo yum install certbot
您将获得类似的输出。
Extra Packages for Enterprise Linux 8 - x86_64 20 kB/s | 4.5 kB 00:00 All matches were filtered out by exclude filtering for argument: certbot Error: Unable to find a match: certbot
方法 4 - 阻止整个存储库更新
或者,您可以阻止更新整个存储库。
首先,让我们检查我们系统上的所有存储库。
$ dnf repolist or $ yum repolist
您将获得类似的输出。
repo id repo name appstream Rocky Linux 8 - AppStream baseos Rocky Linux 8 - BaseOS digitalocean-agent DigitalOcean Agent docker-ce-stable Docker CE Stable - x86_64 epel Extra Packages for Enterprise Linux 8 - x86_64 extras Rocky Linux 8 - Extras nginx-stable nginx stable repo
要排除更新 Epel 存储库,请使用以下命令。
$ sudo dnf update --disablerepo=epel or $ sudo yum update --disablerepo=epel
您可以通过用逗号分隔它们的 ID 来禁用多个存储库。
$ sudo dnf update --disablerepo=epel, extras or $ sudo yum update --disablerepo=epel, extras
通过他们的回购文件阻止存储库
还有另一种阻止存储库的方法,它涉及编辑特定的存储库文件。
让我们打开
epel.repo
文件进行编辑。$ sudo nano /etc/yum.repos.d/epel.repo
将
enabled
变量的值从 1 更改为 0。[epel] name=Extra Packages for Enterprise Linux 8 - $basearch # It is much more secure to use the metalink, but if you wish to use a local mirror # place its address here. #baseurl=https://download.example/pub/epel/8/Everything/$basearch metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-8&arch=$basearch&infra=$infra&content=$contentdir enabled=0 gpgcheck=1 countme=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-8 ...
通过按 Ctrl + X 并在出现提示时输入 Y 来保存文件。
现在,让我们尝试安装
certbot
包,它在epel
存储库中可用。$ sudo dnf install certbot or $ sudo yum install certbot
您将获得类似的输出。
Last metadata expiration check: 0:02:10 ago on Mon 05 Dec 2022 10:48:31 AM UTC. No match for argument: certbot Error: Unable to find a match: certbot
方法 5 - 阻止特定版本的包(使用版本锁插件)
Versionlock 是 Yum 包管理器的插件。此插件不允许将软件包升级到比执行锁定时安装的版本更高的版本。
首先,安装版本锁。
$ sudo dnf install dnf-plugin-versionlock or $ sudo yum install dnf-plugin-versionlock
这还将在您的系统上创建一个文件
/etc/yum/pluginconf.d/versionlock.list
。要锁定系统上安装的当前版本的
mariadb-server
,请运行以下命令。$ sudo dnf versionlock mariadb-server or $ sudo yum versionlock mariadb-server
您将获得类似的输出。
Last metadata expiration check: 0:01:05 ago on Mon 05 Dec 2022 12:14:16 PM UTC. Adding versionlock on: mariadb-server-3:10.3.35-1.module+el8.6.0+1005+cdf19c22.*
您可以一次添加多个包。
$ sudo dnf versionlock evolution golang or $ sudo yum versionlock evolution golang
您将获得类似的输出。
Last metadata expiration check: 0:01:05 ago on Mon 05 Dec 2022 12:14:16 PM UTC. Adding versionlock on: evolution-0:3.28.5-18.el8.* Adding versionlock on: golang-0:1.18.4-1.module+el8.7.0+1073+99e3b3cd.*
让我们尝试更新
mariadb-server
包。$ sudo dnf update mariadb-server or $ sudo yum update mariadb-server
您将获得类似的输出。
Last metadata expiration check: 0:02:07 ago on Mon 05 Dec 2022 12:14:16 PM UTC. Package mariadb-server available, but not installed. No match for argument: mariadb-server Error: No packages marked for upgrade.
要通过 versionlock 插件检查被阻止的包列表,请使用以下命令。
$ dnf versionlock list or $ yum versionlock list
您将获得类似的输出。
Last metadata expiration check: 0:00:05 ago on Wed 07 Dec 2022 02:36:20 AM UTC. elasticsearch-7.17.5-1.x86_64 mariadb-server-3:10.3.35-1.module+el8.6.0+1005+cdf19c22.* evolution-0:3.28.5-18.el8.* golang-0:1.18.4-1.module+el8.7.0+1073+99e3b3cd.*
要从版本锁中删除包,请使用以下命令。
$ sudo dnf versionlock delete mariadb-server or $ sudo yum versionlock delete mariadb-server
您将获得以下输出。
Deleting versionlock for: mariadb-server-3:10.3.35-1.module+el8.6.0+1005+cdf19c22.*
要丢弃列表并清除块,请使用以下命令。
$ sudo dnf versionlock clear or $ sudo yum versionlock clear
或者,您可以编辑文件
/etc/yum/pluginconf.d/versionlock.list
以阻止使用版本锁插件的包。要将已安装的包添加到文件中,请使用以下命令。
$ sudo sh -c 'rpm -qa | grep evolution >> /etc/yum/pluginconf.d/versionlock.list'
上面的命令通过将
evolution
包添加到列表来阻止它。我们使用了rpm -qa | grep evolution
获取完整的包名。和sudo sh -c
命令运行一个 sudo shell,在该 shell 下运行写入文件的命令。结论
这就是本教程的内容。您现在应该能够阻止您不想在 CentOS 或 Rocky Linux 系统上安装或升级的任何特定版本的软件包。