Hướng dẫn quản lý software packages trên Ubuntu và Debian bằng apt, dpkg, snap

Hướng dẫn quản lý software packages trên Ubuntu và Debian bằng apt, dpkg, snap

Quản lý gói là một tính năng cốt lõi trong hệ thống Linux. Mặc dù định dạng đóng gói và công cụ quản lý có thể khác nhau giữa các bản phân phối, hầu hết đều dựa vào một trong hai bộ công cụ chủ lực.

Đối với các bản phân phối dựa trên Red Hat Enterprise Linux như RHEL và Rocky Linux, định dạng đóng gói RPM cùng với các công cụ như rpm và yum được sử dụng rộng rãi. Trong khi đó, các hệ thống dựa trên Debian như Ubuntu và các bản phân phối liên quan thường dùng định dạng .deb cùng với apt và dpkg.

Trong những năm gần đây, nhiều công cụ quản lý gói bổ trợ đã xuất hiện, chạy song song với các công cụ cốt lõi apt và dpkg. Ví dụ, snap mang lại tính di động và cách ly (sandboxing) vượt trội, còn Homebrew, vốn xuất phát từ macOS, cho phép cài đặt các công cụ dòng lệnh dành cho người dùng cá nhân, giúp tránh xung đột với các gói hệ thống.

Trong tài liệu này, bạn sẽ được tìm hiểu về một số công cụ quản lý gói phổ biến mà các quản trị viên hệ thống sử dụng trên các hệ thống Debian và Ubuntu. Đây là tài liệu tham khảo nhanh hữu ích giúp bạn thực hiện các nhiệm vụ quản lý gói trên các hệ thống này một cách hiệu quả.

Yêu cầu tiên quyết

  • Mộ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ạn có thể tham khảo hướng dẫn “Cài đặt ban đầu cần thiết Ubuntu 20.04” để biết cách thiết lập người dùng với quyền sudo.)

Bước 1 – Tổng quan về các công cụ quản lý gói của 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.

Hầu hết các công cụ này có mối quan hệ với nhau và hoạt động 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, trong khi các tiện ích khác tập trung vào cung cấp các chức năng cấp thấp.

apt

Lệnh apt có lẽ là thành phần được sử dụng nhiều nhất trong bộ công cụ apt. Mục đích chính của nó là giao tiếp với các kho lưu trữ từ xa do đội ngũ đóng gói của bản phân phối duy trì và thực hiện các thao tác trên các gói có sẵn.

Bộ công cụ apt hoạt động bằng cách lấy thông tin từ các kho lưu trữ từ xa về một 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ộ và cũng được dùng để thay đổi trạng thái của gói (tức là cài đặt hoặc gỡ bỏ gói khỏi hệ thống).

Lưu ý: Ở các phiên bản Ubuntu cũ, lệnh apt cốt lõi được gọi là apt-get. Nó đã được tinh giản lại, nhưng bạn vẫn có thể gọi bằng apt-get vì thói quen hoặc để tương thích với các phiên bản trước.

apt-cache

Một thành phần quan trọng khác của 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à các thuộc tính của chúng.

Ví dụ, khi bạn muốn tìm kiếm một gói cụ thể hoặc một công cụ thực hiện một chức năng nhất định, apt-cache là nơi tốt để bắt đầu. Nó cũng hữu ích khi bạn muốn biết chính xác phiên bản của gói nào sẽ được lựa chọn trong một quy trình nào đó. Thông tin về phụ thuộc và phụ thuộc ngược cũng là một lĩnh vực apt-cache hỗ trợ.

dpkg

Trong khi các công cụ trước tập trung vào quản lý các gói có sẵn trong các kho lưu trữ, lệnh dpkg cũng có thể được sử dụng để thao tác trên các gói .deb riêng lẻ. Công cụ dpkg thực hiện phần lớn công việc “hậu trường” của các lệnh trên; apt đảm nhận công việc dọn dẹp và dpkg tương tác trực tiếp với các gói.

Khác với các lệnh apt, dpkg không có khả năng tự động giải quyết các phụ thuộc. Chức năng chính của nó là làm việc trực tiếp với các gói .deb và phân tích cấu trúc của gói. Mặc dù dpkg có thể thu thập một số thông tin về các gói đã được cài đặt trên hệ thống, bạn không nên sử dụng nó như công cụ quản lý gói chính.

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 giữ danh sách các gói có sẵn của hệ thống luôn được cập nhật. Chúng cũng cung cấp các phương pháp khác nhau để cập nhật các gói bạn đã cài đặt trên máy chủ.

Cập nhật bộ nhớ đệm gói cục bộ

Các kho lưu trữ từ xa mà công cụ quản lý gói của bạn phụ thuộc vào để lấy thông tin về gói luôn được cập nhật liên tục. Tuy nhiên, hầu hết các 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 một bộ nhớ đệm cục bộ của thông tin này – và bộ nhớ đệm đó cần được làm mới đị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 khác. Điều này đảm bảo bạn đang làm việ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 có thể thất bại nếu bạn đang sử dụng thông tin gói đã lỗi thời.

Để cập nhật bộ nhớ đệm cục bộ, sử dụng lệnh apt với sub-command update:

sudo apt update

Cập nhật các gói

Lệnh apt phân biệt giữa hai quy trình cập nhật khác nhau. Quy trình cập nhật đầu tiên (được đề cập ở phần này) có thể được sử dụng để nâng cấp các thành phần không yêu cầu loại bỏ gói. Để biết cách cập nhật cho phép apt loại bỏ và thay thế các thành phần khi cần, hãy xem mục bên dưới.

Quy trình này rất quan trọng khi bạn không muốn loại bỏ bất kỳ gói nào đã được cài đặt theo bất kỳ hoàn cảnh nào. Tuy nhiên, một số bản cập nhật yêu cầu thay thế các thành phần hệ thống hoặc loại bỏ các tệp gây xung đột. Quy trình này sẽ bỏ qua bất kỳ bản cập nhật nào yêu cầu loại 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 yêu cầu phải loại bỏ. Điều này thường cần thiết khi các phụ thuộc thay đổi. Thường thì các gói bị loại bỏ sẽ được thay thế bằng các gói tương đương trong quá trình nâng cấp, do đó quá trình này thường an toàn. Tuy nhiên, bạn nên kiểm tra các gói sẽ bị loại bỏ để đảm bảo không có thành phần quan trọng nào bị đánh dấu loại bỏ.

Để thực hiện điều này, nhập:

sudo apt full-upgrade

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 các gói thường là tìm kiếm trong kho lưu trữ của bản phân phối để tìm các gói mà bạn cần.

Tìm kiếm gói là một thao tác nhắm vào bộ nhớ đệm gói để lấy thông tin. Để thực hiện việc này, hãy sử dụng lệnh apt-cache search. Hãy nhớ rằng bạn nên đảm bảo bộ nhớ đệm cục bộ của mình được cập nhật bằng lệnh sudo apt update trước khi tìm kiếm gói:

apt-cache search package

Vì quy trình này chỉ truy vấn thông tin nên không cần quyền sudo. Bất kỳ tìm kiếm nào được thực hiện sẽ kiểm tra cả tên gói và mô tả đầy đủ của 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

Như bạn có thể thấy, có một gói có tên htop, nhưng cũng có hai chương trình khác, mỗi chương trình đề cập đến htop trong phần mô tả đầy đủ của gói (mô tả hiển thị chỉ là bản tóm tắt ngắn).

Cài đặt gói từ kho lưu trữ

Để cài đặt một gói từ kho lưu trữ cùng với tất cả các phần phụ thuộc cần thiết, bạn có thể sử dụng lệnh apt với tham số install.

Cú pháp:

sudo apt install package

Bạn có thể cài đặt nhiều gói cùng một lúc bằng cách phân tách chúng bằng dấu cách:

sudo apt install package1 package2

Nếu gói bạn yêu cầu cần thêm các phần phụ thuộc, chúng sẽ được hiển thị và bạn sẽ được yêu cầu xác nhận trước khi tiếp tục. Ví dụ:

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]?Bạn có thể tiếp tục bằng cách nhấn Enter hoặc nhập Y, hoặc hủy bỏ bằng cách nhập n.

Cài đặt một phiên bản cụ thể của gói

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 =:

sudo apt install package=version

Bạn có thể kiểm tra các phiên bản khả dụng của gói bằng lệnh sau:

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

Cấu hình lại gói đã cài đặt

Một số gói yêu cầu thực hiện các bước cấu hình sau khi cài đặt. Nếu bạn cần chạy lại các bước này, hãy sử dụng lệnh:

sudo dpkg-reconfigure package

Thử nghiệm lệnh cài đặt mà không thực hiện thật

Bạn có thể kiểm tra trước các thay đổi mà lệnh cài đặt sẽ thực hiện mà không thực sự cài đặt gì cả bằng cách thêm cờ -s:

apt install -s package

Ví dụ:

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])

Điều này giúp bạn xem trước những thay đổi sẽ xảy ra mà không cần quyền sudo.

Cài đặt gói mà không cần xác nhận

Mặc định, apt sẽ yêu cầu xác nhận trước khi cài đặt. Nếu bạn muốn bỏ qua bước này, hãy sử dụng cờ -y:

apt -s dist-upgrade

Bạn cũng có thể áp dụng cách này khi nâng cấp hệ thống:

sudo apt install -y package
sudo apt dist-upgrade -y

Sửa lỗi phụ thuộc khi cài đặt gói

Nếu quá trình cài đặt bị lỗi do thiếu phụ thuộc, bạn có thể sử dụng lệnh sau để tự động sửa lỗi:

sudo apt install -f

Lệnh này sẽ tìm và cài đặt các gói bị thiếu để khắc phục vấn đề.

Tải gói từ kho lưu trữ mà không cài đặt

Nếu bạn chỉ muốn tải về một gói mà không cần cài đặt, sử dụng lệnh:

apt download package

Gói này sẽ được lưu trong thư mục hiện tại.

Cài đặt gói .deb

Một số nhà cung cấp phần mềm cung cấp file .deb thay vì cài đặt từ kho lưu trữ. Để cài đặt tệp .deb, bạn có thể sử dụng dpkg:

sudo dpkg --install debfile.deb

Tuy nhiên, dpkg không tự động xử lý phụ thuộc, vì vậy nếu có lỗi, bạn cần chạy lệnh:

sudo apt install -f

Lệnh này sẽ cài đặt bất kỳ phụ thuộc nào bị thiếu và hoàn tất quá trình cài đặt.

Bước 4 – Gỡ cài đặt gói và dọn dẹp hệ thống

Phần này sẽ trình bày cách gỡ cài đặt các gói và dọn dẹp các tệp có thể bị bỏ lại sau các thao tác quản lý gói.

Gỡ cài đặt một gói

Để loại bỏ một gói đã được cài đặt, bạn sử 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 đặt lên hệ thống, ngoại trừ một điểm quan trọng.

Lệnh này giữ lại các tệp cấu hình, nhằm đảm bảo rằng cấu hình của bạn vẫn có sẵn nếu sau này bạn cần cài đặt lại ứng dụng. Điều này rất hữu ích vì có nghĩa là bất kỳ tệp cấu hình tùy chỉnh nào của bạn sẽ không bị xóa nếu bạn vô tình gỡ bỏ một gói.

Để hoàn thành thao tác này, bạn cần cung cấp tên của gói mà bạn muốn gỡ cài đặt:

sudo apt remove package

Gỡ cài đặt một gói và xóa sạch tất cả tệp cấu hình

Nếu bạn muốn gỡ bỏ một gói và tất cả các tệp liên quan khỏi hệ thống, bao gồm cả các tệp cấu hình, bạn có thể sử dụng lệnh apt purge.

Khác với lệnh remove đã nêu trên, lệnh purge sẽ xóa sạch mọi thứ. Điều này rất hữu ích nếu bạn không muốn lưu giữ các tệp cấu hình hoặc nếu gặp sự cố và muốn khởi đầu lại từ đầu.

Lưu ý rằng, một khi các tệp cấu hình của bạn bị xóa, bạn sẽ không thể khôi phục chúng lại:

sudo apt purge package

Xóa các gói phụ thuộc không còn cần thiết

Khi gỡ bỏ các gói khỏi hệ thống bằng lệnh apt remove hoặc apt purge, gói mục tiêu sẽ bị xóa. Tuy nhiên, các phụ thuộc được cài đặt tự động để đáp ứng yêu cầu cài đặt sẽ vẫn còn lại.

Để tự động loại bỏ các gói phụ thuộc không còn cần thiết cho bất kỳ gói nào, bạn có thể sử dụng lệnh autoremove:

sudo apt autoremove

Nếu bạn muốn loại bỏ cả các tệp cấu hình liên quan của các phụ thuộc bị gỡ bỏ, bạn cần thêm tham số –purge vào lệnh autoremove. Điều này sẽ dọn dẹp các tệp cấu hình, tương tự như lệnh purge khi gỡ bỏ một gói cụ thể:

sudo apt --purge autoremove
Xóa các tệp gói lỗi thời để giải phóng dung lượng

Khi các gói được thêm vào và gỡ bỏ khỏi kho lưu trữ bởi các quản trị viên gói của bản phân phối, 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 khả dụng trong kho lưu trữ bằng cách sử dụng lệnh autoclean.

Điều này sẽ giải phóng không gian trên máy chủ của bạn và loại bỏ các gói có thể đã lỗi thời trong bộ nhớ đệm cục bộ.

sudo apt autoclean

Lệnh này không xóa các gói đang được cài đặt, mà chỉ xóa các tệp cũ không còn trong kho lưu trữ, giúp tiết kiệm dung lượng ổ đĩa.

Tóm tắt các lệnh quan trọng

Chức năng Lệnh
Gỡ cài đặt gói nhưng giữ lại tệp cấu hình sudo apt remove package
Gỡ cài đặt gói và xóa luôn tệp cấu hình sudo apt purge package
Xóa các gói phụ thuộc không còn cần thiết sudo apt autoremove
Xóa các gói phụ thuộc không còn cần thiết và cả tệp cấu hình của chúng sudo apt --purge autoremove
Xóa các tệp cũ, giải phóng dung lượng sudo apt autoclean

Bây giờ, bạn đã biết cách quản lý các gói đã cài đặt và giữ cho hệ thống luôn sạch sẽ!

Bước 5 – Lấy thông tin về gói

Mỗi gói phần mềm chứa một lượng lớn siêu dữ liệu mà bạn có thể truy cập bằng các công cụ quản lý gói. Phần này sẽ trình bày một số cách phổ biến để lấy thông tin về các gói có sẵn và đã được cài đặt.

Hiển thị thông tin chi tiết về một gói trong kho lưu trữ

Để hiển thị thông tin chi tiết về một gói trong kho lưu trữ của bản phân phối, bạn có thể sử dụng lệnh apt-cache show. Đối tượng của lệnh này là tên của gói trong kho lưu trữ. Ví dụ:

apt-cache show nginx

Lệnh này sẽ hiển thị thông tin về các ứng viên cài đặt cho gói được chỉ định. Mỗi ứng viên sẽ có các thông tin về các phụ thuộc, phiên bản, kiến trúc, xung đột, tên tệp gói thực tế, dung lượng của gói cũng như cài đặt, và một mô tả chi tiết cùng các 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 ứng viên, bao gồm cả danh sách đầy đủ các phụ thuộc ngược (tức là danh sách các gói phụ thuộc vào gói được truy vấn), bạn có thể sử dụng lệnh showpkg:

apt-cache showpkg package

Hiển thị thông tin của một gói .deb

Để hiển thị chi tiết về một tệp .deb, bạn có thể sử dụng cờ –info với lệnh dpkg. Đối tượng của lệnh này phải là đường dẫn tới tệp .deb:

dpkg --info debfile.deb

Lệnh này sẽ hiển thị một số siêu dữ liệu về gói, bao gồm tên gói và phiên bản, kiến trúc mà nó được xây dựng, dung lượng và các phụ thuộc cần thiết, mô tả và các xung đột.

Để liệt kê cụ thể các phụ thuộc (các gói mà gói này phụ thuộc vào) và các phụ thuộc ngược (các gói phụ thuộc vào gói này), bạn có thể sử dụng tiện ích apt-cache.

Đối với thông tin phụ thuộc thông thường, bạn có thể sử dụng sub-command 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ê như là phụ thuộc cứng, gợi ý, khuyến nghị, hoặc xung đột.

Nếu bạn cần tìm ra gói nào phụ thuộc vào một gói nhất định, bạn có thể chuyển gói đó cho lệnh apt-cache rdepends:

apt-cache rdepends package

Hiển thị phiên bản gói đã cài đặt và có sẵn

Thường có nhiều phiên bản của một gói trong kho lưu trữ, với một phiên bản mặc định được chọn. Để xem các phiên bản có sẵn của một gói, bạn có thể sử dụng lệnh:

apt-cache policy package

Lệnh này sẽ hiển thị phiên bản nào đã được cài đặt (nếu có), phiên bản sẽ được cài đặt theo mặc định nếu bạn không chỉ định phiên bản khi cài đặt, và một bảng các phiên bản gói kèm theo trọng số chỉ ra mức ưu tiên của từng phiên bản.

Thông tin này có thể giúp bạn xác định phiên bản nào sẽ được cài đặt và các lựa chọn thay thế có sẵn. Vì lệnh này cũng liệt kê các kho lưu trữ chứa từng phiên bản, nên nó hữu ích để xác định xem có kho lưu trữ bổ sung nào đang ghi đè lên các gói từ kho lưu trữ mặc định hay không.

Hiển thị các gói đã cài đặt với dpkg -l

Để hiển thị các gói đã được cài đặt trên hệ thống, bạn có một vài phương pháp khác nhau với định dạng và mức độ chi tiết khác nhau.

Phương pháp đầu tiên là sử dụng lệnh dpkg hoặc dpkg-query với cờ -l. Đầu ra của cả hai lệnh này là giống nhau. Nếu không truyền đối số nào, nó sẽ liệt kê tất cả các gói đã được cài đặt hoặc cài đặt một phần trên hệ thống. Ví dụ:

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 sẽ tiếp tục liệt kê tất cả các gói trên hệ thống. Phía trên đầu ra, bạn có thể thấy ý nghĩa của ba ký tự đầu tiên trên mỗi dòng:

  • Ký tự đầu tiên chỉ trạng thái mong muốn của gói:

    • u: Unknown (không xác định)
    • i: Installed (đã cài đặt)
    • r: Removed (đã gỡ bỏ)
    • p: Purged (đã loại bỏ hoàn toàn)
    • h: Version held (phiên bản bị giữ lại)
  • Ký tự thứ hai chỉ trạng thái thực tế của gói theo hệ thống quản lý gói:

    • n: Not installed (chưa cài đặt)
    • i: Installed (đã cài đặt)
    • c: Configuration files are present, but the application is uninstalled (các tệp cấu hình vẫn còn, nhưng ứng dụng đã bị gỡ bỏ)
    • u: Unpacked (đã giải nén, nhưng chưa được cấu hình)
    • f: The package is half installed (gói được cài đặt một nửa, nghĩa là quá trình cài đặt bị gián đoạn)
    • w: The package is waiting for a trigger from a separate package (gói đang chờ kích hoạt từ một gói khác)
    • p: The package has been triggered by another package (gói đã được kích hoạt bởi gói khác)
  • Ký tự thứ ba, thường là khoảng trắng, chỉ có một lựa chọn khác:

    • r: Chỉ ra rằng gói cần được cài đặt lại, thường có nghĩa là gói đang bị hỏng và không hoạt động.

Phần còn lại của các cột bao gồm 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 các gói theo bộ lọc

Nếu bạn thêm một mẫu tìm kiếm sau cờ -l, lệnh dpkg sẽ liệt kê tất cả các gói (dù đã cài đặt hay chưa) chứa mẫu đó. Ví dụ, để tìm kiếm các thư viện xử lý YAML:

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 từ cột đầu tiên, kết quả thứ ba và thứ tư không được cài đặt. Điều này cung cấp cho bạn danh sách tất cả các gói khớp với mẫu, cùng trạng thái hiện tại và trạng thái mong muốn của chúng.

Một cách khác để hiển thị các gói đã cài đặt trên hệ thống là dùng lệnh dpkg –get-selections. Lệnh này liệt kê tất cả các gói đã được cài đặt hoặc đã bị gỡ bỏ nhưng chưa bị loại bỏ hoàn toàn:

dpkg --get-selections

Để phân biệt giữa các trạng thái, bạn có thể chuyển đầu ra của dpkg qua lệnh awk để lọc theo trạng thái. Ví dụ, để chỉ hiển thị các gói đã được cài đặt:

dpkg --get-selections | awk '$2 ~ /^install/'

Để lấy danh sách các gói bị gỡ bỏ mà chưa xóa tệp cấu hình, bạn có thể sử dụng:

dpkg --get-selections | awk '$2 !~ /^install/'

Bạn cũng có thể muốn tìm hiểu thêm về cách chuyển hướng đầu ra của lệnh thông qua awk.
Tìm kiếm các gói đã cài đặt

Để tìm kiếm trong cơ sở dữ liệu các gói đã cài đặt cho một gói cụ thể, bạn có thể thêm một chuỗi lọc sau tùy chọn –get-selections. Phương pháp này hỗ trợ tìm kiếm với ký tự đại diện (wildcards) và sẽ hiển thị tất cả các gói đã cài đặt hoặc vẫn giữ các tệp cấu hình trên hệ thống:

dpkg --get-selections libz*

Bạn có thể lọc lại kết quả bằng cách sử dụng biểu thức của awk như ở phần trước.

Liệt kê các tệp được cài đặt bởi một gói

Để tìm ra các tệp mà một gói chịu trách nhiệm cài đặt, sử 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 được kiểm soát bởi gói. Lưu ý rằng các tệp cấu hình được tạo ra bởi các tiến trình của gói sẽ không được bao gồm.

Để tìm ra gói nào chịu trách nhiệm cài đặt một tệp cụ thể trong hệ thống của bạn, bạn có thể chuyển đường dẫn tuyệt đối đó cho lệnh dpkg -S:

dpkg -S /path/to/file

Hãy nhớ rằng các tệp được di chuyển bởi các script sau cài đặt có thể không được liên kết lại với gói qua kỹ thuật này.

Tìm gói cung cấp một tệp mà không cần cài đặt nó

Sử dụng dpkg -S, bạn có thể xác định gói nào sở hữu một tệp. 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.

Để làm được điều này, bạn cần cài đặt tiện ích apt-file. Công cụ này duy trì cơ sở dữ liệu riêng của nó, bao gồm đường dẫn cài đặt của mọi tệp do gói kiểm soát trong kho dữ liệu.

Cài đặt gói apt-file như bình thường:

sudo apt update
sudo apt install apt-file

Sau đó, cập nhật cơ sở dữ liệu của công cụ và tìm kiếm một tệp bằng cách nhập:

sudo apt-file update
sudo apt-file search /path/to/file

Lưu ý rằng phương pháp này chỉ hoạt động đối với các vị trí tệp được cài đặt trực tiếp bởi gói. Bất kỳ tệp nào được tạo ra thông qua các script sau cài đặt sẽ không thể truy vấn được.

Trong bước tiếp theo, bạn sẽ học cách nhập và xuất danh sách các gói đã cài đặt.

Bước 6 – Chuyển đổi danh sách gói giữa các hệ thống

Nhiều lúc, bạn có thể cần sao lưu danh sách các gói đã cài đặt từ một hệ thống và sử dụng nó để cài đặt cùng bộ gói trên một hệ thống khác. Điều này cũng hữu ích cho mục đích sao lưu. Phần này sẽ trình bày cách xuất và nhập danh sách các gói.

Nếu bạn cần nhân rộng bộ gói đã cài đặt trên một hệ thống sang hệ thống khác, trước tiên bạn cần phải xuất danh sách gói của mình.

Bạn có thể xuất danh sách các gói đã cài đặt ra một tệp bằng cách chuyển hướng đầu ra của lệnh dpkg --get-selections vào một tệp văn bản:

dpkg --get-selections > ~/packagelist.txt

Bạn cũng có thể muốn tìm hiểu thêm về cách chuyển hướng đầu vào và đầu ra.

Danh sách này sau đó có thể được sao chép sang máy tính thứ hai và nhập vào.

Ngoài ra, bạn có thể cần sao lưu danh sách nguồn (sources list) và danh sách khóa tin cậy của mình. Bạn có thể sao lưu các nguồn bằng cách tạo một thư mục mới và sao chép chúng từ cấu hình hệ thống ở /etc/apt/:

mkdir ~/sources
cp -R /etc/apt/sources.list* ~/sources

Bất kỳ khóa nào mà bạn đã thêm để cài đặt các gói từ các kho lưu trữ bên thứ ba cũng có thể được xuất ra bằng lệnh:

apt-key exportall > ~/trusted_keys.txt

Bây giờ, bạn có thể chuyển tệp packagelist.txt, thư mục sources và tệp trusted_keys.txt sang máy tính khác để nhập.

Nhập danh sách gói

Nếu bạn đã tạo danh sách gói bằng cách sử dụng dpkg --get-selections như đã trình bày ở trên, bạn có thể nhập các gói trên máy tính khác bằng lệnh dpkg nữa.

Đầu tiên, bạn cần thêm các khóa tin cậy và cài đặt danh sách nguồn mà bạn đã sao chép từ môi trường đầu tiên. Giả sử rằng tất cả dữ liệu sao lưu đã được chuyển sang thư mục home của máy tính mới, bạn có thể nhập:

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ả các gói không cần thiết trên máy tính mới. Điều này đảm bảo rằng bạn đang áp dụng các thay đổi trên một môi trường sạch. Việc này phải được thực hiện bằng tài khoản root hoặc với quyền sudo:

sudo dpkg --clear-selections

Lệnh này sẽ đánh dấu tất cả các gói không cần thiết để gỡ cài đặt. Bạn nên cập nhật danh sách gói cục bộ để quá trình cài đặt có thông tin về tất cả phần mềm bạn dự định cài đặt. Quá trình cài đặt và nâng cấp thực tế sẽ được thực hiện bởi một công cụ có tên là dselect.

Bạn cần đảm bảo rằng công cụ dselect đã được cài đặt. Công cụ này duy trì cơ sở dữ liệu riêng, vì vậy bạn cũng cần cập nhật nó trước khi tiếp tục:

sudo apt update
sudo apt install dselect
sudo dselect update

Tiếp theo, bạn có thể áp dụng danh sách gói lên danh sách hiện tại để cấu hình xem gói nào nên được giữ lại hoặc tải về:

sudo dpkg --set-selections < packagelist.txt

Lệnh này thiết lập trạng thái đúng cho các gói. Để áp dụng các thay đổi, chạy:

sudo apt dselect-upgrade

Lệnh này sẽ tải xuống và cài đặt bất kỳ gói cần thiết nào, đồng thời gỡ bỏ các gói được đánh dấu loại bỏ. Cuối cùng, danh sách gói của bạn sẽ khớp với danh sách của máy tính 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ể sử dụng một công cụ như etckeeper để di chuyển các tệp cấu hình từ thư mục /etc.

Trong bước tiếp theo và cuối cùng, bạn sẽ tìm hiểu cách làm việc với các kho lưu trữ gói của bên thứ ba.

Bước 7 – Thêm kho lưu trữ và PPAs

Mặc dù tập hợp các kho lưu trữ mặc định do hầu hết các bản phân phối cung cấp thường là dễ bảo trì nhất, nhưng có những lúc các nguồn bổ sung lại rất hữu ích. Phần này sẽ trình bày cách cấu hình công cụ đóng gói của bạn để tham khảo thêm các nguồn bên ngoài.

Một lựa chọn thay thế cho các kho lưu trữ truyền thống trên Ubuntu là PPAs, hay “personal package archives”. Các phiên bản Linux khác thường sử dụng khái niệm khác nhưng tương tự cho các kho lưu trữ bên thứ ba. Thông thường, PPAs có phạm vi nhỏ hơn so với kho lưu trữ chính và chứa các bộ ứng dụng tập trung được duy trì bởi chủ sở hữu PPA.

Việc thêm PPAs vào hệ thống cho phép bạn quản lý các gói chứa trong đó bằng công cụ quản lý gói thông thường, giúp cung cấp các gói cập nhật hơn mà không có trong kho lưu trữ mặc định. Hãy chú ý chỉ thêm những PPAs mà bạn tin cậy, vì bạn đang cho phép một người duy trì không tiêu chuẩn xây dựng các gói cho hệ thống của mình.

Để thêm một PPA, bạn có thể sử dụng lệnh add-apt-repository. Đối tượng của lệnh này cần bao gồm nhãn “ppa:” theo sau là tên chủ sở hữu PPA trên Launchpad, dấu gạch chéo và tên PPA, ví dụ:

sudo add-apt-repository ppa:owner_name/ppa_name

Có thể bạn sẽ được yêu cầu chấp nhận khóa của người đóng gói. Sau đó, PPA sẽ được thêm vào hệ thống của bạn, cho phép bạn cài đặt các gói bằng các lệnh apt thông thường. Trước khi tìm kiếm hoặc cài đặt gói, hãy đảm bảo cập nhật bộ nhớ đệm cục bộ với thông tin về PPA mới:

sudo apt update

Bạn cũng có thể chỉnh sửa cấu hình kho lưu trữ trực tiếp. Bạn có thể sửa tệp /etc/apt/sources.list hoặc tạo một tệp danh sách mới trong thư mục /etc/apt/sources.list.d. Nếu chọn cách thứ hai, tên tệp bạn tạo 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 kho lưu trữ 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 của định nghĩa kho lưu trữ bao gồm:

  • deb hoặc deb-src: Xác định loại kho lưu trữ. Các kho lưu trữ thông thường được đánh dấu với deb, trong khi kho lưu trữ nguồn bắt đầu bằng deb-src.
  • url: Địa chỉ URL chính của kho lưu trữ, là nơi kho lưu trữ được tìm thấy.
  • release code name hoặc suite: Thông thường là tên mã của bản phát hành của bạn, nhưng cũng có thể là bất kỳ tên nào được sử dụng để xác định một bộ gói cụ thể cho phiên bản của bản phân phối.
  • component names: Các nhãn cho bộ gói mà bạn muốn có sẵn. Đây thường là sự phân biệt do người duy trì kho lưu trữ cung cấp để thể hiện độ tin cậy hoặc các hạn chế về bản quyền của phần mềm chứa trong kho.

Bạn có thể thêm các dòng này vào trong tệp. Hầu hết các kho lưu trữ sẽ có thông tin chi tiết về định dạng chính xác cần sử dụng. Trên một số bản phân phối Linux khác, bạn cũng có thể thêm các nguồn kho lưu trữ bổ sung bằng cách cài đặt các gói chỉ chứa tệp cấu hình cho kho lưu trữ đó – phù hợp với cách thức hoạt động của các trình quản lý gói.

Kết luận

Quản lý gói được xem là một trong những yếu tố then chốt trong quản trị hệ thống Linux. Mặc dù có rất nhiều thao tác quản lý gói khác nhau mà bạn có thể thực hiện, bài viết này đã cung cấp những kiến thức cơ bản về Ubuntu – những nội dung dễ dàng áp dụng cho các bản phân phối Linux khác chỉ với vài điều chỉnh nhỏ.

Tiếp theo, bạn có thể khám phá sâu hơn về cách quản lý gói trên các nền tảng Linux khác để mở rộng kiến thức và kỹ năng quản trị của mình.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *