Đối với các quản trị viên hệ thống (System Administrator) và kỹ sư DevOps làm việc trên môi trường Linux, thông báo lỗi “Error: Failed to download metadata for repo ‘appstream’: Cannot prepare internal mirrorlist: No URLs in mirrorlist” chắc chắn không còn quá xa lạ. Lỗi này thường xuất hiện đột ngột khi bạn thực hiện các lệnh quen thuộc như dnf update, dnf install hay yum update trên hệ điều hành CentOS 8 hoặc các bản phân phối RHEL-based tương tự.
Sự cố này khiến cho quá trình cài đặt phần mềm mới hoặc cập nhật bản vá bảo mật cho hệ thống bị đình trệ hoàn toàn. Trong bài viết chuyên sâu này, chúng ta sẽ cùng phân tích nguyên nhân gốc rễ của vấn đề và điểm qua các giải pháp từng bước để khắc phục lỗi một cách nhanh chóng, an toàn và triệt để nhất.
1. Nguyên Nhân Gây Ra Lỗi “Failed to download metadata for repo AppStream”
Để xử lý triệt để một sự cố kỹ thuật, trước tiên chúng ta cần hiểu rõ lý do tại sao nó xuất hiện. Lỗi Failed to download metadata for repo AppStream xuất phát từ 3 nguyên nhân chính sau:
CentOS 8 Đã Đạt Trạng Thái EOL (End of Life)
Dự án CentOS chính thức tuyên bố ngưng hỗ trợ phiên bản CentOS Linux 8 vào ngày 31 tháng 12 năm 2021. Điều này có nghĩa là Red Hat đã ngừng cung cấp các bản cập nhật chính thức và đóng cửa hệ thống gương tải xuống (mirrorlist) mặc định của CentOS 8.
Các Kho Lưu Trữ (Repositories) Bị Di Chuyển Sang CentOS Vault
Khi CentOS 8 hết hạn hỗ trợ, toàn bộ gói phần mềm thuộc các kho như AppStream, BaseOS, extras đã bị gỡ bỏ khỏi địa chỉ URL mirror.centos.org và chuyển sang kho lưu trữ lưu trữ lịch sử (archive repository) tại vault.centos.org. Do tệp cấu hình mặc định trong máy chủ của bạn vẫn trỏ đến danh sách mirror cũ (hiện không còn tồn tại), lệnh dnf không thể tìm thấy URL hợp lệ để tải metadata.
Sự Cố Kết Nối Mạng Hoặc Cấu Hình DNS Bị Lỗi
Trong một số trường hợp ít gặp hơn (trên các hệ điều hành chưa EOL như Rocky Linux hay AlmaLinux), lỗi này có thể xuất hiện do máy chủ của bạn mất kết nối Internet, cấu hình DNS bị sai hoặc cổng kết nối bị chặn bởi tường lửa (Firewall/SELinux).
Tóm tắt: Nếu bạn đang sử dụng CentOS 8 (Classic), nguyên nhân 99% là do hệ thống mirrorlist cũ đã bị khai tử. Bạn buộc phải chuyển hướng repo sang kho Vault hoặc nâng cấp/chuyển đổi hệ điều hành.
2. Cách 1: Chuyển Hướng Repo Sang CentOS Vault (Giải Pháp Nhanh Nhất)
Nếu bạn cần khắc phục lỗi ngay lập tức để cài đặt phần mềm mà chưa muốn thay đổi hệ điều hành, giải pháp tối ưu nhất là thay đổi cấu hình repository để trỏ về kho lưu trữ lưu trữ vault.centos.org.
Bước 1: Truy cập vào thư mục cấu hình Yum/DNF
Mở terminal trên máy chủ CentOS 8 của bạn và chuyển đến thư mục chứa các tệp `.repo`:
cd /etc/yum.repos.d/
Bước 2: Thay đổi cấu hình mirrorlist trong các tệp Repo
Bạn cần vô hiệu hóa dòng mirrorlist và mở chú thích (uncomment) cho dòng baseurl, đồng thời đổi URL từ mirror.centos.org thành vault.centos.org. Hãy thực hiện 2 lệnh sed sau:
sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
Bước 3: Làm sạch Cache DNF và kiểm tra lại
Sau khi cập nhật xong tệp cấu hình, hãy xóa sạch bộ nhớ tạm của DNF và thử cập nhật lại hệ thống:
dnf clean all
dnf makecache
dnf update -y
Nếu các lệnh trên chạy thành công không báo lỗi, bạn đã khắc phục xong sự cố. Giờ đây hệ thống CentOS 8 của bạn có thể tải về các gói phần mềm bình thường từ kho Vault.
3. Cách 2: Nâng Cấp Lên CentOS Stream 8 (Giải Pháp Chính Thức Từ Red Hat)
Việc sử dụng kho vault.centos.org chỉ là giải pháp tạm thời vì kho Vault không còn nhận được các bản vá bảo mật mới. Red Hat khuyến nghị người dùng chuyển đổi từ CentOS 8 Linux sang CentOS Stream 8 – bản phân phối dạng rolling-release liên tục được cập nhật.
Các bước thực hiện chuyển đổi như sau:
- Sửa lỗi repo bằng Cách 1 trước: Bạn cần chạy được lệnh
dnfthì mới có thể cài đặt gói chuyển đổi sang CentOS Stream. - Cài đặt gói release của CentOS Stream:
dnf install centos-release-stream -y - Chuyển đổi repo từ CentOS Linux sang CentOS Stream:
dnf swap centos-linux-repos centos-stream-repos -y - Đồng bộ hóa toàn bộ danh mục gói tin hệ thống:
dnf distro-sync -y - Xác nhận phiên bản hệ điều hành mới:
cat /etc/os-release
Sau khi quá trình đồng bộ hoàn tất, máy chủ của bạn đã chạy trên CentOS Stream 8 và sẽ tiếp tục nhận được các bản cập nhật phần mềm mới từ Red Hat.
4. Cách 3: Chuyển Sang AlmaLinux 8 Hoặc Rocky Linux 8 (Dành Cho Môi Trường Production)
Nếu bạn cần một hệ điều hành ổn định, mã nguồn mở, hoàn toàn tương thích nhị phân 1:1 với RHEL (Red Hat Enterprise Linux) và có thời gian hỗ trợ dài hạn (đến năm 2029), chuyển đổi sang AlmaLinux hoặc Rocky Linux là sự lựa chọn hàng đầu cho các máy chủ doanh nghiệp (Production Server).
Chuyển đổi tự động sang AlmaLinux 8
AlmaLinux cung cấp một kịch bản (script) chuyển đổi tự động cực kỳ an toàn mà không làm mất dữ liệu của bạn:
curl -O https://raw.githubusercontent.com/AlmaLinux/almalinux-deploy/master/almalinux-deploy.sh
sudo bash almalinux-deploy.sh
Sau khi script chạy xong, bạn chỉ cần khởi động lại máy chủ bằng lệnh reboot.
Chuyển đổi tự động sang Rocky Linux 8
Tương tự, dự án Rocky Linux được thành lập bởi chính nhà sáng lập CentOS cũng cung cấp công cụ chuyển đổi migrate2rocky:
curl -O https://raw.githubusercontent.com/rocky-linux/rocky-tools/main/migrate2rocky/migrate2rocky.sh
chmod +x migrate2rocky.sh
sudo ./migrate2rocky.sh -r
Khởi động lại hệ thống sau khi quá trình di cư hoàn tất:
reboot
5. Kiểm Tra Tường Lửa, DNS Và Cache DNF (Dành Cho Các Bản Phân Phối Khác)
Nếu bạn gặp phải lỗi này trên Rocky Linux, AlmaLinux, RHEL 8/9 hoặc các hệ thống chưa EOL, nguyên nhân thường không phải do kho bị đóng mà xuất phát từ sự cố mạng nội bộ.
1. Xóa toàn bộ bộ nhớ đệm DNF bị hỏng
Đôi khi metadata tải về dở dang khiến DNF bị lỗi cache. Hãy xóa thư mục cache thủ công:
sudo rm -rf /var/cache/dnf
sudo dnf clean all
sudo dnf makecache
2. Kiểm tra cấu hình DNS Resolvers
Thử kiểm tra xem máy chủ của bạn có thể phân giải tên miền của kho lưu trữ hay không bằng cách gõ:
ping -c 4 vault.centos.org
ping -c 4 repo.almalinux.org
Nếu nhận được thông báo “Name or service not known”, hãy chỉnh sửa tệp /etc/resolv.conf và thêm DNS công cộng của Google hoặc Cloudflare:
nameserver 8.8.8.8
nameserver 1.1.1.1
3. Kiểm tra Firewall và Proxy
Đảm bảo rằng tường lửa của bạn không chặn các cổng outbound HTTP (80) và HTTPS (443). Nếu máy chủ của bạn nằm sau một HTTP Proxy, hãy đảm bảo bạn đã khai báo cấu hình proxy trong tệp /etc/dnf/dnf.conf:
proxy=http://your-proxy-server:port
6. Lời Khuyên Và Best Practices Cho Quản Trị Viên Hệ Thống
Để tránh gặp phải các gián đoạn không đáng có trong quá trình vận hành hệ thống thông tin, các quản trị viên cần lưu ý các nguyên tắc quan trọng sau:
- Nắm rõ vòng đời (Lifecycle) của Hệ điều hành: Cần theo dõi thời điểm EOL của các bản phân phối Linux đang sử dụng để có kế hoạch nâng cấp hoặc di dời trước từ 3 – 6 tháng.
- Luôn Backup trước khi thao tác lệnh hệ thống: Trước khi chạy các lệnh can thiệp sâu như
sedvào tệp repo hoặc chạy script chuyển đổi phân phối (distro-sync), hãy đảm bảo bạn đã chụp Snapshot (VMSnapshot) hoặc sao lưu dữ liệu quan trọng. - Sử dụng Repository Mirror Nội Bộ (Local Mirror): Đối với các doanh nghiệp sở hữu hạ tầng lớn, việc dựng máy chủ Nexus hoặc Uyuni để lưu trữ mirror nội bộ giúp đảm bảo tính chủ động, tốc độ tải gói cực nhanh và không phụ thuộc vào internet bên ngoài.
Tổng Kết
Lỗi “Failed to download metadata for repo AppStream” là kết quả trực tiếp của việc CentOS 8 kết thúc vòng đời hỗ trợ. Giải pháp nhanh nhất là đổi đường dẫn repo sang vault.centos.org bằng lệnh sed. Tuy nhiên, về mặt dài hạn, chuyển đổi sang CentOS Stream, AlmaLinux, hoặc Rocky Linux mới là giải pháp căn cơ để hệ thống luôn đảm bảo an toàn thông tin và nhận được các bản vá lỗi mới nhất.
Các Câu Hỏi Thường Gặp (FAQs)
1. Tại sao kho AppStream lại quan trọng đối với CentOS/RHEL 8?
Trong kiến trúc của RHEL/CentOS 8 trở lên, hệ thống chia kho lưu trữ thành 2 phần chính: BaseOS (chứa các gói lõi của hệ điều hành) và AppStream (chứa các công cụ phát triển, cơ sở dữ liệu, web server, ngôn ngữ lập trình). Nếu kho AppStream bị lỗi, bạn sẽ không thể cài đặt hầu hết các ứng dụng phổ biến như Nginx, MySQL, PHP, Python…
2. Sử dụng kho vault.centos.org có an toàn cho hệ thống Production không?
Không hoàn toàn an toàn. Kho Vault chỉ lưu giữ các bản cập nhật tính đến thời điểm CentOS 8 bị khai tử. Nó sẽ không bao giờ nhận được thêm các bản vá lỗ hổng bảo mật (CVE) mới. Do đó, chạy máy chủ Production trên kho Vault sẽ khiến hệ thống đối mặt với nhiều nguy cơ bị tấn công.
3. Việc chuyển đổi từ CentOS 8 sang AlmaLinux hoặc Rocky Linux có làm mất dữ liệu không?
Các script di chuyển chính thức (như almalinux-deploy hay migrate2rocky) được thiết kế để chỉ thay thế các gói tin thuộc về hệ điều hành và giữ nguyên toàn bộ dữ liệu người dùng, tệp cấu hình và cơ sở dữ liệu. Tuy nhiên, quy tắc an toàn tuyệt đối là luôn thực hiện Backup/Snapshot trước khi chạy script chuyển đổi.
4. Tôi có cần khởi động lại máy chủ sau khi sửa xong lỗi DNF không?
Nếu bạn chỉ dùng lệnh sed để sửa lại kho URL trong /etc/yum.repos.d/, bạn không cần khởi động lại máy chủ. Tuy nhiên, nếu bạn thực hiện nâng cấp OS (distro-sync) sang CentOS Stream, Rocky Linux hoặc AlmaLinux, bạn nên khởi động lại để hệ thống nạp Kernel mới nhất.