apt hay apt-get
Gõ tay trong terminal thì dùng apt, viết script thì dùng apt-get và apt-cache.
Trang hướng dẫn apt(8) nói rất rõ: apt được thiết kế cho người dùng terminal, hành vi có thể thay đổi giữa các phiên bản; dù cố gắng không phá vỡ tương thích, nếu một thay đổi nào đó có lợi cho việc dùng tương tác thì cũng không đảm bảo tương thích. apt-get và apt-cache có những gì apt đều có, apt chỉ đổi giá trị mặc định của một số tùy chọn, còn các lệnh cũ chú trọng tương thích ngược hơn, nên trong script nên dùng chúng.
Khi apt xuất ra đường ống, nó cũng tự nhắc:
WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
Thấy dòng này, trước tiên hãy kiểm tra xem bạn có đang gọi apt trong script hay không.
Cập nhật và nâng cấp
sudo apt update
sudo apt upgrade
update chỉ tải chỉ mục gói từ các kho phần mềm, không cài cũng không gỡ phần mềm nào. upgrade mới thực sự nâng cấp các gói đã cài; trang hướng dẫn đưa ra hai hạn định đối với nó: để thỏa mãn phụ thuộc, nó có thể cài gói mới; nhưng gói đã cài sẽ không bao giờ bị nó gỡ bỏ. Nếu việc nâng cấp một gói đòi hỏi gỡ một gói đã cài khác thì gói đó sẽ không được nâng cấp.
full-upgrade làm mọi thứ mà upgrade làm được, ngoài ra còn gỡ các gói đã cài khi việc nâng cấp tổng thể cần đến. Vì vậy sự khác biệt giữa hai lệnh chỉ có một điểm: full-upgrade có thể gỡ gói, còn upgrade thì không.
Trước khi nâng cấp, hãy xem những gói nào đang chờ:
apt list --upgradable
Khi không có gói nào chờ nâng cấp, nó chỉ xuất ra Listing....
Mô phỏng trước khi cài đặt
Thêm -s (simulate) để không thay đổi hệ thống, chỉ xem apt định làm gì:
apt install -s htop
Cuối phần xuất ra có một dòng tổng kết, ví dụ Upgrading: 0, Installing: 1, Removing: 0, Not Upgrading: 0, phía trước là các dòng bắt đầu bằng Inst, Remv liệt kê hành động cụ thể. Với các thao tác liên quan đến gỡ bỏ hoặc nâng cấp số lượng lớn, hãy mô phỏng trước một lượt, chú ý xem số Removing có đúng như bạn dự đoán hay không.
Trang hướng dẫn còn giới thiệu vài cách viết:
- Tên gói có thể là tên chính xác, cũng có thể là regex hoặc glob; một ký tự đại diện viết vội có thể khớp rất nhiều gói, mô phỏng giúp bạn phát hiện sớm.
tên_gói=số_hiệu_phiên_bảnchỉ định phiên bản,tên_gói/mã_phát_hànhlấy phiên bản từ một bản phát hành nào đó.- Thêm
+sau tên gói nghĩa là cài, thêm-nghĩa là gỡ. Tôi đã thửapt install -s cron htop-trong container: phần tổng kết xuất hiệnRemoving: 1, chính là htop.
Truy vấn
apt show htop
apt policy htop
apt search từ-khóa
dpkg -S /usr/bin/htop
apt show đưa ra các trường như phiên bản, mức ưu tiên, nhóm, nguồn, người duy trì và dung lượng cài; trang hướng dẫn nhắc có thể xem các thông tin này trước khi gỡ một gói. apt policy hiển thị phiên bản đã cài, Candidate (phiên bản ứng viên) và mức ưu tiên của nguồn; khi nghi ngờ phiên bản cài vào không đúng, dùng nó để xem phiên bản đến từ nguồn nào. apt search tìm kiếm danh sách gói theo regex; muốn tra ngược gói theo tệp, trang hướng dẫn khuyên dùng apt-file. dpkg -S trả lời câu hỏi "tệp này thuộc gói nào"; kiểm chứng thực tế dpkg -S /usr/bin/htop xuất ra htop: /usr/bin/htop.
apt list có ba tùy chọn thường dùng: --installed, --upgradeable (dùng --upgradable cũng được) và --all-versions.
remove, purge và autoremove
remove gỡ phần tệp chương trình của gói, nhưng giữ lại các tệp cấu hình bạn đã sửa, nhờ vậy cài lại sau khi gỡ nhầm có thể khôi phục như cũ. purge dọn sạch cả phần sót lại này, và cũng có thể thực hiện với gói đã từng remove. Trang hướng dẫn nói rõ: nó không đụng đến dữ liệu và cấu hình trong thư mục home của bạn.
Tôi đã kiểm chứng với cron trong container:
sudo apt remove cron
dpkg -l cron
Cột trạng thái là rc (đã gỡ, tệp cấu hình còn lại); chạy tiếp sudo apt purge cron, trạng thái chuyển thành un (chưa cài, không còn sót).
autoremove gỡ các gói "được cài tự động để thỏa mãn phụ thuộc, giờ không còn ai cần". Gói do bạn chủ động cài sẽ không bị nó đề nghị gỡ, nhưng trang hướng dẫn nhắc nên xem qua danh sách để tránh gỡ nhầm phần mềm vẫn hay dùng. Nếu muốn giữ lại một gói được cài tự động, dùng apt-mark manual tên_gói để đánh dấu là cài thủ công. Trước khi chạy hãy mô phỏng:
apt autoremove -s
Khóa phiên bản
sudo apt-mark hold htop
apt-mark showhold
sudo apt-mark unhold htop
Tương ứng là khóa, xem các gói đã khóa và bỏ khóa; phần xuất ra lần lượt là htop set on hold., htop, Canceled hold on htop..
Lịch sử giao dịch và hoàn tác
APT 3.x bổ sung một nhóm lệnh quản lý theo giao dịch, nhiều hướng dẫn cũ chưa nhắc đến. Tôi đã kiểm chứng các cách dùng dưới đây trong container Ubuntu 26.04.1 LTS (apt 3.2.0); trên máy của bạn, hãy dùng apt --help xem trước có các lệnh này không.
apt history-list
apt history-info 88
sudo apt -y history-undo 88
sudo apt -y history-redo 88
history-list liệt kê các giao dịch trong lịch sử, mỗi dòng có ID, dòng lệnh, thời gian, hành động và số thay đổi; dòng lệnh bị cắt ngắn, muốn xem đầy đủ hãy dùng history-info. Ở đây của tôi, ID 88 là một lần apt-get install -y -qq htop, history-info 88 hiển thị Install htop:arm64 (3.4.1-5build2). Thực hiện history-undo với nó, apt đã gỡ htop, dpkg -l htop không tìm thấy gói; chạy history-redo thì cài lại như ban đầu, trạng thái là ii. history-undo, history-redo, history-rollback đều cần ID, nếu thiếu sẽ báo Error: Incorrect usage, no ID was given.
Hoàn tác có ranh giới của nó. Tôi thực hiện history-undo với một giao dịch "cài lại bash", apt liệt kê sẽ gỡ bash, cảnh báo This should NOT be done unless you know exactly what you are doing!, và cuối cùng từ chối thực hiện:
Error: Essential packages were removed and -y was used without --allow-remove-essential.
Giao dịch liên quan đến gói thiết yếu của hệ thống sẽ không bị hoàn tác chỉ vì đã thêm -y. Công tắc được nhắc đến trong thông báo lỗi sẽ gỡ bỏ lớp bảo vệ này, không nên thêm nó chỉ để cho lệnh chạy được.
history-rollback được mô tả là "rollback transactions", tôi chưa chạy thực tế nên không trình bày sâu. Dù phiên bản apt mới hay cũ, /var/log/apt/history.log đều ghi lại thời gian, dòng lệnh và biến thiên phiên bản gói của mỗi thao tác; để đọc nó có thể cần sudo.
why và why-not
Trang hướng dẫn định nghĩa hai lệnh này như sau: apt why tên_gói giải thích vì sao một gói đã cài lại được cài vào. Gói cài tự động sẽ nhận được lý giải hợp lý, gói cài thủ công sẽ không được đưa ra lý do nào khác; gói chưa cài thì không tra được lý do. apt why-not tên_gói giải thích vì sao một gói bị đánh giá là không thể cài, không phải lúc nào cũng có kết quả. Cả hai lệnh chỉ nhận một tên gói.
Trong container tối giản của tôi, phần xuất ra của chúng rất đơn giản, chẳng hạn apt why htop là htop:arm64 is selected for install, với một gói chưa cài thì là is undecided. Trên máy có quan hệ phụ thuộc phức tạp, phần xuất ra sẽ nhiều thông tin hơn, lúc đó why giúp bạn đánh giá một gói có thể autoremove an toàn hay không.
Kho phần mềm
Kho phần mềm của Ubuntu 26.04.1 là /etc/apt/sources.list.d/ubuntu.sources, định dạng deb822, tệp có nhiều chú thích bắt đầu bằng ## giải thích các trường.
sudo apt edit-sources
Dùng trình soạn thảo bạn ưa thích để chỉnh sửa tệp kho phần mềm, kèm kiểm tra cơ bản. Trang hướng dẫn đánh dấu nó là work-in-progress, tức chưa hoàn thiện. Danh sách lệnh còn có apt modernize-sources, chuyển các tệp .list kiểu cũ sang tệp .sources; tôi chưa chạy nó thực tế, hãy đọc man apt trước khi dùng.
Vài trường hợp thường gặp
- Sau nâng cấp một số gói không thay đổi: việc nâng cấp của chúng đòi hỏi gỡ gói đã cài khác,
upgradekhông làm loại nâng cấp đó. Xemapt list --upgradabletrước, xác nhận rồi mới dùngfull-upgrade. - Sau remove mà
dpkg -lvẫn còn gói đó: trạng tháircnghĩa là còn sót tệp cấu hình,purgesẽ dọn sạch. - Muốn hoàn tác bản vừa cài: có lệnh
historythì dùnghistory-undo, không thì theo tên gói ghi tronghistory.logmàremovethủ công.



