APT 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à gỡ bỏ 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
Hướng dẫn này 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 ta sẽ thảo luận về hai phương pháp ở đây. Phương pháp đầu tiên sẽ chặn tất cả các cài đặt và nâng cấp cho một gói nhất định. Phương pháp thứ hai cung cấp khả năng kiểm soát chi tiết hơn, cho phép bạn chặn các phiên bản cụ thể của một gói.
Ví dụ, nếu bạn muốn giữ một gói,
Bạn sẽ thấy thông báo sau đầu ra.
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.
Để xóa lệnh giữ gói, hãy đưa ra lệnh sau.
Bạn sẽ thấy đầu ra sau.
Có một cảnh báo quan trọng với lệnh 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. Việc 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.
Mỗi gói có một mức độ ưu tiên theo số dựa trên APT quyết định có cài đặt gói đó hay không và nếu có thì sẽ chọn gói đó từ kho lưu trữ nào.
Ví dụ, hãy kiểm tra một số chi tiết về Gói
Bạn sẽ thấy kết quả tương tự.
Bạn sẽ thấy có hai kho lưu trữ nơi nginx cài đặt. Kho lưu trữ đầu tiên là kho lưu trữ của Ubuntu và kho lưu trữ thứ hai là kho lưu trữ của nginx.
Bạn có thể thấy 500 được ghi cho tất cả các kho lưu trữ. Con số này chỉ định mức độ ưu tiên của gói. Vì nó giống nhau đối với tất cả các kho lưu trữ, nên khả năng nginx đến từ bất kỳ kho lưu trữ nào cũng giống nhau. Vậy hệ thống sẽ quyết định chọn gói nào như thế nào? Nó sẽ chọn phiên bản cao nhất có sẵn. Trong trường hợp này, đó là 1.22.1. Đối với Ubuntu, số phiên bản đầy đủ trở thành 1.22.1-1~jammy.
Nếu bạn không muốn nâng cấp lên phiên bản 1.22.1 và muốn chặn nó, thì bạn cần chỉnh sửa tệp
Mở tệp trong trình chỉnh sửa nano.
Lệnh này cũng sẽ giúp bạn tạo tệp nếu trước đó nó không tồn tại trong hệ thống.
Dán mã sau vào tệp.
Đặt mức ưu tiên thấp hơn 0 có nghĩa là gói sẽ không được cài đặt. Nếu bạn muốn một gói luôn được cài đặt, hãy đặt mức ưu tiên của gói đó thành 1000 trở lên.
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.
Hãy kiểm tra lại gói.
Bạn sẽ thấy thông báo sau đầu ra.
Bạn có nhận thấy sự khác biệt nào không? Phiên bản phát hành Ứng viên đã giảm từ
Ở đây chúng tôi đang yêu cầu hệ thống bỏ qua phiên bản
Hãy kiểm tra lại bằng cách sử dụng phiên bản
Phiên bản ứng viên hiện đã chuyển sang
Nhập mã sau vào tệp.
Từ khóa phát hành chỉ định phiên bản cao hơn tiếp theo.
Lần này chúng ta đã đặt mức ưu tiên 1000 cho gói kho lưu trữ Ubuntu (
Bạn không chỉ có thể chỉ định nguồn gốc của gói mà còn có thể thêm kho lưu trữ, thành phần, nhãn và kiến trúc của gói mà hệ thống sẽ chọn bằng cách sử dụng các từ khóa sau trong phần Pin.
Bạn sẽ thấy đầu ra tương tự.
Các phương pháp sau đây sẽ cần được lặp lại cho tất cả các gói có được ở đây.
Bạn sẽ thấy đầu ra tương tự.
Để ngăn không cho hạt nhân được nâng cấp thêm, chúng ta chỉ cần sử dụng
Bạn sẽ thấy một lệnh tương tự đầu ra.
Bạn có thể làm theo phương pháp tương tự để chặn các tiêu đề hạt nhân bằng cách chặn gói
Mở tệp để chỉnh sửa.
Cuộn xuống
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.
Để xóa lệnh giữ, hãy sử dụng lệnh sau.
Bạn sẽ thấy kết quả sau.
Mặc dù
Để chặn phiên bản kernel tiếp theo, hãy nhập mã sau vào
Đoạn mã trên sẽ chặn Ubuntu cài đặt bất kỳ hoặc tất cả các bản nâng cấp cho kernel.
Bạn có thể làm theo phương pháp 2 và 3 cho bất kỳ gói thông thường nào, không chỉ kernel.
sudo apt upgrade
. Và việc nâng cấp từng gói riêng lẻ rất phiền phức.Hướng dẫn này 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 ta sẽ thảo luận về hai phương pháp ở đây. Phương pháp đầu tiên sẽ chặn tất cả các cài đặt và nâng cấp cho một gói nhất định. Phương pháp thứ hai cung cấp khả năng kiểm soát chi tiết hơn, cho phép bạn chặn các phiên bản cụ thể của một gói.
Điều kiện tiên quyết
- Máy chủ có hệ điều hành Ubuntu hoặc Debian. Ubuntu 22.04 được sử dụng cho hướng dẫn này, nhưng các lệnh ở đây cũng có thể hoạt động tốt với các hệ điều hành dựa trên Debian 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 (apt-mark)
Để khóa 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 lệnhapt-mark
.Ví dụ, nếu bạn muốn giữ một gói,
htop
khỏi việc cài đặt, cập nhật hoặc xóa, hãy sử dụng lệnh sau.
Mã:
$ sudo apt-mark hold htop
Mã:
htop set on hold.
Để xóa lệnh giữ gói, hãy đưa ra lệnh sau.
Mã:
$ sudo apt-mark unhold htop
Mã:
Canceled hold on htop.
sudo apt 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 apt 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. Việc 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.
Phương pháp 2 (/etc/apt/preferences)
Phương pháp này bao gồm việc chỉnh sửa tệp/etc/apt/preferences
nơi bạn có thể chỉ định chính xác phiên bản nào của gói nào được cài đặt từ kho lưu trữ nào.Mỗi gói có một mức độ ưu tiên theo số dựa trên APT quyết định có cài đặt gói đó hay không và nếu có thì sẽ chọn gói đó từ kho lưu trữ nào.
Ví dụ, hãy kiểm tra một số chi tiết về Gói
nginx
. Thực hiện lệnh sau.
Mã:
$ apt-cache policy nginx
Mã:
nginx: Installed: (none) Candidate: 1.22.1-1~jammy Version table: 1.22.1-1~jammy 500 500 http://nginx.org/packages/ubuntu jammy/nginx amd64 Packages 1.22.0-1~jammy 500 500 http://nginx.org/packages/ubuntu jammy/nginx amd64 Packages 1.20.2-1~jammy 500 500 http://nginx.org/packages/ubuntu jammy/nginx amd64 Packages 1.18.0-6ubuntu14.3 500 500 http://us.archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages 500 http://us.archive.ubuntu.com/ubuntu jammy-security/main amd64 Packages 1.18.0-6ubuntu14 500 500 http://us.archive.ubuntu.com/ubuntu jammy/main amd64 Packages
Bạn có thể thấy 500 được ghi cho tất cả các kho lưu trữ. Con số này chỉ định mức độ ưu tiên của gói. Vì nó giống nhau đối với tất cả các kho lưu trữ, nên khả năng nginx đến từ bất kỳ kho lưu trữ nào cũng giống nhau. Vậy hệ thống sẽ quyết định chọn gói nào như thế nào? Nó sẽ chọn phiên bản cao nhất có sẵn. Trong trường hợp này, đó là 1.22.1. Đối với Ubuntu, số phiên bản đầy đủ trở thành 1.22.1-1~jammy.
Nếu bạn không muốn nâng cấp lên phiên bản 1.22.1 và muốn chặn nó, thì bạn cần chỉnh sửa tệp
/etc/apt/preferences
.Mở tệp trong trình chỉnh sửa nano.
Mã:
$ sudo nano /etc/apt/preferences
Dán mã sau vào tệp.
Mã:
Package: nginx
Pin: version 1.22.1-1~jammy
Pin-Priority: -1
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.
Hãy kiểm tra lại gói.
Mã:
$ apt-cache policy nginx
Mã:
nginx: Installed: (none) Candidate: 1.22.0-1~jammy Version table: 1.22.1-1~jammy -1 500 http://nginx.org/packages/ubuntu jammy/nginx amd64 Packages 1.22.0-1~jammy 500 500 http://nginx.org/packages/ubuntu jammy/nginx amd64 Packages 1.20.2-1~jammy 500 500 http://nginx.org/packages/ubuntu jammy/nginx amd64 Packages 1.18.0-6ubuntu14.3 500 500 http://us.archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages 500 http://us.archive.ubuntu.com/ubuntu jammy-security/main amd64 Packages 1.18.0-6ubuntu14 500 500 http://us.archive.ubuntu.com/ubuntu jammy/main amd64 Packages
1.22.1
xuống 1.22.0
. Điều này có nghĩa là phiên bản cao hơn tiếp theo mà hệ thống sẽ cài đặt là 1.22.0. Bạn cũng sẽ thấy -1 được viết đối với phiên bản mới nhất, điều này có nghĩa là hệ thống sẽ bỏ qua phiên bản đó.Bỏ qua một phiên bản nhưng cho phép phiên bản còn lại
Bạn có thể thêm nhiều mục nhập cho cùng một gói trong tệp. Ví dụ, thêm mã sau vào tệp.
Mã:
Package: nginx
Pin: version 1.22.1-1~jammy
Pin-Priority: -1
Package: nginx
Pin: version 1.20.2-1~jammy
Pin-Priority: 1000
1.22.1
nhưng luôn cài đặt 1.20.2
phiên bản.Hãy kiểm tra lại bằng cách sử dụng phiên bản
apt-cache policy
lệnh.
Mã:
nginx: Installed: (none) Candidate: 1.20.2-1~jammy Version table: 1.22.1-1~jammy -1 500 http://nginx.org/packages/ubuntu jammy/nginx amd64 Packages 1.22.0-1~jammy 500 500 http://nginx.org/packages/ubuntu jammy/nginx amd64 Packages 1.20.2-1~jammy 1000 500 http://nginx.org/packages/ubuntu jammy/nginx amd64 Packages 1.18.0-6ubuntu14.3 500 500 http://us.archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages 500 http://us.archive.ubuntu.com/ubuntu jammy-security/main amd64 Packages 1.18.0-6ubuntu14 500 500 http://us.archive.ubuntu.com/ubuntu jammy/main amd64 Packages
1.20.2
thay vì 1.22.0
.Thay đổi tùy chọn Kho lưu trữ
Hãy xem xét thêm một trường hợp nữa. Nếu chúng ta muốn chặn Nginx cài đặt từ kho lưu trữ của nó và thay vào đó chọn kho lưu trữ Ubuntu thì sao? Một cách là xóa kho lưu trữ Nginx nhưng bạn có thể sử dụng lại tệp tùy chọn để chọn kho lưu trữ cho mình.Nhập mã sau vào tệp.
Mã:
Package: nginx
Pin: release o=nginx
Pin-Priority: -1
o=nginx
đề cập đến nguồn gốc của gói. Ở đây là nginx. Điều này có nghĩa là hệ thống không nên cài đặt gói nginx từ kho lưu trữ của nó. Một cách khác để đạt được kết quả tương tự là sử dụng mã sau.
Mã:
Package: nginx
Pin: release o=jammy
Pin-Priority: 1000
jammy
). Điều này sẽ đảm bảo rằng Nginx luôn được cài đặt từ kho lưu trữ Ubuntu chứ không phải từ bất kỳ nơi nào khác.Bạn không chỉ có thể chỉ định nguồn gốc của gói mà còn có thể thêm kho lưu trữ, thành phần, nhãn và kiến trúc của gói mà hệ thống sẽ chọn bằng cách sử dụng các từ khóa sau trong phần Pin.
- c -> Thành phần
- a -> Lưu trữ
- o -> Nguồn gốc
- l -> Nhãn
- n -> Kiến trúc
Chặn các bản cập nhật hạt nhân cụ thể
Chúng ta hãy xem cách chúng ta có thể chặn các bản nâng cấp hạt nhân cụ thể. Liệt kê tất cả các gói liên quan đến hạt nhân trên hệ thống của bạn.
Mã:
$ dpkg -l "*$(uname -r)*" | grep kernel | awk '{print $2}'
Mã:
linux-headers-5.15.0-33-generic
linux-image-5.15.0-33-generic
linux-modules-5.15.0-33-generic
linux-modules-extra-5.15.0-33-generic
Phương pháp 1 (apt-mark)
Đầu tiên, hãy kiểm tra phiên bản kernel nào đang hoạt động. Để thực hiện điều đó, hãy chạy lệnh sau.
Mã:
$ uname -r
Mã:
5.15.0-53-generic
apt-mark
lệnh.
Mã:
$ sudo apt-mark hold linux-image-$(uname -r)
Mã:
linux-image-5.15.0-53-generic set on hold.
linux-headers-$(uname -r)
.Phương pháp 2 (/etc/apt/apt.conf.d/50unattended-upgrades)
Phương pháp thứ hai liên quan đến tệp/etc/apt/apt.conf.d/50unattended-upgrades
.Mở tệp để chỉnh sửa.
Mã:
$ sudo nano /etc/apt/apt.conf.d/50unattended-upgrades
Unattended-Upgrade::Package-Blacklist
và chỉnh sửa như sau.
Mã:
Unattended-Upgrade::Package-Blacklist {
"linux-generic";
"linux-image-generic";
"linux-headers-generic";
"linux-modules-generic";
"linux-modules-extra-generic";
};
Phương pháp 3 (dpkg)
Để giữ hạt nhân nâng cấp bằng cách sử dụngdpkg
, hãy đưa ra lệnh sau. Lệnh này sẽ giữ tất cả các gói liên quan đến hạt nhân cùng một lúc.
Mã:
$ for i in $(dpkg -l "*$(uname -r)*" | grep kernel | awk '{print $2}'); do echo $i hold | dpkg --set-selections; done
Mã:
$ for i in $(dpkg -l "*$(uname -r)*" | grep kernel | awk '{print $2}'); do echo $i install | dpkg --set-selections; done
Phương pháp 4 (/etc/apt/preferences)
Hãy kiểm tra thông tin chi tiết về phiên bản hạt nhân hiện tại đầu tiên.
Mã:
$ apt-cache policy linux-image-$(uname -r)
Mã:
linux-image-5.15.0-53-generic: Installed: 5.15.0-53.59 Candidate: 5.15.0-53.59 Version table: *** 5.15.0-53.59 500 500 http://us.archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages 500 http://us.archive.ubuntu.com/ubuntu jammy-security/main amd64 Packages 100 /var/lib/dpkg/status
5.15.0.53
kernel đang ở phiên bản mới nhất khi viết hướng dẫn này, chúng tôi cho rằng phiên bản tiếp theo đã ra mắt (5.15.0.56
là phiên bản kernel Linux ổn định hiện tại).Để chặn phiên bản kernel tiếp theo, hãy nhập mã sau vào
/etc/apt/preferences
file.`
Mã:
Package: linux-image-5.15.0-53-generic linux-headers-5.15.0-33-generic linux-modules-5.15.0-33-generic linux-modules-extra-5.15.0-33-generic
Pin: version 5.15.0-53.59
Pin-Priority: -1
Bạn có thể làm theo phương pháp 2 và 3 cho bất kỳ gói thông thường nào, không chỉ kernel.