Tăng tốc Update Fedora: Tự xây Local DNF Mirror để ‘cứu’ băng thông và thời gian

Fedora tutorial - IT technology blog
Fedora tutorial - IT technology blog

Cơn ác mộng băng thông lúc 2 giờ sáng

Hãy tưởng tượng bạn đang trực hệ thống lúc 2 giờ sáng. Bạn cần triển khai gấp một cụm Kubernetes hoặc vá lỗi bảo mật cho 20 server Fedora. Đúng lúc này, đường truyền quốc tế bỗng dưng “dở chứng”. Nhìn thanh loading của dnf update nhích từng KB/s trên hàng chục máy chủ cùng lúc thực sự là một bài kiểm tra lòng kiên nhẫn.

Sau 2 năm dùng Fedora làm máy chính, mình cực kỳ hài lòng với hệ sinh thái này. Tuy nhiên, việc để mỗi máy chủ tự ra ngoài internet kéo hàng GB dữ liệu là một sự lãng phí tài nguyên khủng khiếp. Một Local DNF Mirror sẽ giải quyết triệt để vấn đề này. Nó giúp bạn tận dụng tối đa băng thông nội bộ, đạt mức 1Gbps hoặc thậm chí 10Gbps tùy vào hạ tầng mạng của bạn.

Chuẩn bị hạ tầng: Đừng để hết ổ cứng giữa chừng

Trước khi gõ lệnh, hãy chọn một server (vật lý hoặc VM) có dung lượng lưu trữ dư dả. Fedora Repository khá nặng và sẽ phình to theo thời gian.

  • Hệ điều hành: Fedora Server 40 (hoặc bản mới nhất).
  • Dung lượng: Tối thiểu 200GB cho bản Release và Updates. Nếu định mirror cả kho Everything hay Debuginfo, bạn sẽ cần tới hàng TB.
  • Công cụ: dnf-utilscreaterepo_c.

Bắt đầu bằng việc cài đặt các gói hỗ trợ đồng bộ và web server:

sudo dnf install dnf-utils createrepo_c nginx -y

Bước 1: Quy hoạch thư mục lưu trữ

Mình thường mount một ổ cứng riêng vào /repo. Cách này giúp tách biệt dữ liệu repo với phân vùng hệ thống, tránh rủi ro treo máy khi ổ cứng đầy.

sudo mkdir -p /repo/fedora/releases/40/Everything/x86_64/os/
sudo mkdir -p /repo/fedora/updates/40/Everything/x86_64/

Mẹo: Hãy thay số 40 bằng phiên bản Fedora bạn đang triển khai thực tế.

Bước 2: Đồng bộ dữ liệu với Reposync

Đây là công đoạn ngốn thời gian nhất trong lần đầu thiết lập. Chúng ta sẽ dùng reposync để kéo toàn bộ package từ các mirror chính thức về máy. Khác với dnf thông thường, reposync sẽ tải về bản sao nguyên bản để xây dựng kho lưu trữ nội bộ.

Đồng bộ repo fedora (bản release gốc):

sudo reposync --repoid=fedora --download-metadata --p=/repo/fedora/releases/40/Everything/x86_64/os/

Đồng bộ repo updates (các bản vá mới nhất):

sudo reposync --repoid=updates --download-metadata --p=/repo/fedora/updates/40/Everything/x86_64/

Lưu ý quan trọng: Quá trình tải hàng chục GB dữ liệu rất dễ bị ngắt quãng. Bạn nên chạy lệnh trong tmux hoặc screen để duy trì phiên làm việc nếu chẳng may rớt kết nối SSH.

Bước 3: Khởi tạo Metadata bằng Createrepo

Sau khi tải xong các file .rpm, máy client vẫn chưa thể sử dụng nếu thiếu metadata. Chúng ta cần dùng createrepo_c để tạo các file chỉ mục. Công cụ này viết bằng C nên tốc độ xử lý nhanh hơn nhiều so với bản Python cũ.

sudo createrepo_c /repo/fedora/releases/40/Everything/x86_64/os/
sudo createrepo_c /repo/fedora/updates/40/Everything/x86_64/

Bước 4: Cấu hình Nginx làm “trạm phát”

Để các máy client có thể truy cập repo qua HTTP, Nginx là lựa chọn hàng đầu nhờ sự gọn nhẹ.

Tạo file cấu hình mới tại /etc/nginx/conf.d/repo.conf:

server {
    listen       80;
    server_name  repo.lab.local;
    root         /repo;

    location / {
        autoindex on; 
        allow all;
    }
}

Đừng quên phân quyền để Nginx có thể đọc dữ liệu và cấu hình SELinux cho phép dịch vụ web hoạt động:

sudo chown -R nginx:nginx /repo
sudo chmod -R 755 /repo
sudo setsebool -P httpd_enable_homedirs on
sudo chcon -Rt httpd_sys_content_t /repo

Kích hoạt dịch vụ và mở firewall:

sudo systemctl enable --now nginx
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --reload

Bước 5: Trỏ máy Client về Local Mirror

Giờ là lúc tận hưởng thành quả. Trên các máy Fedora trong mạng LAN, bạn hãy tạm ẩn các repo mặc định và trỏ về server nội bộ.

Dọn dẹp các file cũ:

sudo mkdir /etc/yum.repos.d/backup
sudo mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/

Tạo file /etc/yum.repos.d/local-fedora.repo với nội dung:

[local-fedora]
name=Fedora $releasever - Local
baseurl=http://repo.lab.local/fedora/releases/$releasever/Everything/$basearch/os/
enabled=1
gpgcheck=0

[local-updates]
name=Fedora $releasever - Updates - Local
baseurl=http://repo.lab.local/fedora/updates/$releasever/Everything/$basearch/
enabled=1
gpgcheck=0

Kiểm tra tốc độ bằng lệnh:

sudo dnf clean all && sudo dnf makecache
sudo dnf update

Bạn sẽ thấy tốc độ tải package giờ đây chỉ phụ thuộc vào giới hạn của card mạng nội bộ.

Tự động hóa cập nhật mỗi ngày

Dữ liệu repo sẽ nhanh chóng lỗi thời nếu không được cập nhật thường xuyên. Hãy tạo một script nhỏ chạy lúc 3 giờ sáng để tự động đồng bộ các bản vá mới nhất.

Tạo script /usr/local/bin/sync-repo.sh:

#!/bin/bash
# Chỉ tải các package mới nhất để tiết kiệm dung lượng
reposync --repoid=updates --download-metadata --p=/repo/fedora/updates/40/Everything/x86_64/ --newest-only
createrepo_c --update /repo/fedora/updates/40/Everything/x86_64/

Cài đặt Cronjob để script tự chạy:

0 3 * * * /usr/local/bin/sync-repo.sh > /var/log/repo-sync.log 2>&1

Vài dòng cuối

Dựng Local DNF Mirror ban đầu có vẻ tốn thời gian, nhưng nó là khoản đầu tư xứng đáng cho bất kỳ ai quản trị hệ thống nhiều máy chủ. Bạn sẽ không còn phải lo lắng mỗi khi cáp quang gặp sự cố hay ngồi chờ hàng giờ để update một cụm server. Nếu bạn đang quản lý từ 5 máy Fedora trở lên, hãy thử triển khai ngay hôm nay.

Share: