Cách chặn các bản cập nhật gói và hạt nhân trong CentOS / Rocky Linux

theanh

Administrator
Nhân viên
Trình quản lý gói có lẽ là công cụ hữu ích nhất đối với người dùng Linux. Bạn có thể cài đặt, nâng cấp và xóa bất kỳ phần mềm/gói nào khỏi hệ thống Linux của mình chỉ bằng một lệnh. Nhưng đôi khi, bạn cần kiểm soát chi tiết gói nào bạn muốn cài đặt hoặc nâng cấp và gói nào sẽ chặn không cho tự động nâng cấp. Tại sao bạn muốn làm điều này? Đôi khi bạn phát hiện ra rằng phiên bản cập nhật của một gói bị lỗi. Bạn không muốn gói đó nâng cấp vào lần tiếp theo bạn chạy sudo yum upgrade. Và việc nâng cấp từng gói riêng lẻ rất phiền phức.

Trong hướng dẫn này, chúng tôi sẽ đề cập đến cách chặn một số gói nhất định khỏi việc cài đặt hoặc nâng cấp và cách chặn các phiên bản cụ thể của các gói hoặc hạt nhân khỏi việc cài đặt.

Lưu ý: Bạn dễ quên những gói nào mình đã giữ sau một thời gian, ngay cả khi phiên bản không có lỗi của chúng đã ra mắt. Vì vậy, hãy luôn cảnh giác vì việc giữ các gói trong thời gian dài có thể gây ra các vấn đề về bảo mật.

Chúng tôi sẽ thảo luận về năm phương pháp ở đây. Tất cả các phương pháp này sẽ liên quan đến trình quản lý gói yum (Trình cập nhật Yellow dog, Đã sửa đổi) và trình quản lý gói dnf (Dandified YUM).

Điều kiện tiên quyết​

  • Máy chủ chạy CentOS hoặc Rocky Linux hoặc Alma Linux. Rocky Linux 9 được sử dụng cho hướng dẫn này nhưng các lệnh ở đây cũng sẽ hoạt động tốt với các Hệ điều hành khác và các bản phát hành cũ hơn.
  • Người dùng không phải root có quyền sudo.

Phương pháp 1 - Vô hiệu hóa vĩnh viễn Cài đặt/Cập nhật gói (Sử dụng yum.conf)​

Để khóa vĩnh viễn một gói không cho cài đặt, cập nhật hoặc xóa, chúng ta có thể sử dụng /etc/yum.conf hoặc /etc/dnf/dnf.conf tệp.

Nó sẽ trông giống như sau.
Mã:
[main]
gpgcheck=1
installonly_limit=3
clean_requirements_on_remove=True
best=True
skip_if_unavailable=False
Nếu bạn muốn giữ một gói, ví dụ như nginx không được cài đặt, cập nhật hoặc xóa, hãy thêm dòng sau vào cuối tập tin.
Mã:
exclude=nginx
Nếu bạn muốn dừng tất cả các gói nginx, thì bạn có thể sử dụng * ký tự.
Mã:
exclude=nginx*
Nếu bạn muốn loại trừ nhiều hơn một gói, bạn có thể phân tách tên của chúng bằng dấu cách.
Mã:
exclude=nginx php
Gói bị khóa sẽ vẫn ở cùng phiên bản ngay cả khi bạn nâng cấp hệ thống. Điều này đặc biệt hữu ích khi giữ lại trình điều khiển đồ họa.

Chúng ta hãy thử cài đặt gói bị chặn, nginx.
Mã:
$ sudo dnf install nginx
or
$ sudo yum install nginx
Bạn sẽ nhận được kết quả tương tự.
Mã:
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
Bạn cũng có thể chặn các gói thông qua kiến trúc của chúng tại đây. Ví dụ, nếu bạn muốn chặn các gói 32 bit, bạn có thể nhập dòng sau vào tệp /etc/yum.conf.
Mã:
exclude=*.i?86 *i686
Có một lưu ý quan trọng với phương pháp này. Mặc dù gói sẽ không được tự động nâng cấp khi sử dụng lệnh sudo yum upgrade hoặc khi nâng cấp hệ thống, bạn vẫn có thể xóa gói theo cách thủ công. sudo yum remove vẫn hoạt động trên các gói được giữ lại.

Phương pháp này chỉ khóa chúng khỏi việc tự động thay đổi. Giữ chúng ở trạng thái chờ sẽ giữ chúng ở phiên bản hiện tại bất kể thế nào trừ khi bạn quyết định xóa chúng theo cách thủ công.

Chặn cập nhật hạt nhân​

Để chặn cập nhật hạt nhân, hãy sử dụng lệnh sau.
Mã:
$ sudo dmf --exclude=kernel* update
or
$ sudo yum --exclude=kernel* update
Bạn có thể sử dụng kernel* làm tên gói trong tất cả các phương pháp khác để chặn các bản cập nhật Kernel.

Phương pháp 2 - Tạm thời vô hiệu hóa Cài đặt/Cập nhật gói​

Phương pháp này bao gồm việc sử dụng lệnh yum với một tham số bổ sung.

Vào thời điểm cập nhật bất kỳ gói nào, hãy sử dụng công tắc -x với lệnh của bạn để chặn các gói cụ thể mà bạn không muốn cập nhật.
Mã:
$ sudo dnf -x nginx update
or
$ sudo yum -x nginx update
Lệnh trên sẽ cập nhật tất cả các gói ngoại trừ gói nginx trên hệ thống của bạn. Để chặn nhiều gói bằng một lệnh, hãy sử dụng công tắc -x nhiều lần.
Mã:
$ sudo dnf -x nginx -x php update
or
$ sudo yum -x nginx -x php update
Bạn cũng có thể sử dụng công tắc --exclude thay cho -x theo cùng một cách.
Mã:
$ sudo dnf --exclude nginx, php
or
$ sudo yum --exclude nginx, php

Phương pháp 3 - Sử dụng Kho lưu trữ (Sử dụng .repo files)​

Nếu bạn đã cài đặt một gói thông qua kho lưu trữ của nó, thì có một cách khác để ngăn không cho nó được nâng cấp. Điều này được thực hiện bằng cách chỉnh sửa tệp .repo mà bạn có thể tìm thấy trong thư mục /etc/yum.repos.d.

Giả sử hệ thống của bạn đã thêm kho lưu trữ Epel và bạn không muốn cài đặt golang gói từ nó, bạn có thể chặn nó bằng cách thêm dòng exclude=certbot trong /etc/yum.repos.d/epel.repo tệp như hiển thị.
Mã:
[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
...
Bây giờ, hãy thử cài đặt gói certbot có sẵn thông qua kho lưu trữ Epel.
Mã:
$ sudo dnf install certbot
or
$ sudo yum install certbot
Bạn sẽ nhận được một đầu ra.
Mã:
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

Phương pháp 4 - Chặn toàn bộ kho lưu trữ khỏi việc cập nhật​

Ngoài ra, bạn có thể chặn toàn bộ kho lưu trữ khỏi việc cập nhật.

Đầu tiên, hãy kiểm tra tất cả các kho lưu trữ trên hệ thống.
Mã:
$ dnf repolist
or
$ yum repolist
Bạn sẽ nhận được kết quả tương tự.
Mã:
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
Để loại trừ kho lưu trữ Epel khỏi việc cập nhật, hãy sử dụng lệnh sau lệnh.
Mã:
$ sudo dnf update --disablerepo=epel
or
$ sudo yum update --disablerepo=epel
Bạn có thể vô hiệu hóa nhiều kho lưu trữ bằng cách phân tách id của chúng bằng dấu phẩy.
Mã:
$ sudo dnf update --disablerepo=epel, extras
or
$ sudo yum update --disablerepo=epel, extras

Chặn kho lưu trữ thông qua tệp kho lưu trữ của chúng​

Có một cách khác để chặn kho lưu trữ liên quan đến việc chỉnh sửa tệp repo.

Chúng ta hãy mở tệp epel.repo để chỉnh sửa.
Mã:
$ sudo nano /etc/yum.repos.d/epel.repo
Thay đổi giá trị của enabled biến từ 1 đến 0.
Mã:
[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
...
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Bây giờ, hãy thử cài đặt gói certbot có sẵn trong epel kho lưu trữ.
Mã:
$ sudo dnf install certbot
or
$ sudo yum install certbot
Bạn sẽ nhận được kết quả tương tự.
Mã:
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

Phương pháp 5 - Chặn các gói ở phiên bản cụ thể (Sử dụng plugin versionlock)​

Versionlock là một plugin cho trình quản lý gói Yum. Plugin này không cho phép nâng cấp các gói lên phiên bản cao hơn phiên bản đã cài đặt tại thời điểm thực hiện khóa.

Đầu tiên, hãy cài đặt versionlock.
Mã:
$ sudo dnf install dnf-plugin-versionlock
or
$ sudo yum install dnf-plugin-versionlock
Điều này cũng sẽ tạo một tệp /etc/yum/pluginconf.d/versionlock.list trên hệ thống của bạn.

Để khóa phiên bản hiện tại của mariadb-server được cài đặt trên hệ thống của bạn, hãy chạy lệnh sau lệnh.
Mã:
$ sudo dnf versionlock mariadb-server
or
$ sudo yum versionlock mariadb-server
Bạn sẽ nhận được kết quả tương tự.
Mã:
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.*
Bạn có thể thêm nhiều gói tại một lần.
Mã:
$ sudo dnf versionlock evolution golang
or
$ sudo yum versionlock evolution golang
Bạn sẽ nhận được kết quả tương tự.
Mã:
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.*
Chúng ta hãy thử cập nhật mariadb-server gói.
Mã:
$ sudo dnf update mariadb-server
or
$ sudo yum update mariadb-server
Bạn sẽ nhận được một gói tương tự đầu ra.
Mã:
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.
Để kiểm tra danh sách các gói bị chặn thông qua plugin khóa phiên bản, hãy sử dụng lệnh sau.
Mã:
$ dnf versionlock list
or
$ yum versionlock list
Bạn sẽ nhận được một đầu ra.
Mã:
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.*
Để xóa gói khỏi khóa phiên bản, hãy sử dụng lệnh sau.
Mã:
$ sudo dnf versionlock delete mariadb-server
or
$ sudo yum versionlock delete mariadb-server
Bạn sẽ nhận được thông tin sau đầu ra.
Mã:
Deleting versionlock for: mariadb-server-3:10.3.35-1.module+el8.6.0+1005+cdf19c22.*
Để loại bỏ danh sách và xóa các khối, hãy sử dụng lệnh sau.
Mã:
$ sudo dnf versionlock clear
or
$ sudo yum versionlock clear
Ngoài ra, bạn có thể chỉnh sửa tệp /etc/yum/pluginconf.d/versionlock.list để chặn các gói bằng plugin khóa phiên bản.

Để thêm một gói đã cài đặt vào tệp, hãy sử dụng lệnh sau.
Mã:
$ sudo sh -c 'rpm -qa | grep evolution >> /etc/yum/pluginconf.d/versionlock.list'
Lệnh trên chặn evolution gói bằng cách thêm nó vào danh sách. Chúng tôi đã sử dụng rpm -qa | grep evolution để lấy tên gói đầy đủ. Và lệnh

sudo sh -c chạy một shell sudo trong đó các lệnh ghi vào tệp chạy.

Kết luận​

Vậy là hết hướng dẫn này. Bây giờ bạn có thể chặn bất kỳ phiên bản cụ thể nào của bất kỳ gói nào mà bạn không muốn cài đặt hoặc nâng cấp trên hệ thống CentOS hoặc Rocky Linux của mình.
 
Back
Bên trên