Bảng tra cứu

Lệnh apt: cài đặt, cập nhật và gỡ gói trên Ubuntu và Debian

Cập nhật: · Skillaria.Top

apt là trình quản lý gói của Ubuntu và Debian: sudo apt update làm mới danh sách gói, sudo apt upgrade cài các bản cập nhật, sudo apt install tên-gói cài một gói, sudo apt remove gỡ gói (purge xóa cả cấu hình), còn apt autoremove dọn các phụ thuộc không còn cần. Tìm gói bằng apt search và apt show, còn sudo apt --fix-broken install sửa các phụ thuộc bị hỏng.

apt là trình quản lý gói tiêu chuẩn của Ubuntu, Debian và các bản phân phối dẫn xuất (Linux Mint, Pop!_OS). Nó tải chương trình từ các kho phần mềm, tự kéo theo các phụ thuộc và cập nhật hệ thống chỉ bằng một lệnh. Dưới đây là các lệnh apt cần dùng hằng ngày, nhóm theo việc cần làm, cùng những lỗi thường gặp và cách khắc phục.

apt hoạt động như thế nào

Gói là một file .deb chứa chương trình, siêu dữ liệu và danh sách phụ thuộc. Kho phần mềm (repository) là các máy chủ lưu gói; địa chỉ của chúng được khai báo trong /etc/apt/sources.list và thư mục /etc/apt/sources.list.d/. apt giữ một bản sao cục bộ danh sách gói có sẵn và đối chiếu với bản này khi cài đặt, vì vậy cần cập nhật nó thường xuyên.

Bên dưới, apt gọi dpkg — công cụ giải nén và đăng ký gói, nhưng không tự giải quyết phụ thuộc. Các lệnh apt-get và apt-cache là giao diện cũ với cùng chức năng: đầu ra ổn định, phù hợp cho script. apt là lớp bao mới hơn dành cho người dùng: có thanh tiến trình, có màu và lệnh ngắn hơn.

Hầu hết các lệnh làm thay đổi hệ thống đều cần quyền quản trị, nên chạy qua sudo. Tìm kiếm và xem thông tin thì chạy được không cần quyền.

Bảng tra cứu: các lệnh apt cơ bản

LệnhChức năng
sudo apt updatelàm mới danh sách gói từ các kho
sudo apt upgradecài các bản cập nhật, không gỡ gói nào
sudo apt full-upgradenâng cấp, khi cần thì gỡ hoặc thay thế gói
sudo apt install tên-góicài gói cùng các phụ thuộc
sudo apt reinstall tên-góicài lại gói
sudo apt remove tên-góigỡ gói, giữ lại cấu hình
sudo apt purge tên-góigỡ gói cùng cấu hình hệ thống
sudo apt autoremovegỡ các phụ thuộc không còn cần
apt search từ-khóatìm gói theo tên và mô tả
apt show tên-góimô tả, phiên bản, phụ thuộc, dung lượng
apt list --installeddanh sách gói đã cài
apt list --upgradablenhững gì có thể cập nhật
apt policy tên-góiphiên bản đã cài, các phiên bản có sẵn và nguồn
sudo apt cleanxóa bộ nhớ đệm các file .deb đã tải
sudo apt --fix-broken installsửa các phụ thuộc bị hỏng

apt update và apt upgrade: cách cập nhật hệ thống

Đây là hai thao tác khác nhau, và thường bị nhầm lẫn. apt update không cài gì cả: nó chỉ tải về danh sách gói mới. apt upgrade mới thực sự cài phiên bản mới cho các chương trình đã có, dựa trên danh sách đó.

$ sudo apt update
Hit:1 http://archive.ubuntu.com/ubuntu noble InRelease
Get:2 http://security.ubuntu.com/ubuntu noble-security InRelease [126 kB]
...
12 packages can be upgraded. Run 'apt list --upgradable' to see them.

$ apt list --upgradable
$ sudo apt upgrade

Cách kết hợp thường dùng cho máy chủ, trong một dòng, tự động xác nhận:

sudo apt update && sudo apt upgrade -y

upgrade khác full-upgrade thế nào

apt upgrade có thể cài thêm phụ thuộc mới, nhưng không bao giờ gỡ gói đã cài. Nếu bản cập nhật đòi gỡ một thứ gì đó (ví dụ khi đổi phiên bản nhân hoặc thư viện), các gói đó sẽ bị "giữ lại" — trong đầu ra xuất hiện dòng The following packages have been kept back. apt full-upgrade (tương đương apt-get dist-upgrade) cho phép gỡ và hoàn tất việc nâng cấp. Trước khi chạy, hãy đọc kỹ danh sách những gì apt định gỡ.

Chỉ nâng cấp một gói

sudo apt install --only-upgrade nginx

Nếu gói chưa được cài, lệnh với --only-upgrade sẽ không cài nó — điều này giúp tránh cài nhầm ngoài ý muốn.

apt install: cài đặt gói

sudo apt install nginx                 # một gói
sudo apt install git curl htop         # nhiều gói cùng lúc
sudo apt install -y docker.io          # không hỏi Y/n
sudo apt install nginx=1.24.0-2ubuntu7 # một phiên bản cụ thể
sudo apt install --no-install-recommends ffmpeg  # không cài gói khuyến nghị
sudo apt install ./google-chrome-stable_current_amd64.deb  # file .deb cục bộ

Khi cài, apt hiển thị các gói sẽ được thêm và dung lượng chiếm dụng, rồi hỏi xác nhận. Tùy chọn -y tự động xác nhận "có" — tiện trong script và Dockerfile, nhưng khi làm việc tương tác nên đọc danh sách trước.

Mặc định apt cài không chỉ các phụ thuộc bắt buộc (Depends) mà còn cả các gói khuyến nghị (Recommends). Trên máy chủ và trong container, --no-install-recommends giúp giảm đáng kể dung lượng.

Cài file .deb: apt hay dpkg -i

File .deb đã tải về nên cài bằng apt install ./file.deb — đường dẫn bắt buộc phải có ./ hoặc là đường dẫn đầy đủ, nếu không apt sẽ tìm gói có tên đó trong kho. Khác với dpkg -i, apt tự tải các phụ thuộc còn thiếu. Nếu bạn đã cài gói bằng dpkg và gặp lỗi phụ thuộc, sudo apt --fix-broken install sẽ sửa lỗi đó.

sudo dpkg -i package.deb
sudo apt --fix-broken install

apt remove, purge và autoremove: gỡ gói

LệnhChương trìnhCấu hình trong /etcPhụ thuộc
apt removebị gỡgiữ lạigiữ lại
apt purgebị gỡbị xóagiữ lại
apt autoremove——xóa những phụ thuộc không cần
sudo apt remove nginx
sudo apt purge nginx            # như trên + xóa cấu hình
sudo apt autoremove             # phần thừa của các phụ thuộc
sudo apt autoremove --purge     # phần thừa cùng với cấu hình của chúng

remove phù hợp khi bạn định dùng lại chương trình và muốn giữ các thiết lập. purge dùng khi cần cài lại từ đầu. Lưu ý: không lệnh nào trong số này xóa file trong thư mục home của người dùng (ví dụ ~/.config).

Tìm các gói đã bị gỡ nhưng còn cấu hình, có trạng thái rc:

dpkg -l | grep '^rc'

Tìm gói và xem thông tin về gói

apt search postgresql          # tìm theo tên và mô tả
apt search --names-only '^php8' # chỉ theo tên, dùng biểu thức chính quy
apt show htop                  # phiên bản, dung lượng, phụ thuộc, mô tả
apt policy docker.io           # các phiên bản có sẵn và nguồn của chúng
apt list --installed | grep python3
apt-cache depends curl         # gói này phụ thuộc vào gì
apt-cache rdepends libssl3     # gói nào phụ thuộc vào gói này

File thuộc về gói nào

$ dpkg -S /usr/bin/curl
curl: /usr/bin/curl

$ dpkg -L curl        # gói đã cài những file nào

Nếu hệ thống chưa có lệnh, khi bạn gõ nó Ubuntu sẽ tự gợi ý gói cần cài (thông báo Command 'tree' not found, but can be installed with: sudo apt install tree). Để tìm file trong các gói chưa cài, có tiện ích apt-file: apt-file search bin/dig sau khi chạy sudo apt-file update.

Khóa phiên bản: apt-mark hold

Đôi khi không được phép cập nhật một gói — ví dụ phiên bản hệ quản trị CSDL hoặc nhân trên môi trường production chỉ được đổi thủ công. Khi đó gói được "đóng băng":

sudo apt-mark hold postgresql-16
apt-mark showhold
sudo apt-mark unhold postgresql-16

Một cặp hữu ích khác là apt-mark manual và apt-mark auto. Gói được cài như phụ thuộc sẽ được đánh dấu tự động, và sẽ bị autoremove xóa khi không còn cần. Đánh dấu manual bảo vệ gói khỏi điều đó.

Kho phần mềm: cách thêm và vị trí của chúng

Danh sách nguồn nằm trong /etc/apt/sources.list và các file /etc/apt/sources.list.d/*.list. Trên Ubuntu 24.04 và Debian 12 trở lên, định dạng deb822 với đuôi .sources ngày càng phổ biến (ví dụ /etc/apt/sources.list.d/ubuntu.sources).

Kho bên thứ ba có khóa

Cách hiện đại là lưu khóa của kho riêng và gắn nó qua signed-by. Lệnh apt-key đã lỗi thời và bị gỡ bỏ ở các phiên bản mới.

sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" | sudo tee /etc/apt/sources.list.d/docker.list
sudo apt update
sudo apt install docker-ce

PPA trên Ubuntu

sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
sudo add-apt-repository --remove ppa:deadsnakes/ppa

PPA là kho cá nhân trên Launchpad. Chỉ thêm kho mà bạn tin tưởng: gói từ đó được cài với quyền root.

Bộ nhớ đệm và dung lượng đĩa

Các gói đã tải được lưu trong /var/cache/apt/archives/. Trên ổ đĩa nhỏ và trong image Docker nên dọn bộ nhớ đệm.

du -sh /var/cache/apt/archives
sudo apt clean          # xóa toàn bộ bộ nhớ đệm .deb
sudo apt autoclean      # chỉ xóa các phiên bản cũ đã lỗi thời

Trong Dockerfile, người ta thường viết việc cài đặt trong một layer và xóa danh sách gói ngay sau đó:

RUN apt-get update \
 && apt-get install -y --no-install-recommends curl ca-certificates \
 && rm -rf /var/lib/apt/lists/*

Trong script người ta dùng apt-get thay vì apt: giao diện của apt không ổn định, và nó tự cảnh báo điều này (WARNING: apt does not have a stable CLI interface). Để trình cài đặt không hỏi gì, thêm DEBIAN_FRONTEND=noninteractive.

Lỗi apt thường gặp và cách khắc phục

Could not get lock /var/lib/dpkg/lock-frontend

Một tiến trình khác đang thao tác với gói: có một terminal khác đang chạy apt, «Trung tâm ứng dụng», hoặc tiến trình cập nhật tự động unattended-upgrades. Hãy đợi vài phút và kiểm tra ai đang giữ khóa:

ps aux | grep -E 'apt|dpkg'

Đừng xóa file khóa bằng tay khi tiến trình vẫn còn sống: một lần cài bị gián đoạn có thể để hệ thống ở trạng thái không nhất quán. Nếu tiến trình thực sự bị treo hoặc đã bị giết, sau khi nó kết thúc hãy chạy sudo dpkg --configure -a.

Unable to locate package

apt không tìm thấy gói. Thường gặp nhất là bạn chưa chạy sudo apt update trên hệ thống mới, gõ sai tên, hoặc gói nằm trong thành phần đang tắt (universe trên Ubuntu). Bật thành phần bằng sudo add-apt-repository universe.

Unmet dependencies / held broken packages

Các phụ thuộc không khớp nhau — thường sau khi cài file .deb thủ công hoặc trộn lẫn kho của các phiên bản bản phân phối khác nhau.

sudo apt --fix-broken install
sudo dpkg --configure -a
apt policy gói-có-vấn-đề

dpkg was interrupted

Lần cài đặt bị ngắt (đóng terminal, mất điện). Thông báo đã gợi ý cách giải quyết: sudo dpkg --configure -a.

NO_PUBKEY khi apt update

Kho bên thứ ba thiếu hoặc khóa chữ ký đã cũ. Tải khóa mới từ trang của dự án vào /etc/apt/keyrings/ và khai báo trong signed-by, như ví dụ Docker ở trên.

Cập nhật bảo mật tự động

Trên Ubuntu Server, gói unattended-upgrades được cài sẵn và tự động cài các bản cập nhật bảo mật. Kiểm tra và bật nó như sau:

sudo apt install unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades
cat /var/log/unattended-upgrades/unattended-upgrades.log

Việc có cần khởi động lại sau cập nhật hay không được thể hiện qua file /var/run/reboot-required: nếu file tồn tại, nghĩa là nhân hoặc các thư viện quan trọng đã được cập nhật.

Tóm lại

Các lệnh apt cơ bản gói gọn trong một chu trình ngắn: update trước mọi thao tác, install để cài, upgrade để nâng cấp, remove hoặc purge để gỡ, và autoremove để dọn dẹp. Để xem phiên bản có apt policy và apt-mark hold; khi hệ thống bị hỏng có --fix-broken install và dpkg --configure -a; còn trong script hãy dùng apt-get. Quản lý gói được thực hành cụ thể trong khóa học Linux.

Câu hỏi thường gặp

apt khác apt-get ở điểm nào?

Đây là hai giao diện cho cùng một hệ thống gói. apt tiện hơn khi làm việc trong terminal (có tiến trình, màu sắc, lệnh ngắn), còn apt-get có đầu ra ổn định và được khuyến nghị cho script và Dockerfile.

Có cần chạy apt update trước mỗi lần cài không?

Nên chạy nếu danh sách đã lâu chưa được làm mới: nếu không, apt có thể không tìm thấy gói hoặc cố tải một phiên bản đã bị xóa khỏi máy chủ mirror và báo lỗi 404.

Làm sao xem lịch sử cài và gỡ gói của apt?

Lịch sử được ghi trong /var/log/apt/history.log (các bản cũ nằm trong history.log.N.gz), còn nhật ký chi tiết của dpkg nằm trong /var/log/dpkg.log.

Làm sao hạ cấp gói về phiên bản trước?

Xem các phiên bản có sẵn bằng apt policy tên-gói, cài phiên bản mong muốn bằng sudo apt install tên-gói=phiên-bản, rồi khóa nó bằng apt-mark hold để lần cập nhật sau không đưa phiên bản mới về.

Có dùng được apt trên CentOS hoặc Fedora không?

Không, các hệ này dùng định dạng gói khác (rpm) và trình quản lý riêng là dnf và yum. apt chỉ hoạt động trên Debian, Ubuntu và các bản phân phối dẫn xuất.

Học chủ đề này qua video

Chủ đề này được giảng chi tiết kèm thực hành trong khóa học “Linux: с нуля до уверенного администрирования”.

Đến khóa học