Quản lý gói (package management) là một trong những tính năng nền tảng của hệ thống Linux. Các bản phân phối khác nhau sẽ sử dụng định dạng gói và công cụ quản lý gói khác nhau, tuy nhiên hầu hết các bản phân phối đều sử dụng một trong 2 bộ công cụ cốt lõi.

Với các bản phân phối dựa trên Red Hat Enterprise Linux (như RHEL và Rocky Linux), phổ biến nhất là định dạng gói RPM và các công cụ đóng gói như rpm và yum. Nhánh lớn còn lại, được sử dụng bởi Debian, Ubuntu và các bản phân phối liên quan, dùng định dạng gói .deb và các công cụ như apt và dpkg.
Trong những năm gần đây, có thêm nhiều trình quản lý gói bổ trợ được thiết kế để chạy song song với các công cụ apt và dpkg cốt lõi. Ví dụ, snap cung cấp khả năng di động và sandboxing cao hơn, còn Homebrew (được port từ macOS) cung cấp các công cụ dòng lệnh mà người dùng có thể tự cài đặt để tránh xung đột với các gói hệ thống.
Trong hướng dẫn này, bạn sẽ tìm hiểu một số công cụ quản lý gói trên Ubuntu và Debian phổ biến. Đây có thể được dùng như một tài liệu tham khảo nhanh khi bạn cần biết cách thực hiện một tác vụ quản lý gói trong các hệ thống này.
Điều kiện tiên quyết
Máy chủ Ubuntu 20.04 hoặc Debian và một người dùng không phải root có quyền sudo.
Bước 1: Tổng quan về các công cụ quản lý gói Debian
Hệ sinh thái Debian/Ubuntu sử dụng khá nhiều công cụ quản lý gói khác nhau để quản lý phần mềm trên hệ thống.
Phần lớn các công cụ này có liên quan với nhau và làm việc trên cùng một cơ sở dữ liệu gói. Một số công cụ cung cấp giao diện cấp cao cho hệ thống đóng gói, còn các tiện ích khác tập trung vào cung cấp chức năng cấp thấp.
apt
Lệnh apt có lẽ là thành viên được sử dụng nhiều nhất trong bộ công cụ đóng gói apt. Mục đích chính của nó là tương tác với các repository từ xa do nhóm đóng gói của bản phân phối duy trì và thực hiện các hành động trên các gói có sẵn.
Nhìn chung, bộ công cụ apt hoạt động bằng cách lấy thông tin từ các repository từ xa về bộ nhớ đệm được duy trì trên hệ thống cục bộ. Lệnh apt được dùng để làm mới bộ nhớ đệm cục bộ. Nó cũng được sử dụng để thay đổi trạng thái gói, nghĩa là cài đặt hoặc gỡ bỏ gói khỏi hệ thống.
Nói chung, apt được dùng để cập nhật bộ nhớ đệm cục bộ và để thực hiện các thay đổi trên hệ thống đang chạy.
Lưu ý, trong các phiên bản Ubuntu trước đây, lệnh apt cốt lõi được gọi là apt-get. Nó đã được tinh giản, nhưng bạn vẫn có thể gọi bằng apt-get do thói quen hoặc để tương thích ngược.
apt-cache
Một thành viên quan trọng khác trong bộ công cụ apt là apt-cache. Tiện ích này sử dụng bộ nhớ đệm cục bộ để truy vấn thông tin về các gói có sẵn và thuộc tính của chúng.
Ví dụ, bất cứ khi nào bạn muốn tìm một gói hoặc một công cụ cụ thể để thực hiện chức năng nào đó, apt-cache là nơi khởi đầu tốt. Nó cũng có thể cho biết chính xác phiên bản gói nào sẽ được cài đặt trong một thao tác nhất định. Ngoài ra, apt-cache còn rất hữu ích khi cần xem thông tin về các gói phụ thuộc và gói phụ thuộc ngược.
dpkg
Trong khi các công cụ trước đó tập trung vào quản lý gói được duy trì trong repository, lệnh dpkg cũng có thể dùng để thao tác với các gói .deb riêng lẻ. Công cụ dpkg chịu trách nhiệm thực hiện hầu hết các tác vụ nền tảng cho các lệnh ở trên. Trong khi đó, apt đảm nhận phần quản lý bổ sung, còn dpkg thì trực tiếp tương tác với các gói.
Không giống các lệnh apt, dpkg không có khả năng tự động giải quyết các phụ thuộc. Tính năng chính của nó là khả năng làm việc trực tiếp với gói .deb và khả năng phân tích gói để tìm hiểu thêm về cấu trúc của nó. Mặc dù dpkg có thể thu thập một số thông tin về các gói đã cài đặt trên hệ thống, nhưng bạn không nên sử dụng nó như trình quản lý gói chính. Ở bước tiếp theo, bạn sẽ tìm hiểu về các biện pháp nâng cấp gói tốt nhất.
Bước 2: Cập nhật bộ nhớ đệm gói và hệ thống
Các công cụ quản lý gói của Debian và Ubuntu giúp hệ thống của bạn luôn hiển thị danh sách gói mới nhất. Các công cụ này cũng cung cấp nhiều phương pháp để cập nhật các gói bạn đang cài đặt trên máy chủ.
Cập nhật bộ nhớ đệm gói cục bộ
Các repository từ xa mà công cụ quản lý gói sử dụng để lấy thông tin luôn thay đổi và được cập nhật liên tục. Tuy nhiên, vì lý do lịch sử, phần lớn công cụ quản lý gói trên Linux được thiết kế để làm việc trực tiếp với bộ nhớ đệm thông tin ở máy cục bộ. Do đó, chúng ta cần làm mới bộ nhớ đệm này định kỳ.
Thông thường, bạn nên cập nhật bộ nhớ đệm gói cục bộ ở mỗi phiên làm việc trước khi thực hiện các lệnh gói khác. Cách này đảm bảo bạn đang thao tác với thông tin mới nhất về phần mềm có sẵn. Một số lệnh cài đặt sẽ thất bại nếu bạn đang dùng dữ liệu gói đã cũ.
Để cập nhật bộ nhớ đệm cục bộ, dùng lệnh apt với lệnh con update:
sudo apt update
Lệnh này sẽ tải về danh sách cập nhật các gói sẵn có trong những repository mà bạn đang theo dõi.
Cập nhật gói
Lệnh apt phân biệt giữa 2 quy trình cập nhật khác nhau. Quy trình đầu tiên (được đề cập trong phần này) có thể dùng để nâng cấp bất kỳ thành phần nào không yêu cầu gỡ bỏ thành phần khác. Để tìm hiểu cách cập nhật và cho phép apt gỡ bỏ hoặc thay thế thành phần khi cần thiết, bạn hãy theo dõi phần bên dưới.
Quy trình này đặc biệt quan trọng khi bạn không muốn gỡ bỏ bất kỳ gói nào đã cài đặt sẵn trong mọi tình huống. Tuy nhiên, vẫn có một số bản cập nhật liên quan đến việc thay thế thành phần hệ thống hoặc xóa các tệp xung đột. Trong trường hợp này, quy trình đầu tiên sẽ bỏ qua bất kỳ bản cập nhật nào yêu cầu gỡ bỏ gói:
sudo apt upgrade
Quy trình thứ hai sẽ cập nhật tất cả các gói, kể cả những gói cần phải gỡ bỏ. Chúng ta cần đến quy trình này vì các gói có thể thay đổi phụ thuộc theo thời gian.
Thông thường, các gói bị gỡ bỏ sẽ được thay thế bằng những gói tương đương về chức năng trong quá trình nâng cấp, nên nhìn chung điều này khá an toàn. Tuy vậy, bạn nên theo dõi danh sách các gói sẽ bị gỡ bỏ để đảm bảo không xóa nhầm các thành phần quan trọng. Để thực hiện hành động này, nhập:
sudo apt full-upgrade
Lệnh này sẽ cập nhật tất cả các gói trên hệ thống của bạn. Ở bước tiếp theo, bạn sẽ tìm hiểu về cách tải và cài đặt các gói mới.
Bước 3: Tải xuống và cài đặt gói
Tìm kiếm gói
Bước đầu tiên khi tải xuống và cài đặt gói thường là tìm trong repository của bản phân phối để xem gói bạn cần có sẵn hay không.
Tìm kiếm gói là thao tác nhắm vào bộ nhớ đệm để lấy thông tin, và bạn có thể thực hiện bằng lệnh apt-cache search. Lưu ý, bạn cần đảm bảo bộ nhớ đệm cục bộ đã được cập nhật bằng sudo apt update trước khi tìm kiếm gói:
apt-cache search package
Vì thao tác này chỉ dùng để truy vấn thông tin nên không yêu cầu quyền sudo. Bất kỳ tìm kiếm nào cũng sẽ xem xét tên gói cũng như mô tả đầy đủ của các gói.
Ví dụ, nếu bạn tìm kiếm htop, bạn sẽ thấy kết quả như sau:
apt-cache search htop
Output
aha - ANSI color to HTML converter
htop - interactive processes viewer
libauthen-oath-perl - Perl module for OATH One Time Passwords
Kết quả trên cho thấy ngoài một gói tên htop còn có 2 chương trình khác, mỗi chương trình đều nhắc đến htop trong trường mô tả đầy đủ của gói (phần mô tả trong output chỉ là tóm tắt ngắn).
Cài đặt gói từ Repos
Để cài đặt một gói từ repository cùng với tất cả các gói phụ thuộc cần thiết, bạn dùng lệnh apt với đối số install.
Đối số cho lệnh này phải là tên gói hoặc nhiều tên gói như được hiển thị trong repository:
sudo apt install package
Bạn có thể cài đặt nhiều gói cùng lúc, phân tách bằng khoảng trắng:
sudo apt install package1 package2
Nếu gói bạn yêu cầu cần thêm các gói phụ thuộc, hệ thống sẽ hiển thị trên đầu ra chuẩn và yêu cầu bạn xác nhận trước khi tiếp tục. Nó sẽ trông như sau:
sudo apt install apache2
Output
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
apache2-data
Suggested packages:
apache2-doc apache2-suexec-pristine apache2-suexec-custom
apache2-utils
The following NEW packages will be installed:
apache2 apache2-data
0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Need to get 236 kB of archives.
After this operation, 1,163 kB of additional disk space will be used.
Do you want to continue [Y/n]?
Kết quả trên cho thấy, dù gói cài đặt mục tiêu là apache2, gói apache2-data cũng cần thiết như một gói phụ thuộc. Trong trường hợp này, bạn có thể tiếp tục bằng cách nhấn Enter hoặc “Y”, hoặc hủy bỏ bằng cách nhập “n”.
Cài đặt một phiên bản gói cụ thể từ Repos
Nếu bạn cần cài đặt một phiên bản cụ thể của gói, bạn có thể chỉ định phiên bản mong muốn bằng dấu = như sau:
sudo apt install package=version
Phiên bản ở đây phải khớp với một trong các phiên bản có sẵn trong repository. Điều này có nghĩa là bạn cần sử dụng đúng lược đồ đánh số phiên bản mà bản phân phối đang áp dụng. Bạn có thể tìm các phiên bản có sẵn bằng lệnh apt-cache policy package:
apt-cache policy nginx
Output
nginx:
Installed: (none)
Candidate: 1.18.0-0ubuntu1.2
Version table:
1.18.0-0ubuntu1.2 500
500 <http://mirrors.digitalocean.com/ubuntu> focal-updates/main amd64 Packages
500 <http://security.ubuntu.com/ubuntu> focal-security/main amd64 Packages
1.17.10-0ubuntu1 500
500 <http://mirrors.digitalocean.com/ubuntu> focal/main amd64 Packages
Tái cấu hình gói
Nhiều gói bao gồm các script cấu hình sau cài đặt được tự động chạy sau khi cài xong. Các script này thường có các bước nhắc quản trị viên đưa ra lựa chọn cấu hình.
Nếu bạn cần chạy lại các bước cấu hình này (hoặc các bước bổ sung) sau đó, bạn có thể dùng lệnh dpkg-reconfigure. Lệnh này sẽ kiểm tra gói được truyền vào và chạy lại các lệnh cấu hình sau cài đặt có trong đặc tả gói:
sudo dpkg-reconfigure package
Lệnh này cho phép bạn truy cập lại các bước cấu hình, thường còn chi tiết hơn cả lúc cài đặt ban đầu.
Thử nghiệm trước các thao tác với gói
Thông thường, trước khi chạy lệnh, bạn sẽ muốn xem trước những thay đổi mà lệnh đó sẽ thực hiện. apt cho phép bạn thêm cờ -s để “giả lập” một quy trình.
Ví dụ, để xem điều gì sẽ xảy ra nếu bạn cài một gói, bạn có thể gõ:
apt install -s package
Lệnh này sẽ cho bạn thấy tất cả gói phụ thuộc và hệ thống sẽ thay đổi như thế nào khi bỏ cờ -s. Một lợi ích nữa là bạn có thể xem kết quả của quy trình vốn yêu cầu quyền root mà không cần dùng sudo.
Ví dụ, để kiểm tra những gì sẽ được cài cùng với gói apache2, bạn có thể gõ:
apt install -s apache2
Output
NOTE: This is only a simulation!
apt needs root privileges for real execution.
Keep also in mind that locking is deactivated,
so don't depend on the relevance to the real current situation!
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
apache2-data
Suggested packages:
apache2-doc apache2-suexec-pristine apache2-suexec-custom
apache2-utils
The following NEW packages will be installed:
apache2 apache2-data
0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Inst apache2-data (2.4.6-2ubuntu2.2 Ubuntu:13.10/saucy-updates [all])
Inst apache2 (2.4.6-2ubuntu2.2 Ubuntu:13.10/saucy-updates [amd64])
Conf apache2-data (2.4.6-2ubuntu2.2 Ubuntu:13.10/saucy-updates [all])
Conf apache2 (2.4.6-2ubuntu2.2 Ubuntu:13.10/saucy-updates [amd64])
Bạn sẽ nhận được toàn bộ thông tin về gói và phiên bản sẽ được cài, mà không cần thực sự thực hiện quá trình đó.
Tính năng này cũng áp dụng cho các quy trình khác, như nâng cấp hệ thống:
apt -s dist-upgrade
Theo mặc định, apt sẽ nhắc người dùng xác nhận với nhiều quy trình, bao gồm cả cài đặt yêu cầu thêm gói phụ thuộc và nâng cấp gói.
Để bỏ qua bước xác nhận này và mặc định chấp nhận mọi nhắc lệnh, bạn có thể thêm cờ -y khi thực hiện:
sudo apt install -y package
Lệnh này sẽ cài đặt gói và các gói phụ thuộc mà không cần thêm xác nhận từ người dùng. Bạn cũng có thể dùng cho quy trình nâng cấp:
sudo apt dist-upgrade -y
Sửa lỗi cho các phụ thuộc và gói bị hỏng
Đôi khi quá trình cài đặt có thể thất bại do vấn đề phụ thuộc hoặc lỗi khác. Một tình huống phổ biến là khi cài gói .deb bằng dpkg, vì công cụ này không tự động xử lý phụ thuộc.
Lệnh apt có thể xử lý tình huống này bằng cách thêm cờ -f:
sudo apt install -f
Lệnh này sẽ tìm các gói phụ thuộc chưa được đáp ứng và cố gắng cài đặt chúng để sửa cây phụ thuộc. Nếu việc cài đặt báo lỗi phụ thuộc, đây nên là bước đầu tiên bạn thử để khắc phục. Nếu vẫn không giải quyết được và gói đến từ bên thứ ba, bạn nên gỡ bỏ nó và tìm phiên bản mới hơn được duy trì tích cực hơn.
Tải gói từ repository
Trong một số trường hợp, bạn có thể cần tải gói từ repository về mà không cần cài đặt ngay, bằng cách chạy apt với đối số download.
Vì thao tác này chỉ tải file và không ảnh hưởng đến hệ thống, nên không cần quyền sudo:
apt download package
Lệnh này sẽ tải gói được chỉ định về thư mục hiện tại.
Cài đặt gói .deb
Mặc dù hầu hết các bản phân phối đều khuyên bạn nên cài phần mềm từ repository chính thức, nhưng một số nhà cung cấp vẫn có file .deb để bạn tự cài đặt.
Để làm điều này, bạn dùng dpkg. dpkg chủ yếu làm việc với các gói riêng lẻ. Nó không cài đặt từ repository, mà tìm các gói .deb trong thư mục hiện tại hoặc đường dẫn được chỉ định:
sudo dpkg --install debfile.deb
Một điều quan trọng cần lưu ý là công cụ dpkg không xử lý phụ thuộc. Nghĩa là nếu có phụ thuộc chưa được đáp ứng, quá trình cài đặt sẽ thất bại. Tuy nhiên, dpkg sẽ đánh dấu các phụ thuộc cần thiết, và nếu chúng có sẵn trong repository, bạn có thể cài chúng bằng lệnh sau:
sudo apt install -f
Lệnh này sẽ cài bất kỳ phụ thuộc nào chưa được đáp ứng, bao gồm cả những phụ thuộc được dpkg đánh dấu. Ở bước tiếp theo, bạn sẽ tìm hiểu cách gỡ bỏ các gói đã cài.
Bước 4: Gỡ bỏ gói và xóa tệp
Phần này sẽ trình bày cách gỡ bỏ gói đã cài đặt và dọn dẹp các tệp có thể bị bỏ lại sau khi thao tác với gói.
Gỡ bỏ một gói
Để gỡ bỏ gói đã cài đặt, bạn dùng lệnh apt remove. Lệnh này sẽ xóa hầu hết các tệp mà gói đã cài vào hệ thống, với một ngoại lệ đáng chú ý.
Lệnh này giữ lại các tệp cấu hình, nhờ đó khi bạn cần cài đặt lại ứng dụng thì cấu hình vẫn còn. Đây là điểm hữu ích vì các tệp cấu hình đã tùy chỉnh sẽ không bị xóa ngay cả khi bạn vô tình gỡ bỏ gói.
Để thực hiện, bạn cần cung cấp tên gói muốn gỡ bỏ:
sudo apt remove package
Như vậy, gói sẽ được gỡ bỏ trừ các tệp cấu hình.
Gỡ bỏ gói và toàn bộ tệp cấu hình liên quan
Nếu bạn muốn gỡ bỏ một gói cùng toàn bộ tệp liên quan trên hệ thống, bao gồm cả tệp cấu hình, bạn có thể dùng lệnh apt purge.
Khác với lệnh remove, lệnh purge sẽ xóa sạch mọi thứ. Cách này cần thiết khi bạn không muốn giữ lại tệp cấu hình, hoặc khi gặp sự cố và muốn bắt đầu lại từ đầu.
Lưu ý, sau khi tệp cấu hình bị xóa thì bạn sẽ không thể khôi phục được nữa.
sudo apt purge package
Sau này, nếu bạn cần cài đặt lại gói đó, chúng ta sẽ lại bắt đầu từ cấu hình mặc định.
Gỡ bỏ các phụ thuộc tự động không còn cần thiết
Khi gỡ bỏ gói trên hệ thống bằng apt remove hoặc apt purge, gói mục tiêu sẽ bị xóa nhưng các gói phụ thuộc được cài đặt tự động để đáp ứng yêu cầu cài đặt vẫn còn lại.
Để tự động gỡ bỏ các gói phụ thuộc không còn được bất kỳ gói nào khác sử dụng, bạn có thể dùng lệnh autoremove:
sudo apt autoremove
Nếu bạn muốn gỡ bỏ cả các tệp cấu hình liên quan đến những gói phụ thuộc bị xóa, bạn có thể thêm tùy chọn --purge vào lệnh autoremove. Lệnh này sẽ dọn dẹp cả tệp cấu hình, tương tự như lệnh purge đối với một gói cụ thể:
sudo apt --purge autoremove
Dọn dẹp các tệp gói đã lỗi thời
Khi nhóm duy trì gói của bản phân phối thêm hoặc gỡ bỏ gói trong repository, một số gói sẽ trở nên lỗi thời.
Công cụ apt có thể xóa các tệp gói trên hệ thống cục bộ liên quan đến những gói không còn tồn tại trong repository bằng lệnh autoclean.
Lệnh này giúp giải phóng dung lượng trên máy chủ và loại bỏ các gói lỗi thời khỏi bộ nhớ đệm cục bộ:
sudo apt autoclean
Ở bước tiếp theo, chúng ta sẽ cùng tìm hiểu thêm về các cách truy vấn thông tin gói mà không cần cài đặt.
Bước 5: Lấy thông tin về gói
Bạn có thể truy cập một lượng lớn siêu dữ liệu của mỗi gói bằng các công cụ quản lý gói. Trong phần này, chúng ta sẽ minh họa một số cách phổ biến để lấy thông tin về gói có sẵn và gói đã cài đặt.
Để hiển thị thông tin chi tiết về một gói trong repository của bản phân phối, bạn có thể dùng lệnh apt-cache show. Đối số của lệnh này là tên gói trong repository:
apt-cache show nginx
Lệnh này sẽ hiển thị thông tin về bất kỳ gói có thể cài đặt nào của gói được chỉ định. Mỗi gói sẽ có thông tin về gói phụ thuộc, phiên bản, kiến trúc, xung đột, tên tệp gói, kích thước và cài đặt, cũng như mô tả chi tiết và nhiều thông tin khác.
Output
Package: nginx
Architecture: all
Version: 1.18.0-0ubuntu1.2
Priority: optional
Section: web
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Debian Nginx Maintainers <pkg-nginx-maintainers@lists.alioth.debian.org>
Bugs: <https://bugs.launchpad.net/ubuntu/+filebug>
Installed-Size: 44
Depends: nginx-core (<< 1.18.0-0ubuntu1.2.1~) | nginx-full (<< 1.18.0-0ubuntu1.2.1~) | nginx-light (<< 1.18.0-0ubuntu1.2.1~) | nginx-extras (<< 1.18.0-0ubuntu1.2.1~), nginx-core (>= 1.18.0-0ubuntu1.2) | nginx-full (>= 1.18.0-0ubuntu1.2) | nginx-light (>= 1.18.0-0ubuntu1.2) | nginx-extras (>= 1.18.0-0ubuntu1.2)
Filename: pool/main/n/nginx/nginx_1.18.0-0ubuntu1.2_all.deb
…
Để hiển thị thêm thông tin về từng gói, bao gồm danh sách đầy đủ các phụ thuộc ngược (danh sách gói phụ thuộc vào gói đang được truy vấn), bạn có thể dùng lệnh showpkg. Lệnh này sẽ bao gồm thông tin về mối quan hệ của gói này với các gói khác:
apt-cache showpkg package
Hiển thị thông tin về một gói .deb
Để hiển thị chi tiết về một tệp .deb, bạn có thể dùng cờ --info với lệnh dpkg. Mục tiêu của lệnh là đường dẫn đến tệp .deb:
dpkg --info debfile.deb
Lệnh này sẽ hiển thị siêu dữ liệu về gói, bao gồm tên và phiên bản gói, kiến trúc, kích thước và phụ thuộc, mô tả và xung đột.
Để liệt kê cụ thể các phụ thuộc (các gói mà gói này cần) và phụ thuộc ngược (các gói phụ thuộc vào gói này), bạn có thể dùng tiện ích apt-cache.
Với thông tin phụ thuộc thông thường, bạn có thể dùng lệnh con depends:
apt-cache depends nginx
Output
nginx
|Depends: nginx-core
|Depends: nginx-full
|Depends: nginx-light
Depends: nginx-extras
|Depends: nginx-core
|Depends: nginx-full
|Depends: nginx-light
Depends: nginx-extras
Lệnh này sẽ hiển thị thông tin về mọi gói được liệt kê là phụ thuộc cứng, gợi ý, khuyến nghị hoặc xung đột.
Nếu bạn cần biết gói nào phụ thuộc vào một gói cụ thể, bạn có thể truyền gói đó cho lệnh apt-cache rdepends:
apt-cache rdepends package
Hiển thị các phiên bản gói đã cài đặt và có sẵn
Thường thì trong repository sẽ có nhiều phiên bản của một gói, với một phiên bản mặc định. Để xem các phiên bản có sẵn của gói, bạn có thể dùng lệnh apt-cache policy:
apt-cache policy package
Lệnh này sẽ hiển thị phiên bản đang được cài đặt (nếu có), gói sẽ được cài mặc định nếu bạn không chỉ định phiên bản khi cài, và bảng liệt kê các phiên bản gói kèm trọng số thể hiện độ ưu tiên của mỗi phiên bản.
Lệnh này được dùng để xác định phiên bản nào sẽ được cài đặt và các lựa chọn thay thế. Ngoài ra, vì danh sách cũng bao gồm repository nguồn cho từng phiên bản nên bạn có thể dùng để xác định xem có repository nào đang thay thế gói từ repository mặc định hay không.
Hiển thị các gói đã cài đặt bằng dpkg -l
Để hiển thị các gói đã cài trên hệ thống, bạn có một số lựa chọn khác nhau, tùy theo định dạng và mức độ chi tiết của đầu ra.
Cách đầu tiên là dùng dpkg hoặc dpkg-query với cờ -l. Kết quả từ hai lệnh này giống hệt nhau. Nếu không có đối số, nó sẽ liệt kê tất cả gói đã cài hoặc cài một phần trên hệ thống. Đầu ra sẽ trông như sau:
dpkg -l
Output
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-===========================================-=======================================-============-=====================================================================================================================
ii account-plugin-generic-oauth 0.10bzr13.03.26-0ubuntu1.1 amd64 GNOME Control Center account plugin for single signon - generic OAuth
ii accountsservice 0.6.34-0ubuntu6 amd64 query and manipulate user account information
ii acl 2.2.52-1 amd64 Access control list utilities
ii acpi-support 0.142 amd64 scripts for handling many ACPI events
ii acpid 1:2.0.18-1ubuntu2 amd64 Advanced Configuration and Power Interface event daemon
. . .
Đầu ra tiếp tục cho mọi gói trên hệ thống. Ở đầu kết quả, bạn có thể thấy ý nghĩa của 3 ký tự đầu tiên trên mỗi dòng.
- Ký tự thứ nhất thể hiện trạng thái mong muốn của gói:
u: Không xác địnhi: Đã cài đặtr: Đã gỡ bỏp: Đã xóa sạch (purged)h: Giữ nguyên phiên bản
- Ký tự thứ hai thể hiện trạng thái thực tế của gói mà hệ thống quản lý gói ghi nhận:
n: Chưa cài đặti: Đã cài đặtc: Tệp cấu hình vẫn còn nhưng ứng dụng đã bị gỡ bỏu: Đã giải nén. Tệp đã giải nén nhưng chưa được cấu hìnhf: Gói cài một nửa, nghĩa là lỗi xảy ra giữa chừng và quá trình cài đặt đã dừng lạiw: Gói đang chờ một trigger từ gói khácp: Gói đã được trigger bởi một gói khác
- Ký tự thứ ba, thường là khoảng trắng, chỉ có một giá trị khả dĩ khác:
r: Gói cần cài lại, thường có nghĩa là gói đã bị hỏng và không hoạt động.
Các cột còn lại hiển thị tên gói, phiên bản, kiến trúc và mô tả.
Hiển thị trạng thái cài đặt của gói được lọc
Nếu bạn thêm mẫu tìm kiếm sau cờ -l, dpkg sẽ liệt kê tất cả gói (dù đã cài hay chưa) có chứa mẫu đó. Ví dụ, bạn có thể tìm thư viện xử lý YAML như sau:
dpkg -l libyaml*
Output
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-===============-============-============-===================================
ii libyaml-0-2:amd 0.1.4-2ubunt amd64 Fast YAML 1.1 parser and emitter li
ii libyaml-dev:amd 0.1.4-2ubunt amd64 Fast YAML 1.1 parser and emitter li
un libyaml-perl <none> (no description available)
un libyaml-syck-pe <none> (no description available)
ii libyaml-tiny-pe 1.51-2 all Perl module for reading and writing
Như bạn thấy ở cột đầu tiên, kết quả thứ 3 và thứ 4 chưa được cài. Lệnh này cho bạn biết mọi gói khớp với mẫu, cũng như trạng thái hiện tại và trạng thái mong muốn của mẫu.
Một cách khác để hiển thị gói đã cài trên hệ thống là dùng dpkg --get-selections
Lệnh này đưa ra danh sách toàn bộ gói đã cài hoặc đã gỡ nhưng chưa bị xóa tệp cấu hình.
dpkg --get-selections
Để phân biệt 2 trạng thái này, bạn có thể pipe đầu ra từ dpkg sang awk để lọc theo trạng thái. Ví dụ, để xem chỉ các gói đã cài, gõ:
dpkg --get-selections | awk '$2 ~ /^install/'
Để xem danh sách gói đã gỡ nhưng chưa xóa tệp cấu hình, gõ:
dpkg --get-selections | awk '$2 !~ /^install/'
Bạn cũng có thể tìm hiểu thêm về cách pipe đầu ra lệnh qua awk.
Tìm kiếm gói đã cài đặt
Để tìm trong cơ sở gói đã cài đặt một gói cụ thể, bạn có thể thêm chuỗi lọc sau tùy chọn --get-selections. Tùy chọn này hỗ trợ ký tự đại diện. Lệnh sẽ hiển thị mọi gói đã cài hoặc vẫn còn tệp cấu hình trên hệ thống:
dpkg --get-selections libz*
Bạn có thể tiếp tục lọc với biểu thức awk từ phần trước.
Liệt kê tệp do một gói cài đặt
Để xem một gói quản lý những tệp nào, bạn có thể dùng cờ -L với lệnh dpkg:
dpkg -L package
Lệnh này sẽ in ra đường dẫn tuyệt đối của từng tệp do gói quản lý. Lưu ý, nó không bao gồm các tệp cấu hình được tạo bởi các tiến trình trong gói.
Nếu muốn biết gói nào chịu trách nhiệm cho một tệp cụ thể trong hệ thống, bạn có thể truyền đường dẫn tuyệt đối của tệp đó cho dpkg với cờ -S:
Lệnh này sẽ in ra tên gói đã cài đặt tệp được chỉ định:
dpkg -S /path/to/file
Lưu ý, bất kỳ tệp nào được thêm vào sau bởi script sau cài đặt sẽ không thể truy ngược về gói bằng cách này.
Xác định gói cung cấp một tệp mà không cần cài đặt
Với dpkg, bạn có thể dùng tùy chọn -S để xác định gói nào đang sở hữu một tệp nhất định. Tuy nhiên, đôi khi bạn cần biết gói nào cung cấp một tệp hoặc lệnh, ngay cả khi gói đó chưa được cài đặt.
Trong trường hợp này, bạn cần cài tiện ích apt-file. Công cụ này duy trì cơ sở dữ liệu riêng, bao gồm đường dẫn cài đặt của mọi tệp do gói trong cơ sở dữ liệu quản lý.
Cài đặt gói apt-file như bình thường:
sudo apt update
sudo apt install apt-file
Bây giờ, cập nhật cơ sở dữ liệu của công cụ và tìm kiếm tệp bằng cách gõ:
sudo apt-file update
sudo apt-file search /path/to/file
Lệnh này chỉ hoạt động cho các tệp được cài trực tiếp bởi gói. Bất kỳ tệp nào được tạo bởi script sau cài đặt sẽ không thể truy vấn.
Ở bước tiếp theo, bạn sẽ tìm hiểu cách nhập và xuất danh sách gói đã cài đặt.
Bước 6: Chuyển danh sách gói giữa các hệ thống
Trong nhiều trường hợp, bạn cần xuất danh sách các gói đã cài từ hệ thống này và dùng nó để cài cùng một tập hợp gói trên hệ thống khác. Đây cũng là một cách hữu ích để phục vụ mục đích sao lưu. Phần này sẽ minh họa cách xuất và nhập danh sách gói.
Nếu muốn nhân bản danh sách gói từ hệ thống này sang hệ thống khác, trước hết hãy xuất danh sách gói.
Danh sách gói đã cài có thể được xuất ra một tệp bằng cách chuyển hướng đầu ra của dpkg --get-selections sang một tệp văn bản:
dpkg --get-selections > ~/packagelist.txt
Bạn cũng có thể tìm hiểu thêm về cách chuyển hướng đầu vào và đầu ra.
Sau đó, sao chép danh sách này sang máy thứ hai để nhập vào.
Ngoài ra, có thể cần sao lưu danh sách sources và danh sách khóa tin cậy. Hãy tạo một thư mục mới rồi sao chép các tệp từ cấu hình hệ thống trong /etc/apt/:
mkdir ~/sources
cp -R /etc/apt/sources.list* ~/sources
Để xuất các khóa đã thêm khi cài gói từ repository bên thứ ba, dùng lệnh:
apt-key exportall > ~/trusted_keys.txt
Cuối cùng, chuyển tệp packagelist.txt, thư mục sources và tệp trusted_keys.txt sang máy khác để nhập.
Nhập danh sách gói
Nếu đã tạo danh sách gói bằng dpkg --get-selections như minh họa ở trên, bạn có thể nhập gói trên máy khác cũng bằng lệnh dpkg.
Đầu tiên, thêm các khóa tin cậy và triển khai danh sách sources mà bạn đã sao chép từ hệ thống đầu tiên. Giả sử, toàn bộ dữ liệu đã sao lưu được chép vào thư mục home của máy mới, hãy gõ như sau:
sudo apt-key add ~/trusted_keys.txt
sudo cp -R ~sources/* /etc/apt/
Tiếp theo, xóa trạng thái của tất cả gói không thiết yếu khỏi máy mới để đảm bảo thao tác được áp dụng trên một nền sạch. Thao tác này cần có quyền root hoặc sudo:
sudo dpkg --clear-selections
Lệnh này sẽ đánh dấu tất cả gói không thiết yếu để gỡ bỏ. Bạn nên cập nhật danh sách gói cục bộ để bản cài đặt có đủ thông tin về phần mềm sẽ được cài. Quá trình cài đặt và nâng cấp sẽ do công cụ dselect xử lý.
Đảm bảo dselect đã được cài đặt. Vì công cụ này duy trì cơ sở dữ liệu riêng nên chúng ta cần cập nhật trước khi tiếp tục:
sudo apt update
sudo apt install dselect
sudo dselect update
Tiếp theo, áp dụng danh sách gói đã xuất lên hệ thống hiện tại để xác định gói nào sẽ giữ lại hoặc tải xuống:
sudo dpkg --set-selections < packagelist.txt
Lệnh này sẽ thiết lập trạng thái gói chính xác. Để áp dụng thay đổi, chạy lệnh apt dselect-upgrade:
sudo apt dselect-upgrade
Quá trình này sẽ tải và cài bất kỳ gói nào cần thiết, đồng thời gỡ bỏ các gói không cần thiết đã được đánh dấu. Cuối cùng, danh sách gói trên máy mới sẽ khớp với máy trước đó, mặc dù các tệp cấu hình vẫn cần được sao chép hoặc chỉnh sửa. Bạn có thể dùng công cụ như etckeeper để di chuyển các tệp cấu hình từ thư mục /etc.
Ở bước tiếp theo và cũng là bước cuối cùng, bạn sẽ tìm hiểu cách làm việc với các repository gói bên thứ ba.
Bước 7: Thêm repository và PPA
Thông thường, các repository mặc định do bản phân phối cung cấp là dễ duy trì nhất. Tuy nhiên, trong một số trường hợp, việc bổ sung thêm nguồn khác cũng có nhiều lợi ích. Phần này sẽ hướng dẫn cách cấu hình công cụ quản lý gói để tham chiếu thêm các nguồn này.
Một lựa chọn thay thế cho repository truyền thống trên Ubuntu là PPA (Personal Package Archive – Kho lưu trữ gói cá nhân). Trên các bản phân phối Linux khác cũng tồn tại khái niệm tương tự dưới dạng repository bên thứ ba. Thông thường, PPA có phạm vi nhỏ hơn và chỉ tập trung vào một nhóm ứng dụng do chủ sở hữu PPA duy trì.
Khi thêm PPA vào hệ thống, bạn có thể quản lý các gói trong đó bằng công cụ quản lý gói quen thuộc. Cách này thường giúp cài đặt những phiên bản mới hơn mà repository mặc định chưa có. Tuy nhiên, bạn chỉ nên thêm các PPA đáng tin cậy, vì đồng nghĩa với việc cho phép một bên duy trì không chính thức xây dựng gói cho hệ thống của bạn.
Để thêm một PPA, bạn có thể dùng lệnh add-apt-repository. Target cần có nhãn ppa:, theo sau là tên chủ sở hữu trên Launchpad, dấu gạch chéo và tên PPA:
sudo add-apt-repository ppa:owner_name/ppa_name
Bạn có thể phải chấp nhận khóa của người đóng gói. Sau đó, PPA sẽ được thêm vào hệ thống, cho phép bạn cài gói bằng lệnh apt như bình thường. Trước khi tìm kiếm hoặc cài đặt gói, hãy cập nhật bộ nhớ đệm cục bộ để có thông tin về PPA mới:
sudo apt update
Bạn cũng có thể chỉnh sửa trực tiếp cấu hình repository. Cách làm là mở tệp /etc/apt/sources.list hoặc thêm một tệp danh sách mới vào thư mục /etc/apt/sources.list.d. Nếu chọn cách thứ hai, tên tệp mới phải kết thúc bằng .list:
sudo nano /etc/apt/sources.list.d/new_repo.list
Bên trong tệp, bạn có thể thêm vị trí của repository mới theo định dạng sau:
deb_or_deb-src url_of_repo release_code_name_or_suite component_names
Các thành phần khác nhau trong đặc tả repository bao gồm:
debhoặcdeb-src: Xác định loạirepository. Repository nhị phân thường bắt đầu bằngdeb, trong khi repository mã nguồn bắt đầu bằngdeb-src.url: URL chính củarepository, nơi có thể tìm thấy gói.release code name or suite: Thường là tên mã của bản phát hành phân phối, nhưng có thể là bất kỳ tên nào được dùng để nhận diện tập gói dành cho phiên bản phân phối của bạn.component names: Nhãn cho tập gói mà bạn muốn sử dụng. Thường được người duy trìrepositoryđịnh nghĩa để phân biệt độ tin cậy hoặc ràng buộc giấy phép của phần mềm.
Bạn có thể thêm những dòng này vào trong tệp. Hầu hết repository sẽ có thông tin cụ thể về định dạng chính xác cần dùng. Trên một số bản phân phối Linux khác, bạn có thể thêm nguồn repository bổ sung bằng cách cài đặt các gói chỉ chứa tệp cấu hình cho repository đó, điều này phù hợp với cách hoạt động của các trình quản lý gói.
Kết luận
Quản lý gói có lẽ là khía cạnh quan trọng nhất trong việc quản trị một hệ thống Linux. Còn rất nhiều thao tác quản lý gói khác mà bạn có thể thực hiện, nhưng hướng dẫn này đã cung cấp kiến thức nền tảng về Ubuntu, nhiều phần trong đó có thể áp dụng cho các bản phân phối khác với vài thay đổi nhỏ.