APT (Advanced Package Tool) cài đặt và cập nhật phần mềm từ các kho gói. Trên Debian 13 (Trixie), nguồn phần mềm được định nghĩa theo hai định dạng: tệp .list kiểu một dòng truyền thống và tệp .sources theo chuẩn deb822 mới hơn. Bản cài Trixie mới dùng định dạng deb822 làm mặc định.

Lưu ý rằng một kho được cấu hình chưa chắc đã được bật, và một kho được bật chưa chắc đã hoạt động. Bài viết hướng dẫn cách liệt kê các kho đang bật trên hệ thống Debian, tìm tệp nguồn định nghĩa chúng, và xử lý một gói không có kho đứng sau.

Hầu hết các bước cũng áp dụng cho Ubuntu, Linux Mint và các bản dẫn xuất Debian khác, dù tên tệp mặc định có thể khác. Bài viết chỉ đề cập kho APT, không gồm Flatpak remote, Snap channel hay registry container.

Cách nhanh nhất để xem kho đang bật

Để xem các kho APT đang bật trên Debian 13, 12 và các phiên bản cũ hơn, chạy:

apt-get indextargets --format '$(REPO_URI) $(RELEASE) $(COMPONENT)' 'Created-By: Packages' | sort -u

Không cần quyền root. Lệnh in ra một dòng cho mỗi kho, suite và component đang bật.

Đầu ra mẫu trên Debian 13 Desktop:

https://deb.debian.org/debian/ trixie contrib
https://deb.debian.org/debian/ trixie main
https://deb.debian.org/debian/ trixie non-free
https://deb.debian.org/debian/ trixie non-free-firmware
https://deb.debian.org/debian/ trixie-updates main
https://dl.google.com/linux/chrome-stable/deb/ stable main
https://download.docker.com/linux/debian/ trixie stable
https://packages.microsoft.com/repos/edge-beta/ stable main
https://repo.protonvpn.com/debian/ stable main
https://security.debian.org/debian-security/ trixie-security main
https://security.debian.org/debian-security/ trixie-security non-free-firmware

Lệnh đọc cấu hình đã được APT phân tích, nên dùng được với cả .list và .sources. Hai lệnh cần quyền root là sudo apt update và sudo apt modernize-sources; các lệnh còn lại chạy với quyền người dùng thường.

Liệt kê kho đang bật bằng APT

Đọc tệp chỉ cho biết điều được ghi lại. APT còn cho biết nó đã nạp gì, và xử lý cả hai định dạng tệp như nhau.

Dùng apt-get indextargets

apt-get indextargets là cách trực tiếp nhất để liệt kê kho đang bật trên Debian và các bản dẫn xuất như Ubuntu.

apt-get indextargets --format '$(REPO_URI) $(RELEASE) $(COMPONENT)' 'Created-By: Packages' | sort -u

Trong đó:

  • Created-By: Packages giới hạn đầu ra chỉ còn các chỉ mục gói nhị phân (deb). Nếu không lọc, đầu ra còn có các mục Contents và Translations.
  • sort -u loại bỏ bản trùng lặp khi một kho phục vụ nhiều kiến trúc.
  • Để liệt kê kho gói mã nguồn (deb-src) thay vào đó, đổi bộ lọc thành 'Created-By: Sources'.

Dùng apt policy

Chạy:

apt policy

Không kèm tên gói, lệnh in ra các nguồn gói APT hiện đang dùng cùng độ ưu tiên. Đây là dạng hiện đại của apt-cache policy, và cả hai đều dùng được. Một mục trông như sau:

Package files:
100 /var/lib/dpkg/status
release a=now
.
.
.
500 https://security.debian.org/debian-security trixie-security/non-free-firmware amd64 Packages
release v=13,o=Debian,a=stable-security,n=trixie-security,l=Debian-Security,c=non-free-firmware,b=amd64
origin security.debian.org
500 https://security.debian.org/debian-security trixie-security/main amd64 Packages
release v=13,o=Debian,a=stable-security,n=trixie-security,l=Debian-Security,c=main,b=amd64
origin security.debian.org
500 https://deb.debian.org/debian trixie-updates/main amd64 Packages
release v=13-updates,o=Debian,a=stable-updates,n=trixie-updates,l=Debian,c=main,b=amd64
origin deb.debian.org
500 https://deb.debian.org/debian trixie/non-free-firmware amd64 Packages
release v=13.7,o=Debian,a=stable,n=trixie,l=Debian,c=non-free-firmware,b=amd64
origin deb.debian.org
500 https://deb.debian.org/debian trixie/non-free amd64 Packages
release v=13.7,o=Debian,a=stable,n=trixie,l=Debian,c=non-free,b=amd64
origin deb.debian.org
500 https://deb.debian.org/debian trixie/contrib amd64 Packages
release v=13.7,o=Debian,a=stable,n=trixie,l=Debian,c=contrib,b=amd64
origin deb.debian.org
500 https://deb.debian.org/debian trixie/main amd64 Packages
release v=13.7,o=Debian,a=stable,n=trixie,l=Debian,c=main,b=amd64
origin deb.debian.org
Pinned packages:

Một lưu ý: apt policy phản ánh các chỉ mục gói mà APT đã tải về. Nếu bạn vừa bật hoặc tắt một nguồn, hãy chạy sudo apt update trước, nếu không đầu ra có thể không khớp với cấu hình. apt-get indextargets đọc trực tiếp cấu hình nên không gặp giới hạn này.

Lưu ý: Cả hai lệnh chỉ cho thấy một nguồn đang được bật. Chúng không cho biết server có truy cập được hay chữ ký có hợp lệ hay không. Mục kiểm tra bên dưới đề cập điều đó.

Tìm tệp cấu hình nguồn của APT

APT đọc danh sách kho từ các vị trí sau:

  • /etc/apt/sources.list
  • /etc/apt/sources.list.d/*.list
  • /etc/apt/sources.list.d/*.sources

Các tệp trong sources.list.d có phần mở rộng khác đều bị bỏ qua. APT cũng bỏ qua tên tệp chứa ký tự ngoài chữ cái, chữ số, gạch dưới, gạch nối và dấu chấm.

Mặc định trên Debian 13

Một bản cài Trixie mới giữ các kho Debian chính trong /etc/apt/sources.list.d/debian.sources. Tệp /etc/apt/sources.list thường chỉ chứa chú thích hoặc không tồn tại.

Nếu bạn nâng cấp từ bản phát hành trước, bạn có thể vẫn còn tệp /etc/apt/sources.list truyền thống. Cả hai định dạng hoạt động song song.

Để chuyển các tệp .list cũ sang định dạng deb822, chạy lệnh sau. Lệnh sẽ liệt kê các tệp định chuyển, hỏi xác nhận trước khi thay đổi, ghi tệp .sources mới và sao lưu bản gốc, ví dụ thành /etc/apt/sources.list.bak.

sudo apt modernize-sources

Hiển thị các dòng không phải chú thích

grep -HvE '^[[:space:]]*(#|$)' \
/etc/apt/sources.list \
/etc/apt/sources.list.d/*.list \
/etc/apt/sources.list.d/*.sources 2>/dev/null

Lệnh in ra mọi dòng không trống và không phải chú thích, kèm tên tệp đứng trước. Nó cho thấy điều được cấu hình, nhưng không thể cho biết điều gì đang được bật trong tệp deb822, vì một stanza bị tắt vẫn chứa các dòng không phải chú thích. Hãy dùng các quy tắc bên dưới, hoặc các lệnh APT ở mục trước.

Phân biệt mục đang bật và đang tắt

Tệp .list truyền thống

Một mục hoạt động bắt đầu bằng deb hoặc deb-src. Dòng bắt đầu bằng # là bị tắt. Ví dụ:

deb https://deb.debian.org/debian trixie main
# deb https://example.com/debian stable main

Mục đầu tiên đang bật; mục thứ hai thì không. Các mục có thể kèm tùy chọn trong ngoặc vuông, chẳng hạn kiến trúc và khóa ký:

deb [arch=amd64 signed-by=/usr/share/keyrings/example.gpg] https://example.com/debian stable main

Để chỉ liệt kê các dòng đang hoạt động trong tệp .list, chạy:

grep -hE '^[[:space:]]*deb(-src)?[[:space:]]' \
/etc/apt/sources.list /etc/apt/sources.list.d/*.list 2>/dev/null

Lệnh này không phân tích tệp .sources, và không kiểm tra kho có hoạt động hay không.

Tệp deb822 .sources

Tệp deb822 dùng các trường có tên, và dòng trống ngăn cách các stanza. Một stanza điển hình như sau:

Types: deb deb-src
URIs: https://deb.debian.org/debian
Suites: trixie trixie-updates
Components: main
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg

Hãy nhớ các quy tắc sau:

  • Một stanza được bật theo mặc định. Nó chỉ bị tắt nếu chứa trường Enabled với giá trị sai, ví dụ Enabled: no. Tên trường và giá trị không phân biệt hoa/thường (case-insensitive), nên enabled: No cũng tắt một stanza.
  • Types có thể liệt kê cả deb và deb-src. Kho mã nguồn được bật nếu deb-src xuất hiện ở đó.
  • URIs, Suites và Components có thể chứa nhiều giá trị phân cách bằng dấu cách, nên một stanza có thể định nghĩa nhiều kho.
  • Signed-By có thể là đường dẫn tới tệp keyring hoặc một khối khóa inline.
  • Một tệp có thể chứa nhiều stanza, và mỗi stanza bật/tắt độc lập.

Để chỉ in các stanza đang bật từ tệp .sources, chạy:

for f in /etc/apt/sources.list.d/*.sources; do
[ -f "$f" ] || continue
printf '### %s\n' "$f"
awk -v RS= '
tolower($0) ~ /(^|\n)types:/ &&
tolower($0) !~ /(^|\n)enabled:[ \t]*(no|false|0)[ \t]*(\n|$)/ {
print $0 "\n"
}' "$f"
done

Bộ lọc in ra mỗi stanza có trường Types và không có giá trị Enabled sai. Nó chỉ tiện để đọc, còn các lệnh APT ở mục trước vẫn là câu trả lời đáng tin cậy hơn.

Để tìm các stanza bị tắt rõ ràng, chạy:

grep -n -i 'Enabled:' /etc/apt/sources.list.d/*.sources

Hãy xem stanza xung quanh để biết kết quả nào thuộc kho nào.

Kiểm tra kho có hoạt động không

Chạy lệnh sau với quyền root để làm mới chỉ mục gói:

sudo apt update

APT sẽ thử làm mới chỉ mục gói từ mọi nguồn đang bật. Hãy xem xét đầu ra để tìm các lỗi như:

  • 404 Not Found: đường dẫn hoặc suite của kho có thể sai hoặc không còn tồn tại.
  • NO_PUBKEY: APT không tìm thấy khóa công khai cần thiết để xác minh kho.
  • The repository is not signed: APT không thể xác minh siêu dữ liệu của kho theo yêu cầu.
  • Lỗi kết nối hoặc DNS: APT không truy cập được server của kho.

Hãy đọc cả cảnh báo và thông báo, không chỉ lỗi. Chúng thường bộc lộ vấn đề cấu hình:

  • Target Packages ... is configured multiple times: cùng một kho được định nghĩa trong nhiều tệp. Hãy xóa bản trùng.
  • Skipping acquire of configured file ... doesn't support architecture: kho không cung cấp gói cho một trong các kiến trúc bạn đã cấu hình.
  • Ignoring file ... invalid filename extension: APT đã bỏ qua một tệp trong sources.list.d vì tên của nó.

Một lần cập nhật sạch nghĩa là APT đã làm mới được các chỉ mục mà nó xử lý. Điều đó không đảm bảo một gói cụ thể có sẵn.

Đừng bao giờ sửa lỗi chữ ký bằng cách tắt xác thực. Hãy kiểm tra URL của kho và làm theo hướng dẫn chính thức của chủ kho để cài khóa ký của họ.

Xử lý gói không còn kho đứng sau

Dùng apt-cache policy để xem APT có thể cài phiên bản nào của một gói và chúng đến từ đâu:

apt-cache policy firefox-esr

Nếu nguồn duy nhất được liệt kê là đoạn sau, APT đang hiển thị cơ sở dữ liệu gói local chứ không phải một kho:

100 /var/lib/dpkg/status

Điều này không tự động có nghĩa là một kho bị mất hoặc hỏng. Nó nghĩa là APT không có phiên bản nào của gói đó từ kho trong chỉ mục hiện tại.

Các nguyên nhân phổ biến:

  • Gói được cài từ tệp .deb độc lập, và chưa từng có kho nào được thêm.
  • Gói đã tự thêm tệp nguồn khi cài, nhưng tệp đó sau đó bị xóa, tắt hoặc đổi tên.
  • Một mục nguồn tồn tại nhưng bị chú thích, có Enabled: no, hoặc trỏ tới suite không còn tồn tại.
  • Lần apt update cuối thất bại với kho đó, nên chỉ mục của nó chưa từng được tải.
  • Gói đến từ kho đã bị gỡ hoặc tắt, ví dụ trong quá trình nâng cấp bản phát hành.

Để tìm mọi gói đã cài mà hiện không kho nào cung cấp, chạy:

apt list --installed 2>/dev/null | grep '\[installed,local\]'

Các gói được gắn nhãn local không có phiên bản từ kho nào trong chỉ mục hiện tại của APT.

Ví dụ: Microsoft Edge Beta

Giả sử Microsoft Edge Beta đã được cài, nhưng apt-cache policy chỉ hiện phiên bản local:

microsoft-edge-beta:
Installed: 145.0.3800.13-1
Candidate: 145.0.3800.13-1
Version table:
*** 145.0.3800.13-1 100
100 /var/lib/dpkg/status

Các gói từ nhà cung cấp như Edge và Chrome thường được cài từ tệp .deb tải về. Nhiều gói tự thêm nguồn APT khi cài, dù hành vi khác nhau tùy nhà cung cấp và phiên bản. Nếu tệp nguồn đó bị mất hoặc bị tắt, bạn sẽ nhận được đúng kết quả như trên.

Bước 1: Tìm mục nguồn hiện có.

grep -RniE 'microsoft|edge' \
/etc/apt/sources.list /etc/apt/sources.list.d/ 2>/dev/null

Hãy xem xét kỹ kết quả. Tên tệp chứa edge không chứng minh nó chứa một kho Edge đang hoạt động. Ví dụ, một tệp có thể chỉ chứa dòng bị chú thích sau:

#deb [arch=amd64] https://dl.google.com/linux/chrome/deb/ stable main

Mục đó bị tắt, và nó trỏ tới Google Chrome chứ không phải Microsoft Edge.

Bước 2: Xác minh kho và khóa ký.

Nếu không có mục Edge Beta nào đang hoạt động, hãy tham khảo hướng dẫn cài đặt Linux chính thức hiện hành của Microsoft trước khi thêm một mục. Xác minh đúng URL kho, suite, kiến trúc và cách cài khóa ký.

Nếu một mục hiện có trỏ tới tệp keyring bị thiếu, hãy sửa đường dẫn hoặc cài khóa theo đúng hướng dẫn đó. Đừng đoán tên tệp khóa hay bỏ qua bước xác minh chữ ký.

Bước 3: Làm mới APT và kiểm tra lại.

sudo apt update
apt-cache policy microsoft-edge-beta

Xem đầu ra cập nhật để tìm lỗi kho và chữ ký, rồi kiểm tra xem phiên bản từ kho có được liệt kê không. Nếu chỉ hiện /var/lib/dpkg/status, APT vẫn chưa có kho cho gói đó.

Một ứng dụng đã cài không chứng minh kho của nó đang bật hay hoạt động. Hãy xác minh mục nguồn, làm mới chỉ mục, và kiểm tra đầu ra policy.

Kết luận

Để liệt kê kho đang bật trên Debian 13, hãy bắt đầu với apt-get indextargets hoặc apt policy. Cả hai báo cáo điều APT thực sự nạp từ tệp .list và .sources, đáng tin cậy hơn việc tự đọc tệp. Dùng /etc/apt/sources.list và các tệp trong /etc/apt/sources.list.d/ để tìm nơi mỗi nguồn gói được định nghĩa, và áp dụng đúng quy tắc bật/tắt cho từng định dạng.

Sau đó chạy sudo apt update và đọc cả lỗi lẫn cảnh báo. Nếu một gói cụ thể không có phiên bản từ kho nào, hãy kiểm tra tệp nguồn của nó, khóa ký, và xem nó có được cài từ tệp .deb độc lập không. Nếu bạn vẫn còn tệp .list cũ, cân nhắc chạy sudo apt modernize-sources để danh sách kho APT dùng một định dạng thống nhất.