Dựng Local Yum/DNF Repository: Giải pháp ‘cứu cánh’ khi mạng chậm hoặc Offline

CentOS tutorial - IT technology blog
CentOS tutorial - IT technology blog

Chuyện cái kho phần mềm và những lần “vật vã” vì mạng chậm

Ngày đầu đi làm, mình từng được giao triển khai cụm 50 server CentOS 7 cho một ngân hàng. Ngặt nỗi, khu vực Lab bị cô lập hoàn toàn với internet để bảo mật. Lúc đó, việc cài một công cụ đơn giản như htop hay vim cũng trở thành cực hình. Mình phải copy từng file RPM lẻ tẻ rồi ngồi gỡ mớ bòng bong phụ thuộc (dependencies) bằng tay suốt cả ngày.

Sau đợt “ăn hành” đó, mình nhận ra Local Repository (kho phần mềm nội bộ) là thứ không thể thiếu. Thay vì chờ tải từ mirror quốc tế với tốc độ vài MB/s, bạn có thể kéo gói qua mạng LAN 1Gbps hoặc 10Gbps. Tốc độ cài đặt lúc này gần như tức thời. Quan trọng hơn, nó đảm bảo mọi server trong hệ thống đều dùng chung một phiên bản phần mềm nhất định.

Dưới đây là quy trình mình thường dùng để dựng kho Repo cho CentOS, Rocky Linux hoặc AlmaLinux.

Quick Start: Tạo Local Repo từ folder có sẵn trong 5 phút

Nếu bạn đã có sẵn một mớ file .rpm trong máy và muốn biến chúng thành một kho mà yum hoặc dnf có thể hiểu được, hãy làm theo các bước sau:

  1. Cài đặt công cụ khởi tạo:
sudo yum install createrepo -y
  1. Chuẩn bị thư mục: Giả sử mình để gói tại /opt/my-local-repo.
sudo mkdir -p /opt/my-local-repo
# Copy các file .rpm vào đây
sudo cp /path/to/your/packages/*.rpm /opt/my-local-repo/
  1. Tạo Metadata cho Repo:
sudo createrepo /opt/my-local-repo/
  1. Khai báo với hệ thống: Bạn tạo một file cấu hình mới để Yum nhận diện kho này.
sudo vi /etc/yum.repos.d/local.repo

Dán nội dung sau vào file:

[local-repo]
name=My Local Repository
baseurl=file:///opt/my-local-repo/
enabled=1
gpgcheck=0

Bây giờ, bạn có thể dùng yum install thoải mái mà không cần internet.

Tại sao các hệ thống lớn luôn dùng Local Repository?

Cách làm nhanh phía trên chỉ có tác dụng trên chính máy đó. Trong thực tế, mình luôn dựng một server đóng vai trò “thủ kho” cho toàn bộ hạ tầng. Giải pháp này giúp xử lý ba vấn đề nhức nhối:

  • Tiết kiệm băng thông: Chỉ một máy cần ra internet tải bản cập nhật. 100 máy còn lại sẽ lấy dữ liệu trực tiếp từ máy thủ kho này qua mạng nội bộ.
  • Kiểm soát phiên bản: Bạn sẽ tránh được thảm họa ứng dụng bị lỗi do tự động cập nhật lên version mới không tương thích.
  • Môi trường Air-gapped: Đây là tiêu chuẩn bắt buộc cho các hệ thống tài chính hoặc nhà nước, nơi server tuyệt đối không được kết nối ra ngoài.

Khi hỗ trợ các team chuyển đổi từ CentOS 7 sang AlmaLinux, việc dùng Repo nội bộ đã giúp mình giảm tới 70% thời gian chờ đợi tải package.

Triển khai Local Repo qua HTTP với Nginx

Để các máy con trong mạng LAN truy cập được, chúng ta sẽ dùng Nginx để chia sẻ thư mục repo.

Bước 1: Cài đặt và cấu hình Nginx

sudo yum install nginx -y
sudo systemctl enable --now nginx

Tạo một file cấu hình server block để phục vụ file:

sudo vi /etc/nginx/conf.d/repo.conf
server {
    listen       80;
    server_name  repo.local;
    root         /var/www/html/repos;

    location / {
        autoindex on; # Hiển thị danh sách file
        allow all;
    }
}

Bước 2: Tổ chức kho khoa học

Kinh nghiệm của mình là nên chia thư mục theo hệ điều hành và phiên bản:

sudo mkdir -p /var/www/html/repos/centos/7/os/x86_64/
sudo createrepo /var/www/html/repos/centos/7/os/x86_64/

Cấp quyền cho Nginx để tránh lỗi truy cập:

sudo chown -R nginx:nginx /var/www/html/repos
sudo chmod -R 755 /var/www/html/repos

Bước 3: Cấu hình phía Client

Trên các máy trạm, bạn trỏ file repo về địa chỉ IP của server vừa dựng:

[internal-repo]
name=Internal Central Repo
baseurl=http://192.168.1.100/centos/7/os/x86_64/
enabled=1
gpgcheck=0
priority=1

Đồng bộ (Sync) dữ liệu từ Mirror chính thức

Việc tải thủ công từng file RPM rất mất thời gian. Để tạo một bản mirror đầy đủ, bạn hãy dùng công cụ reposync trong gói yum-utils.

Ví dụ, để kéo toàn bộ kho base của CentOS 7 về máy:

sudo yum install yum-utils -y
sudo reposync -r base -p /var/www/html/repos/centos/7/os/x86_64/ --download-metadata

Lưu ý: Một kho repo đầy đủ có thể nặng từ 10GB đến hơn 50GB. Hãy kiểm tra dung lượng ổ cứng trước khi chạy lệnh này.

Mẹo nhỏ để vận hành trơn tru

Trong quá trình làm, mình đúc kết được vài lưu ý để bạn tránh mất thời gian xử lý lỗi:

  • Cập nhật Metadata: Mỗi khi thêm file .rpm mới, bạn bắt buộc phải chạy createrepo --update /path/to/repo. Nếu thiếu bước này, máy con sẽ không thấy gói mới dù file đã nằm trong thư mục.
  • Xóa Cache: Nếu máy con báo không tìm thấy gói, hãy thử lệnh yum clean all && yum makecache.
  • SELinux: Nếu Nginx báo lỗi 403, khả năng cao do SELinux chặn. Hãy cấp quyền cho thư mục bằng lệnh: chcon -Rt httpd_sys_content_t /var/www/html/repos.
  • Firewall: Luôn nhớ mở port 80: firewall-cmd --permanent --add-service=http && firewall-cmd --reload.

Xây dựng một Repository nội bộ không khó nhưng cực kỳ đáng giá. Nếu bạn quản lý từ 5 server trở lên, hãy dựng ngay một con Local Repo. Nó sẽ giúp bạn xử lý sự cố nhanh hơn nhiều khi mạng quốc tế gặp trục trặc hoặc cần rollback phần mềm trong đêm.

Share: