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
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
Nó sẽ trông giống như sau.
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.
Nếu bạn muốn dừng tất cả các gói nginx, thì bạn có thể sử dụng
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.
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.
Bạn sẽ nhận được kết quả tương tự.
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
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
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.
Bạn có thể sử dụng
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.
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.
Bạn cũng có thể sử dụng công tắc --exclude thay cho -x theo cùng một cách.
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
Bây giờ, hãy thử cài đặt gói
Bạn sẽ nhận được một đầu ra.
Đầu tiên, hãy kiểm tra tất cả các kho lưu trữ trên hệ thống.
Bạn sẽ nhận được kết quả tương tự.
Để 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.
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.
Chúng ta hãy mở tệp
Thay đổi giá trị của
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
Bạn sẽ nhận được kết quả tương tự.
Đầu tiên, hãy cài đặt versionlock.
Điều này cũng sẽ tạo một tệp
Để khóa phiên bản hiện tại của
Bạn sẽ nhận được kết quả tương tự.
Bạn có thể thêm nhiều gói tại một lần.
Bạn sẽ nhận được kết quả tương tự.
Chúng ta hãy thử cập nhật
Bạn sẽ nhận được một gói tương tự đầu ra.
Để 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.
Bạn sẽ nhận được một đầu ra.
Để xóa gói khỏi khóa phiên bản, hãy sử dụng lệnh sau.
Bạn sẽ nhận được thông tin sau đầu ra.
Để loại bỏ danh sách và xóa các khối, hãy sử dụng lệnh sau.
Ngoài ra, bạn có thể chỉnh sửa tệp
Để thêm một gói đã cài đặt vào tệp, hãy sử dụng lệnh sau.
Lệnh trên chặn
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
Mã:
exclude=nginx
*
ký tự.
Mã:
exclude=nginx*
Mã:
exclude=nginx php
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
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
/etc/yum.conf
.
Mã:
exclude=*.i?86 *i686
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
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
Mã:
$ sudo dnf -x nginx -x php update
or
$ sudo yum -x nginx -x php update
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
...
certbot
có sẵn thông qua kho lưu trữ Epel.
Mã:
$ sudo dnf install certbot
or
$ sudo yum install certbot
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
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
Mã:
$ sudo dnf update --disablerepo=epel
or
$ sudo yum update --disablerepo=epel
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
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
...
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
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
/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
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.*
Mã:
$ sudo dnf versionlock evolution golang
or
$ sudo yum versionlock evolution golang
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.*
mariadb-server
gói.
Mã:
$ sudo dnf update mariadb-server
or
$ sudo yum update mariadb-server
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.
Mã:
$ dnf versionlock list
or
$ yum versionlock list
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.*
Mã:
$ sudo dnf versionlock delete mariadb-server
or
$ sudo yum versionlock delete mariadb-server
Mã:
Deleting versionlock for: mariadb-server-3:10.3.35-1.module+el8.6.0+1005+cdf19c22.*
Mã:
$ sudo dnf versionlock clear
or
$ sudo yum versionlock clear
/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'
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ệnhsudo sh -c
chạy một shell sudo trong đó các lệnh ghi vào tệp chạy.