Quản lý Package với apt trên Ubuntu: apt vs apt-get vs dpkg — Dùng cái nào cho đúng?

Ubuntu tutorial - IT technology blog
Ubuntu tutorial - IT technology blog

Khi mình mới chuyển từ CentOS sang Ubuntu, mình mất khoảng 1 tuần để quen với hệ thống package management. Không phải vì apt khó — mà vì có quá nhiều lệnh trông giống nhau: apt, apt-get, apt-cache, dpkg… Cứ không biết cái nào “chuẩn”, cái nào là alias của cái nào.

Bài này mình giải thích thẳng vào vấn đề đó. Không phải “hướng dẫn A-Z cho người mới” — mà là giúp bạn hiểu bức tranh tổng thể để dùng đúng công cụ đúng lúc.

So sánh các công cụ quản lý package trên Ubuntu

Ubuntu không chỉ có một mà đến bốn công cụ chính. Mỗi cái có lý do tồn tại riêng:

1. dpkg — nền tảng của tất cả

dpkg là tầng thấp nhất, làm việc trực tiếp với file .deb. Nó cài đặt, gỡ bỏ, và truy vấn package đã cài. Hạn chế lớn nhất: không tự xử lý dependency. Thử cài package A mà cần B — dpkg báo lỗi rồi dừng, không tự đi tìm B về như apt làm.

2. apt-get — lớp bọc cũ, đáng tin cậy

apt-get sinh ra để giải quyết đúng cái hạn chế đó — tự động kéo dependency từ repository về. Lý do nó vẫn sống sót trong script đến tận bây giờ: output format cực kỳ ổn định, Canonical cam kết không thay đổi giữa các phiên bản. Mấy Dockerfile từ 2015 dùng apt-get vẫn build được ngày hôm nay.

3. apt — giao diện mới, thân thiện hơn

Ra mắt từ Ubuntu 16.04, apt được thiết kế để thay thế apt-get trong thao tác hàng ngày. Progress bar, màu sắc rõ hơn, và gộp luôn nhiều lệnh của apt-get + apt-cache vào một chỗ. Tiện để dùng tay, nhưng không nên dùng trong script vì output format không được cam kết ổn định.

4. snap — hướng đi khác hoàn toàn

snap là hệ thống riêng của Canonical. Mỗi package đóng gói cùng toàn bộ dependency vào một bundle độc lập, chạy trong sandbox và tự cập nhật. Nghe hay, nhưng giá phải trả là kích thước: snap chromium nặng khoảng 170MB, trong khi cài qua apt chỉ tốn ~80MB. Trên server production mình thường tránh snap vì cả hai lý do đó — nặng và khởi động chậm hơn rõ rệt.

Ưu nhược điểm từng công cụ

Công cụ Ưu điểm Nhược điểm
dpkg Cài trực tiếp file .deb local, truy vấn nhanh thông tin package Không xử lý dependency, không kéo từ repo
apt-get Output ổn định, backward-compatible, phù hợp script/CI Output khó đọc hơn khi dùng tay
apt Progress bar, gộp nhiều lệnh, tiện dùng tay Output format không được cam kết ổn định
snap Sandbox, auto-update, chạy được nhiều distro Package nặng gấp 2x, khởi động chậm hơn

Lúc mới dùng mình cứ tưởng tutorial dùng apt-get có nghĩa là apt sai. Không phải — cả hai đều đúng, chỉ khác ngữ cảnh nên dùng.

Chọn công cụ phù hợp với từng tình huống

Nguyên tắc mình đang theo, đơn giản thôi:

  • Dùng hàng ngày trên terminal → apt: Tiện, đẹp, đủ dùng.
  • Viết shell script, cron job, CI/CD → apt-get: Output ổn định, không lo Canonical thay đổi format.
  • Cài file .deb tải về thủ công → dpkg -i: Sau đó chạy apt-get install -f để fix dependency nếu cần.
  • Cài app GUI, cần version mới nhất hoặc sandbox → snap: Nhưng trên server thì tránh.

Các lệnh apt thực tế thường dùng nhất

Cập nhật danh sách package

Trước khi cài bất cứ thứ gì, luôn chạy lệnh này trước:

sudo apt update

Lưu ý: apt update chỉ đồng bộ danh sách, không nâng cấp package nào cả. Muốn nâng cấp thì dùng:

# Nâng cấp tất cả package đang cài
sudo apt upgrade

# Nâng cấp và tự xử lý cả thêm/bỏ dependency nếu cần
sudo apt full-upgrade

Cài và gỡ package

# Cài một package
sudo apt install nginx

# Cài nhiều package cùng lúc
sudo apt install git curl wget build-essential

# Gỡ package nhưng giữ lại config
sudo apt remove nginx

# Gỡ package VÀ xóa luôn config — dùng khi muốn reset sạch
sudo apt purge nginx

# Xóa nốt các dependency không còn dùng nữa
sudo apt autoremove

Mình hay dùng purge thay remove khi gỡ service như nginx hay mysql. Lý do: nếu sau này cài lại, không muốn bị ảnh hưởng bởi config cũ còn sót.

Tìm kiếm và xem thông tin package

# Tìm package theo tên hoặc mô tả
apt search "web server"

# Xem thông tin chi tiết của một package
apt show nginx

# Xem package nào cung cấp một file/lệnh cụ thể
dpkg -S /usr/bin/curl

# Liệt kê tất cả package đã cài
dpkg -l

# Kiểm tra package cụ thể đã cài chưa, version bao nhiêu
dpkg -l | grep nginx

Cài file .deb local

Hay gặp nhất khi tải file .deb từ trang chủ — Google Chrome, VS Code, Slack…:

# Cài file .deb
sudo dpkg -i google-chrome-stable_current_amd64.deb

# Nếu bị lỗi dependency, apt tự fix bằng lệnh này
sudo apt-get install -f

Quản lý repository

# Xem danh sách repository đang dùng
cat /etc/apt/sources.list
ls /etc/apt/sources.list.d/

# Thêm PPA (Personal Package Archive)
sudo add-apt-repository ppa:ondrej/php
sudo apt update

# Xóa PPA
sudo add-apt-repository --remove ppa:ondrej/php

Một số lệnh hay dùng khác

# Xem lịch sử cài/gỡ package
cat /var/log/apt/history.log

# Giữ nguyên version, không cho tự động nâng cấp
sudo apt-mark hold nginx

# Bỏ hold
sudo apt-mark unhold nginx

# Xem package nào đang bị hold
apt-mark showhold

# Dọn cache apt — thường giải phóng được vài trăm MB
sudo apt clean

Một vài lưu ý thực tế từ kinh nghiệm dùng

Sau thời gian dùng Ubuntu cho cả server lẫn máy dev, có mấy điều mình ước biết sớm hơn:

  • Luôn chạy apt update trước apt install — bỏ bước này hay gặp cài được package cũ hoặc “package not found” dù package đó có thật trên repo.
  • Thấy thông báo “The following packages were automatically installed and are no longer required”? Chạy sudo apt autoremove cho gọn, không có gì phải lo.
  • Trong script automation, thêm -yDEBIAN_FRONTEND=noninteractive để tắt mọi prompt tương tác:
DEBIAN_FRONTEND=noninteractive sudo apt-get install -y nginx
  • Muốn biết package nào đang chiếm nhiều dung lượng nhất:
dpkg-query -Wf '${Installed-Size}\t${Package}\n' | sort -n | tail -20

Nếu bạn đến từ CentOS/RHEL thì chuyển sang Ubuntu không khó. Nhớ một quy tắc là đủ: yum/dnfapt, còn rpmdpkg. Logic giống nhau, tên lệnh khác.

Share: