Lệnh dpkg trong Linux — Quản lý gói phần mềm .deb

Bạn đã bao giờ rơi vào tình huống đang quản trị một hệ thống VPS thì phát hiện ra một gói phần mềm bị lỗi hoặc xung đột phiên bản chưa nhỉ? Với kinh nghiệm của một Senior System Admin, mình hiểu rằng việc kiểm soát các gói cài đặt trên Debian hay Ubuntu là vô cùng quan trọng để đảm bảo hệ thống luôn ổn định. Vậy dpkg là gì và tại sao nó lại là "xương sống" trong việc quản lý gói phần mềm? Thực tế, dpkg là trình quản lý gói cấp thấp giúp bạn can thiệp sâu vào hệ thống. Hiểu rõ cách dùng dpkg sẽ giúp bạn làm chủ hoàn toàn việc cài đặt, gỡ bỏ hoặc sửa lỗi các tệp .deb một cách nhanh chóng. Tất nhiên, khi bạn đã nắm vững cách cài đặt gói deb bằng lệnh này, việc quản trị Linux sẽ trở nên dễ dàng hơn bao giờ hết, đúng không nào?

Cần chuẩn bị gì trước khi dùng lệnh dpkg?

  • Quyền người dùng: Yêu cầu quyền root hoặc sử dụng sudo để thực hiện các thao tác cài đặt, gỡ bỏ hoặc quản lý gói phần mềm.
  • Hệ điều hành hỗ trợ: Các bản phân phối Linux dựa trên Debian như Ubuntu, Linux Mint, Debian, Kali Linux và các hệ thống sử dụng trình quản lý gói APT.
  • Package dependencies: Lệnh dpkg được tích hợp sẵn trong hệ thống Debian-based, không cần cài đặt thêm gói bổ sung để sử dụng cơ bản.

Cú pháp lệnh dpkg là gì?

Lệnh dpkg hỗ trợ nhiều dạng cú pháp khác nhau trên hệ thống Debian/Ubuntu để quản lý các gói phần mềm.

dpkg [OPTION...] FILE...
dpkg --configure [PACKAGE...]
dpkg --status [PACKAGE...]
# Tùy chọn thường dùng của lệnh dpkg

Các tùy chọn của lệnh dpkg là gì?

Lệnh dpkg cung cấp nhiều tùy chọn để quản lý gói phần mềm, bao gồm các chức năng cài đặt, gỡ cài đặt, liệt kê và truy vấn thông tin gói.

Tùy chọn ngắn Tùy chọn dài Mô tả
-i --install dpkg -i [gói.deb] cài đặt gói Debian từ tệp .deb. Nếu gói đã tồn tại, nó sẽ được nâng cấp.
-r --remove dpkg -r [tên-gói] gỡ cài đặt gói nhưng giữ lại tệp cấu hình.
-P --purge dpkg -P [tên-gói] gỡ cài đặt gói hoàn toàn, bao gồm tệp cấu hình.
-l --list dpkg -l liệt kê tất cả các gói được cài đặt trên hệ thống.
-L --listfiles dpkg -L [tên-gói] hiển thị danh sách tất cả các tệp thuộc một gói cụ thể.
-s --status dpkg -s [tên-gói] hiển thị trạng thái chi tiết và thông tin của một gói.
-S --search dpkg -S [tệp] tìm kiếm xem tệp nào thuộc gói nào đã được cài đặt.
-p --print-avail dpkg -p [tên-gói] hiển thị thông tin chi tiết về một gói (từ cơ sở dữ liệu dpkg).
-c --contents dpkg -c [gói.deb] liệt kê nội dung của tệp .deb mà chưa cài đặt.
-I --info dpkg -I [gói.deb] hiển thị thông tin chi tiết về tệp .deb (tên, phiên bản, mô tả).
-C --audit dpkg -C kiểm tra và báo cáo các gói bị hỏng hoặc cấu hình không hoàn chỉnh.
--configure dpkg --configure [tên-gói] cấu hình các gói chưa được cấu hình hoặc bị hỏng.
--get-selections dpkg --get-selections liệt kê các gói được chọn cài đặt hoặc gỡ cài đặt.
--set-selections dpkg --set-selections đặt trạng thái lựa chọn gói dựa trên đầu vào từ tệp.
--compare-versions dpkg --compare-versions [ver1] [toán-tử] [ver2] so sánh hai phiên bản gói theo quy tắc Debian.
-v --verbose dpkg -v hiển thị thông tin chi tiết trong quá trình thực hiện lệnh.
--force-all dpkg --force-all bỏ qua tất cả các kiểm tra lỗi và cảnh báo (sử dụng cẩn thận).
--no-act dpkg --no-act mô phỏng hành động mà không thực hiện thay đổi thực tế.

xem thêm: Package Management

Cách sử dụng lệnh dpkg trong quản lý gói Debian/Ubuntu?

Dưới đây là các tình huống sử dụng lệnh dpkg phổ biến trong quá trình quản trị hệ thống và xử lý lỗi gói phần mềm.

dpkg là gì? [Liệt kê các gói đã cài đặt]

dpkg --list
ii  vim         8.2.2434-3ubuntu3   amd64   ViIM improved version
ii  curl        7.81.0-1ubuntu1    amd64   command line tool for transferring data

Lệnh hiển thị danh sách toàn bộ các gói phần mềm hiện có trên hệ thống kèm trạng thái cài đặt. Trong thực tế, sysadmin thường dùng lệnh này để kiểm tra phiên bản cụ thể của một gói đang chạy.

dpkg -i là gì? [Cài đặt gói từ file .deb]

sudo dpkg -i google-chrome-stable_current_amd64.deb
Selecting existing dpkg database ...
Preparing to unpack ...
Unpacking google-chrome-stable ...
Setting up google-chrome-stable ...

Lệnh thực hiện cài đặt một gói phần mềm từ tệp tin định dạng .deb có sẵn trên ổ đĩa. Trên môi trường production, đây là cách phổ biến để cài đặt các phần mềm không có sẵn trong kho lưu trữ chính thức (repository).

dpkg -l là gì? [Tìm kiếm thông tin một gói cụ thể]

dpkg -l | grep nginx
ii  nginx:amd64  1.18.0-6ubuntu14.4   amd64   high performance web server

Kết hợp với lệnh grep để lọc ra thông tin chi tiết của một gói phần mềm cụ thể. Trong thực tế, kỹ thuật này giúp xác định nhanh chóng trạng thái và phiên bản của dịch vụ đang gặp lỗi.

dpkg -r là gì? [Gỡ bỏ gói phần mềm]

sudo dpkg -r nginx
Removing nginx ...
Processing triggers for libc-bin (2.35-0ubuntu3) ...

Lệnh gỡ bỏ một gói phần mềm khỏi hệ thống nhưng vẫn giữ lại các tệp cấu hình. Trên môi trường quản trị, việc sử dụng lệnh này cho phép bạn tái cấu hình dịch vụ mà không cần cài đặt lại từ đầu.

dpkg -S là gì? [Tìm tệp tin thuộc về gói nào]

dpkg -S /etc/passwd
dpkg: error: no path found matching pattern '/etc/passwd'
dpkg -S /bin/ls
bash: dpkg: error: no path found matching pattern '/bin/ls'
dpkg -S /usr/bin/python3
python3: /usr/bin/python3

Lệnh truy vấn ngược để xác định tệp tin cụ thể thuộc về gói phần mềm nào. Trong các tình huống xử lý sự cố, lệnh này giúp lập trình viên xác định chính xác gói nào cần được cập nhật hoặc gỡ bỏ khi có xung đột tệp tin.

Làm thế nào để khắc phục các lỗi thường gặp khi sử dụng lệnh dpkg?

Trong quá trình quản lý gói phần mềm trên Debian hoặc Ubuntu, bạn có thể gặp phải các tình huống lỗi phát sinh từ xung đột gói hoặc gián đoạn quá trình cài đặt.

Lỗi gói phụ thuộc bị hỏng (Broken dependencies)

sudo dpkg -i package_name.deb
dpkg: error processing package 'package_name' (--install):
 dependency problems - leaving unconfigured
package_name depends on libexample1; however:
 Package libexample1 is not installed.

Lỗi này xảy ra khi gói phần mềm bạn đang cài đặt yêu cầu các thư viện hoặc gói phụ thuộc khác nhưng chúng chưa có sẵn trong hệ thống.

Lỗi khóa cơ sở dữ liệu dpkg (dpkg status database is locked)

sudo dpkg -i package_name.deb
dpkg: error: dpkg status database is locked by another process

Tình huống này xuất hiện khi một tiến trình khác, chẳng hạn như trình cập nhật tự động (unattended-upgrades) hoặc một trình quản lý gói khác (apt), đang chiếm quyền kiểm soát cơ sở dữ liệu gói.

Lỗi ghi đè tệp tin (trying to overwrite file)

sudo dpkg -i package_name.deb
dpkg: error processing package 'package_name' (--install):
 dpkg: attempting to unpack package package_name in directory / is trying to overwrite '/usr/bin/example', which is also in package other_package
dpkg: error: dpkg status database is locked by another process

Lỗi này xảy ra khi gói bạn đang cài đặt cố gắng ghi đè lên một tệp tin đã tồn tại và thuộc quyền quản lý của một gói phần mềm khác trong hệ thống.

Lỗi cấu hình gói bị dở dang (Package is in an unconfigured state)

dpkg --configure -a
dpkg: error: dpkg status database is locked by another process

Trường hợp này xảy ra khi quá trình cài đặt hoặc gỡ bỏ trước đó bị ngắt quãng đột ngột, khiến trạng thái của gói nằm ở mức trung gian và gây lỗi cho các lệnh quản lý gói tiếp theo.

Quy trình thực tế dùng dpkg trong quản lý gói phần mềm Debian/Ubuntu?

Trong kịch bản triển khai ứng dụng trên server, dpkg thường được sử dụng để xử lý các tệp tin cài đặt thủ công khi các kho lưu trữ mặc định không có sẵn gói cần thiết.

Bước 1: Kiểm tra sự tồn tại của gói phần mềm trong hệ thống

dpkg -l | grep nginx
ii  nginx  1.18.0-6ubuntu1  amd64  high performance web server

Lệnh giúp xác định xem gói phần mềm đã được cài đặt hay chưa và kiểm tra trạng thái hiện tại của gói.

Bước 2: Cài đặt gói phần mềm từ tệp tin .deb cục bộ

sudo dpkg -i nginx_1.18.0_amd64.deb
Selecting existing dpkg database version '1.18.0'
Preparing to unpack .../nginx_1.18.0_amd64.deb ...
Unpacking nginx ...

Cho phép bạn cài đặt trực tiếp một gói phần mềm từ tệp tin định dạng .deb đã tải về máy.

Bước 3: Xử lý các phụ thuộc (dependencies) bị thiếu sau khi cài đặt

sudo apt-get install -f
Reading package lists... Done
Building dependency tree... Done
The following additional packages will be installed:
  libnginx-mod-http-geoip

Trong các trường hợp cài đặt bằng dpkg gây ra lỗi thiếu thư viện, lệnh này giúp tự động tìm kiếm và cài đặt các gói phụ thuộc còn thiếu để hoàn tất quy trình.

Bước 4: Gỡ bỏ gói phần mềm không còn sử dụng

sudo dpkg -r nginx
Removing nginx ...
Processing triggers for libc-bin ...

Cho phép bạn loại bỏ gói phần mềm khỏi hệ thống nhưng vẫn giữ lại các tệp cấu hình nếu cần thiết.

Việc sử dụng lệnh dpkg trên môi trường VPS đòi hỏi sự chính xác về thứ tự phụ thuộc giữa các gói phần mềm. Trong các trường hợp cài đặt file .deb thủ công, lệnh dpkg không tự động tải các gói phụ thuộc từ kho lưu trữ như apt. Điều này dẫn đến lỗi "dependency problems" khi thực thi lệnh dpkg -i package_name.deb. Để xử lý tình trạng này trên VPS, người dùng cần chạy lệnh sudo apt-get install -f ngay sau khi lệnh dpkg báo lỗi để hệ thống tự động tìm và cài đặt các thành phần còn thiếu. Ngoài ra, việc quản lý cơ sở dữ liệu gói cần sự cẩn trọng; các lệnh dpkg --remove hoặc dpkg --purge có thể xóa bỏ cấu hình hệ thống nếu không kiểm tra kỹ danh sách gói liên quan. Sử dụng dpkg --list giúp kiểm tra trạng thái chính xác của gói trước khi tiến hành các thay đổi quan trọng trên VPS.

Những câu hỏi thường gặp về lệnh dpkg?

Dưới đây là các thắc mắc phổ biến nhất của người dùng khi thao tác với trình quản lý gói dpkg trên hệ điều hành Debian hoặc Ubuntu.

Làm thế nào để cài đặt một tệp gói .deb có sẵn?

Bạn có thể sử dụng tùy chọn -i để cài đặt trực tiếp một tệp tin gói đã tải về máy.

sudo dpkg -i package_name.deb
Selecting existing dpkg database ...
Processing triggers for libc-bin ...

Làm sao để liệt kê tất cả các gói đã cài đặt trong hệ thống?

Sử dụng tùy chọn -l để hiển thị danh sách toàn bộ các gói kèm theo trạng thái cài đặt của chúng.

dpkg -l
Desired=و Uninstalled
Status=វ Installed
||= Not installed
Name    Version Architecture Description
vim     2:8.2.2434-3 amd64    ViIM editor

Cách kiểm tra thông tin chi tiết của một gói cụ thể là gì?

Tùy chọn -s cho phép bạn xem thông tin về phiên bản, mô tả và các phụ thuộc của gói đó.

dpkg -s vim
Package: vim
Status: install ok installed
Priority: optional
Section: editors
Installed-Size: 150000
Maintainer: Debian Maintainers
Version: 2:8.2.2434-3
Description: Vi IMproved - enhanced vi editor

Làm thế nào để gỡ bỏ một gói đã cài đặt?

Bạn sử dụng tùy chọn -r để gỡ bỏ gói nhưng vẫn giữ lại các tệp cấu hình trong hệ thống.

sudo dpkg -r vim
Removing vim (2:8.2.2434-3) ...

Cách xóa hoàn toàn một gói bao gồm cả các tệp cấu hình?

Sử dụng tùy chọn --purge để loại bỏ hoàn toàn gói và tất cả các tệp cấu hình liên quan.

sudo dpkg --purge vim
Purging vim (2:8.2.2434-3) ...

Làm cách nào để xem danh sách các tệp tin mà một gói đã cài đặt?

Sử dụng tùy chọn -L để liệt kê tất cả các đường dẫn tệp tin thuộc về gói đó.

dpkg -L vim
/usr/bin/vim
/usr/share/vim/vimrc

Làm thế nào để tìm kiếm một tệp tin cụ thể thuộc về gói nào?

Tùy chọn -S cho phép bạn tra cứu gói sở hữu một tệp tin hoặc thư mục nhất định.

dpkg -S /usr/bin/vim
vim: /usr/bin/vim

Lệnh dpkg là công cụ quản lý gói cơ bản và quan trọng nhất trên các hệ điều hành dựa trên Debian để cài đặt, gỡ bỏ hoặc quản lý các tệp tin .deb. Bạn có thể vô cùng dễ dàng kiểm soát hệ thống khi nắm vững các tham số như -i để cài đặt gói mới hay -l để liệt kê danh sách các gói đã cài đặt trên máy, đúng không nhỉ? Việc hiểu rõ cách vận hành của công cụ này tất nhiên sẽ giúp bạn làm chủ hệ thống Linux một cách chuyên nghiệp hơn rất nhiều. Chúc bạn thành công!